web-dev-qa-db-ja.com

SQL Express接続文字列:アプリケーションの場所に相対的なmdfファイルの場所

C#の単体テストプロジェクトの一部としてSQL Expressデータベースを使用しています。私のデータベースはここにあります:

./Databases/MyUnitTestDB.mdf

接続文字列を次のように定義するのではなく、app.configで相対パスまたは変数を使用したいと思います。

AttachDbFilename=C:\blah\blah\blah\yea\yea\yea\MyApplication\Databases\MyUnitTestDB.mdf 

|DataDirectory|の使用を見てきましたが、これはWebアプリケーションにのみ適用できると思うのは正しいですか?

本番環境ではホストされたSQLデータベースを使用するため、アプリケーション構成ファイルでこれを制御します。

44
Adam Jenkin

みんなありがとう、私はあなたの応答の組み合わせを使用しました。

私の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 ...
}
64
Adam Jenkin

はい、| 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.StartupPath-アプリケーションを開始するexeアプリケーションの開始パス
  • 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

12
Dubas

私はこれを終わらせるために丸一日グーグルを費やし、最終的に 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);
}

enter image description here

8
nonetaku

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によって認識されません。

4
Wasted_Coder

私はここにVisual Studioを持っていませんが、どうですか:

using System.IO;
using System.Windows.Forms;

string appPath = Path.GetDirectoryName(Application.ExecutablePath);
AttachDBFilme = appPath + "\\MyUnitTestDB.mdf"
2
João Pereira

私は次のことをしました。うまくいけば誰かの助けになります。

AppDomain.CurrentDomain.SetData("DataDirectory", System.IO.Path.GetFullPath(AppDomain.CurrentDomain.BaseDirectory + "../../App_Data"));
1
cgatian

SQL Server接続の動的パス

SqlConnection  con="Server=.\SQLExpress;AttachDbFilename=|DataDirectory|\MyDatabase.mdf;Database=MyDatabaseForTesting;Trusted_Connection=Yes;" ;
0
Mohit Kotak