c# - services - Cadena de conexión SQL Express: ubicación del archivo mdf relativa a la ubicación de la aplicación
connection string sql server windows authentication (7)
Ruta dinámica en la conexión de SQL Server
SqlConnection con="Server=./SQLExpress;AttachDbFilename=|DataDirectory|/MyDatabase.mdf;Database=MyDatabaseForTesting;Trusted_Connection=Yes;" ;
Estoy usando bases de datos SQL Express como parte de un proyecto de prueba unitaria en c #. Mis bases de datos se encuentran aquí:
./Databases/MyUnitTestDB.mdf
Me gustaría usar una ruta o variable relativa en el app.config
lugar de tener mi cadena de conexión definida como:
AttachDbFilename=C:/blah/blah/blah/yea/yea/yea/MyApplication/Databases/MyUnitTestDB.mdf
He visto el uso de |DataDirectory|
pero ¿tengo razón 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 la producción la aplicación usa una base de datos sql alojada.
Estoy construyendo una aplicación de Windows Forms simple con VS2010 con C # 3.0. También usando SQL Express 2008 RC2.
Puedo utilizar: |DataDirectory|MyDb.mdf
en la cadena de conexión sola sin cambiar nada más. The |DataDirectory|
señala la ubicación de mi archivo .exe.
Pensaré que esto sería lo primero que probarían todos, así que es por eso que estoy especificando mi versión VS y SQL. O tal vez es nuevo para C # 3.0.
Mi cadena de conexión completa:
"Server=./SQLExpress;AttachDbFilename=|DataDirectory|App_Data/ThumbsUpPlayer.mdf;Database=ThumbsUpPlayer;Trusted_Connection=Yes;"
Tenga en cuenta que he agregado una carpeta "App_Data" a mi aplicación, porque estoy acostumbrado al Db en esa carpeta, la carpeta no es reconocida por VS.
Gracias a todos, utilicé una combinación de tus respuestas.
En mi archivo app.config 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 unitaria establecí la propiedad DataDirectory usando lo siguiente
[TestInitialize]
public void TestInitialize()
{
AppDomain.CurrentDomain.SetData("DataDirectory", System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Databases"));
// rest of initialize implementation ...
}
He pasado todo un día buscando en Google para trabajar en esto y finalmente tengo una pista de this
Aquí está mi solución:
1. Utilice | 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. Configurar 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);
}
Hice lo siguiente. Espero que ayude a alguien.
AppDomain.CurrentDomain.SetData("DataDirectory", System.IO.Path.GetFullPath(AppDomain.CurrentDomain.BaseDirectory + "../../App_Data"));
No tengo Visual Studio aquí, pero ¿qué hay de:
using System.IO;
using System.Windows.Forms;
string appPath = Path.GetDirectoryName(Application.ExecutablePath);
AttachDBFilme = appPath + "//MyUnitTestDB.mdf"
Sí, | DataDirectory | Aplicación web para seleccionar el directorio App_Data de la aplicación web.
En una aplicación que no sea web, según .NET Framework, podría ser utilizada y también modificada usando AppDomain.SetData
Pero tienes otras dos posiblidades para crear la conexión:
1.- Usa una ruta relativa:
String con ="... AttachDbFilename=Databases/MyUnitTestDB.mdf ... ";
2.- obtener la ruta de la aplicación y agregarla a la Cadena .
En la aplicación de Windows c #, puede usar Application.StartupPath
String con= " ... AttachDbFilename=" + Application.StartupPath + "/Databases/MyUnitTestDB.mdf ... ";
Dependiendo del tipo de aplicación o modo de lanzamiento, tienes diferentes propiedades. Ex:
- Application.StartupPath - La ruta de inicio de la aplicación exe que inicia la aplicación
Application.ExecutablePath : la ruta de inicio es un nombre de la aplicación exe que registra la aplicación. Para usar la aplicación, debe incluir System.Windows.Forms que no se incluye, por ejemplo, en las aplicaciones de la consola.
System.IO.Path.GetDirectoryName (System.Reflection.Assembly.GetExecutingAssembly (). GetName (). CodeBase ) - Esto obtiene la ruta del ensamblado actual "dll, exe, ..." No se ve afectado por el tipo de aplicación, cambios de ruta, ... Siempre devuelva el directorio cuando resida 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