C#の単体テストプロジェクトの一部としてSQL Expressデータベースを使用しています。私のデータベースはここにあります:
./Databases/MyUnitTestDB.mdf
接続文字列を次のように定義するのではなく、app.config
で相対パスまたは変数を使用したいと思います。
AttachDbFilename=C:\blah\blah\blah\yea\yea\yea\MyApplication\Databases\MyUnitTestDB.mdf
|DataDirectory|
の使用を見てきましたが、これはWebアプリケーションにのみ適用できると思うのは正しいですか?
本番環境ではホストされたSQLデータベースを使用するため、アプリケーション構成ファイルでこれを制御します。
みんなありがとう、私はあなたの応答の組み合わせを使用しました。
私のapp.configファイルでは、接続文字列は次のように定義されています
<add name="MyConnectionString"
connectionString="Server=.\SQLExpress;AttachDbFilename=|DataDirectory|\MyDatabase.mdf;Database=MyDatabaseForTesting;Trusted_Connection=Yes;" />
単体テストクラスでは、次を使用してDataDirectoryプロパティを設定します
[TestInitialize]
public void TestInitialize()
{
AppDomain.CurrentDomain.SetData("DataDirectory", System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Databases"));
// rest of initialize implementation ...
}
はい、| DataDirectory |Webアプリケーションは、WebアプリケーションのApp_Dataディレクトリを選択します。
非Webアプリケーションでは、.NET Frameworkに応じて、AppDomain.SetDataを使用して使用および変更することもできます。
ただし、接続を作成するには他に2つの可能性があります。
1.-相対パスを使用:
String con ="... AttachDbFilename=Databases\MyUnitTestDB.mdf ... ";
2.-アプリケーションパスを取得し、Stringに追加します。
c#Windowsアプリケーションでは、Application.StartupPathを使用できます
String con= " ... AttachDbFilename=" + Application.StartupPath + "\Databases\MyUnitTestDB.mdf ... ";
アプリケーションのタイプまたは起動モードに応じて、異なるプロパティがあります。例:
Application.ExecutablePath-開始パスアプリケーションを統計するexeアプリケーションの名前ただし、アプリケーションを使用するには、System.Windows.Formsを含める必要がありますたとえば、コンソールアプリケーションには含まれません。
System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly()。GetName()。CodeBase)-これはからパスを取得します現在のアセンブリ "dll、exe、..."は、アプリケーションの種類、パスの変更などの影響を受けません。Assembyが存在する場合は、常にディレクトリを返します。
Environment.CurrentDirectory-現在のディレクトリ。これは、たとえばフォルダに移動した場合に変更できます。
さまざまな接続文字列オプションの詳細については、こちらをご覧ください http://www.connectionstrings.com/sql-server-2005
私はこれを終わらせるために丸一日グーグルを費やし、最終的に this からの手がかりを得ました
私の解決策は次のとおりです。
1。 | DataDirectory |を使用します接続文字列内
<add name="NorthwindConnectionString" connectionString="data source=.\SQLEXPRESS;Integrated Security=SSPI;AttachDbFilename=|DataDirectory|\Northwind.mdf;User Instance=True" providerName="System.Data.SqlClient" />
2. ClassInitializeでDataDirectoryを設定する
[ClassInitialize()]
public static void MyClassInitialize(TestContext testContext)
{
string baseDir = AppDomain.CurrentDomain.BaseDirectory;
int index = baseDir.IndexOf("TestResults");
string dataDir = baseDir.Substring(0, index) + System.Reflection.Assembly.GetExecutingAssembly().GetName().Name;
AppDomain.CurrentDomain.SetData("DataDirectory", dataDir);
}
C#3.0でVS2010を使用して簡単なWindowsフォームアプリを構築しています。また、SQL Express 2008 RC2を使用します。
使用できます:|DataDirectory|MyDb.mdf
は、接続文字列のみで、何も変更しません。 |DataDirectory|
は、私の.exeファイルの場所を指します。
皆さんが最初に試すのはこれだと思うので、VSとSQLのバージョンを指定しているのはそのためです。または、C#3.0の新機能かもしれません。
私の完全な接続文字列:
"Server=.\SQLExpress;AttachDbFilename=|DataDirectory|App_Data\ThumbsUpPlayer.mdf;Database=ThumbsUpPlayer;Trusted_Connection=Yes;"
「App_Data」フォルダーをアプリケーションに追加したことに注意してください。そのフォルダー内のDbに慣れているため、フォルダーはVSによって認識されません。
私はここにVisual Studioを持っていませんが、どうですか:
using System.IO;
using System.Windows.Forms;
string appPath = Path.GetDirectoryName(Application.ExecutablePath);
AttachDBFilme = appPath + "\\MyUnitTestDB.mdf"
私は次のことをしました。うまくいけば誰かの助けになります。
AppDomain.CurrentDomain.SetData("DataDirectory", System.IO.Path.GetFullPath(AppDomain.CurrentDomain.BaseDirectory + "../../App_Data"));
SqlConnection con="Server=.\SQLExpress;AttachDbFilename=|DataDirectory|\MyDatabase.mdf;Database=MyDatabaseForTesting;Trusted_Connection=Yes;" ;