40

Estoy utilizando bases de datos SQL Express como parte de un proyecto de prueba de unidad en C#. Mis bases de datos se encuentra aquí:Cadena de conexión de SQL Express: ubicación del archivo mdf relativa a la ubicación de la aplicación

./Databases/MyUnitTestDB.mdf 

me gustaría utilizar una ruta relativa o variable en el app.config en lugar de tener mi cadena de conexión define como:

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

he visto el uso de |DataDirectory| pero ¿estoy en lo cierto al pensar que esto solo se aplica a las aplicaciones web?

Quiero controlar esto en el archivo de configuración de la aplicación, ya que en producción la aplicación usa una base de datos sql alojada.

Respuesta

58

Gracias a todos, he usado una combinación de sus respuestas.

En mi app.config presentar mi cadena de conexión se define de la siguiente manera

<add name="MyConnectionString" 
    connectionString="Server=.\SQLExpress;AttachDbFilename=|DataDirectory|\MyDatabase.mdf;Database=MyDatabaseForTesting;Trusted_Connection=Yes;" /> 

En mi clase de prueba de unidad que establece la propiedad DataDirectory utilizando la siguiente

[TestInitialize] 
public void TestInitialize() 
{ 
    AppDomain.CurrentDomain.SetData("DataDirectory", System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Databases")); 

    // rest of initialize implementation ... 
} 
+0

Para obtener más información sobre el término ** DataDirectory **: http://msdn.microsoft.com/en-us/library/cc716756.aspx (busque " DataDirectory ", está al final del documento) –

2

no tengo aquí Visual Studio, pero ¿qué pasa:

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

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

Yo sugeriría algo en esa línea, tal vez se utiliza junto con los constructores de cadena de conexión [] de ADO.NET (http://msdn.microsoft.com/en-us/library/ms254947.aspx) para armar la cadena de conexión final. – stakx

12

Sí, | DataDirectory | Aplicación web para seleccionar el directorio App_Data de la aplicación web.

En una aplicación web no, dependiendo de .NET Framework, que podría ser utilizado y también cambió el uso de AppDomain.SetData

Pero si tiene otros dos posiblities para crear la conexión:

1 .- Utilice una ruta relativa:

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

2.- obtener la ruta de la aplicación y agregar a la cadena.
en C# aplicación de Windows que puede utilizar Application.StartupPath

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

Dependiendo del tipo applicaiton o el modo de puesta en marcha que tiene propiedades diferentes. Ej:

  • Application.StartupPath - La ruta de inicio de la aplicación exe que inicia la aplicación
  • Application.ExecutablePath - la ruta de inicio de un nombre de la aplicación exe que las estadísticas de la aplicación Pero para usar la aplicación necesita incluir System.Windows.Forms que no está incluido, por ejemplo, en aplicaciones de consola.

  • System.IO.Path.GetDirectoryName (.. System.Reflection.Assembly.GetExecutingAssembly() GetName() CodeBase) - Esto se pone la trayectoria del conjunto actual "dll, exe, ... "No se ve afectado por el tipo de aplicación, los cambios de ruta, ... Siempre devuelve el directorio cuando reside Assemby.

  • Environment.CurrentDirectory - el directorio actual. Esto se puede cambiar, por ejemplo, si navega en las carpetas.

Puede encontrar más información sobre las diferentes opciones de cadena de conexión aquí http://www.connectionstrings.com/sql-server-2005

+0

Gracias Dubas, la opción 1 es lo que quiero usar, pero no puedo hacerlo funcionar. –

+0

La opción 1 depende de su ruta de ejecución. Si su prueba de UInit se está ejecutando con una ruta diferente que su aplicación, probablemente, el uso de una ruta relativa le da a una ruta diferente que la ruta esperada. – Dubas

+0

+1 Gran respuesta – sohaiby

6

yo hemos pasado un día entero Google para trabajar con esto y finalmente tener una pista de this

Aquí está mi solución:
1. Use | DataDirectory | en la cadena de conexión

<add name="NorthwindConnectionString" connectionString="data source=.\SQLEXPRESS;Integrated Security=SSPI;AttachDbFilename=|DataDirectory|\Northwind.mdf;User Instance=True" providerName="System.Data.SqlClient" /> 

2.Set DataDirectory en 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); 
} 

enter image description here

3

Estoy construyendo una sencilla aplicación de Windows Forms con VS2010 con C# 3.0. También usando SQL Express 2008 RC2.

Puedo usar: |DataDirectory|MyDb.mdf en la cadena de conexión solo sin cambiar nada más. El |DataDirectory| apunta a la ubicación de mi archivo .exe.

Pensaré que esto sería lo primero que intentarían, así que es por eso que estoy especificando mi versión VS y SQL. O tal vez es nuevo para C# 3.0.

Mi completa cadena de conexión:

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

Tenga en cuenta que he añadido una carpeta "App_Data" a mi solicitud, porque estoy acostumbrado a la Db en esa carpeta, la carpeta no es reconocido por VS.

+2

¿Quiso decir" App_Data "en lugar de" App_Code "en la última frase? – Manfred

+0

@Manfred sí, estás en lo cierto! Respuesta editada –

0

ruta dinámica en la conexión de SQL Server

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

hice lo siguiente. Espero que ayude a alguien.

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