String de conexão do SQL Express: localização do arquivo mdf em relação ao local do aplicativo

Eu estou usando bancos de dados SQL Express como parte de um projeto de teste de unidade em c #. Meus bancos de dados estão localizados aqui:

./Databases/MyUnitTestDB.mdf 

Eu gostaria de usar um caminho relativo ou variável no app.config vez de ter minha seqüência de conexão definida como:

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

Eu vi o uso de |DataDirectory| mas estou correto em pensar que isso é aplicável apenas a aplicativos da web?

Eu quero controlar isso no arquivo de configuração do aplicativo, como na produção, o aplicativo usa um database SQL hospedado.

Obrigado a todos, usei uma combinação de suas respostas.

No meu arquivo app.config, minha string de conexão é definida da seguinte forma

  

Na minha class de teste de unidade eu definir a propriedade DataDirectory usando o seguinte

 [TestInitialize] public void TestInitialize() { AppDomain.CurrentDomain.SetData("DataDirectory", System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Databases")); // rest of initialize implementation ... } 

Sim, | DataDirectory | Aplicativo da Web para selecionar o diretório App_Data do aplicativo da web.

Em um aplicativo não da Web, dependendo do .NET Framework, ele poderia ser usado e também alterado usando AppDomain.SetData

Mas você tem outras duas possibilidades para criar a conexão:

1.- Use um caminho relativo:

 String con ="... AttachDbFilename=Databases\MyUnitTestDB.mdf ... "; 

2.- obter o caminho do aplicativo e adicionar à String .
Em c # Windows Application, você pode usar Application.StartupPath

  String con= " ... AttachDbFilename=" + Application.StartupPath + "\Databases\MyUnitTestDB.mdf ... "; 

Dependendo do tipo de aplicação ou do modo de boot, você tem propriedades diferentes. Ex:

  • Application.StartupPath – O caminho inicial do aplicativo exe que inicia o aplicativo
  • Application.ExecutablePath – o caminho inicial um nome do aplicativo exe que mostra o aplicativo Mas para usar o aplicativo, é necessário include System.Windows.Forms, que não está incluído, por exemplo, nos aplicativos do console.

  • System.IO.Path.GetDirectoryName (System.Reflection.Assembly.GetExecutingAssembly (). GetName (). CodeBase ) – Isso obtém o caminho do assembly atual “dll, exe, …” não é afetado pelo tipo de aplicativo, alterações de caminho, … Sempre retorne o diretório quando a assembly estiver.

  • Environment.CurrentDirectory – o diretório atual. Isso pode ser alterado, por exemplo, se você navegar em pastas.

Você pode encontrar mais sobre as diferentes opções de string de conexão aqui http://www.connectionstrings.com/sql-server-2005

Eu passei um dia inteiro pesquisando isso e finalmente tenho uma pista disso

Aqui está a minha solução:
1. Use | DataDirectory | na cadeia de conexão

  

2.Definir DataDirectory em ClassInitialize

 [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); } 

insira a descrição da imagem aqui

Eu estou construindo um simples Windows Forms App com VS2010 com c # 3.0. Também usando o SQL Express 2008 RC2.

Eu sou capaz de usar: |DataDirectory|MyDb.mdf na seqüência de conexão sozinho sem alterar qualquer outra coisa. O |DataDirectory| aponta para a localização do meu arquivo .exe.

Eu acho que essa seria a primeira coisa que todos tentariam, e é por isso que estou especificando minha versão VS e SQL. Ou talvez seja novo no C # 3.0.

Minha string de conexão completa:

 "Server=.\SQLExpress;AttachDbFilename=|DataDirectory|App_Data\ThumbsUpPlayer.mdf;Database=ThumbsUpPlayer;Trusted_Connection=Yes;" 

Note que eu adicionei uma pasta “App_Data” ao meu aplicativo, porque eu estou acostumado com o Db nessa pasta, a pasta não é reconhecida pelo VS.

Eu não tenho o Visual Studio aqui, mas e sobre:

 using System.IO; using System.Windows.Forms; string appPath = Path.GetDirectoryName(Application.ExecutablePath); AttachDBFilme = appPath + "\\MyUnitTestDB.mdf" 

Caminho Dinâmico na Conexão do SQL Server

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

Eu fiz o seguinte. Espero que ajude alguém.

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