2009-12-02 29 views
30

Cargo datos de la base de datos sdf en la aplicación winforms. Uso la ruta completa al archivo de la base de datos. Ejemplo:Cadena de conexión con ruta relativa al archivo de base de datos

conn = new SqlCeConnection 

{ 

ConnectionString ="Data Source=F:\\My Documents\\Project1\\bin\\Debug\\Database.sdf" 

}; 

Me gustaría utilizar una ruta de acceso relativa al archivo de la base de datos. Por ejemplo. Tengo un archivo sdf en la carpeta F: \ Mis documentos \ Proyecto1 \ bin \ Debug \ Data \ file.sdf y quiero utilizar la ruta relativa en la cadena de conexión. ¿Algún consejo? Gracias.

+0

¿Estás seguro de que tienes una ruta relativa? lo que escribió "F: \ Mis documentos \ Proyecto1 \ bin \ Debug \ Data \ file.sdf" también es una ruta completa. Una ruta relativa sería algo así como "\ data \ file.sdf" si su aplicación ya se estaba ejecutando desde "F: \ My Documents \ Project1 \ bin \" – Jrud

Respuesta

4

En relación a qué, ¿cuál es su aplicación? Si es así, entonces puede simplemente obtener las aplicaciones camino actual con:

System.Environment.CurrentDirectory 

y añadirlo a la cadena de conexión

+4

No puede simplemente "agregarla a la cadena de conexión". Tendría que analizar la cadena de conexión, extraer el valor del origen de datos, anteponer el directorio actual y luego reconstruir la cadena de conexión. Esto no es trivial. –

75

ruta relativa:

ConnectionString = "Data Source=|DataDirectory|\Database.sdf"; 

Modificación DataDirectory como la ruta de ejecutables:

string executable = System.Reflection.Assembly.GetExecutingAssembly().Location; 
string path = (System.IO.Path.GetDirectoryName(executable)); 
AppDomain.CurrentDomain.SetData("DataDirectory", path); 
+1

Debe marcarse como respuesta. ¿Eso es algo que los administradores pueden hacer? –

+1

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

0

¿Podría intentar con el siguiente bloque de código, que es exactamente lo que buscas? ng para:

SqlConnection conn = new SqlConnection 
{ 
    ConnectionString = "Data Source=" + System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase) + "\\Database.sdf" 
}; 
0

Esto funcionó para mí:

string Connection = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source="+HttpContext.Current.Server.MapPath("\\myPath\\myFile.db")+";Extended Properties=\"Excel 12.0 Xml;HDR=YES\"";

estoy consultar un archivo XLSX así que no preocuparse por ninguna de las otras cosas en la cadena de conexión, pero el origen de datos .

Así HttpContext.Current.Server.MapPath("\\myPath\\myFile.db") es la respuesta.

4

Pruebe este código para el directorio de trabajo si el archivo de la base de datos existe como a continuación.

D: \ HMProject \ Database \ HMProject.sdf

string Path = Environment.CurrentDirectory; 
string[] appPath = Path.Split(new string[] { "bin" }, StringSplitOptions.None); 
AppDomain.CurrentDomain.SetData("DataDirectory", appPath[0]); 

cadena de conexión para .sdf archivo

<add name="LocalDB" connectionString="metadata=res://*/Client.HMProject.csdl|res://*/Client.HMProject.ssdl|res://*/Client.HMProject.msl;provider=System.Data.SqlServerCe.4.0;provider connection string=&quot;Data Source=|DataDirectory|\Database\HMProjectDB.sdf;Password=HMProject;Persist Security Info=False;&quot;" providerName="System.Data.EntityClient" />

Gracias

ck.Nitin (TinTin)

2

Después de varios errores extraños con rutas relativas en connectionstring sentí la necesidad de publicar esto aquí.

Cuando se utiliza "| DataDirectory |" o "~" no puede subir ni bajar usando "../"!

ejemplo es utilizar varios proyectos de acceso el mismo archivo LocalDB colocado en uno de los proyectos.

"~ /../ otro" y "| DataDirectory | /../ otra" fallará

Incluso si está claramente escrito at MSDN here los errores se dio en un poco claro tan difícil encontrar y no pude encontrarlo aquí en SO.

1
<?xml version="1.0"?> 
<configuration> 
    <appSettings> 
    <!--FailIfMissing=false --> 
    <add key="DbSQLite" value="data source=|DataDirectory|DB.db3;Pooling=true;FailIfMissing=false"/> 
    </appSettings> 
</configuration> 
+3

no guarde la conexión cadenas en . Ellos tienen su propia sección. – slfan

0

En su archivo de configuración dan la ruta relativa

ConnectionString = "Data Source=|DataDirectory|\Database.sdf"; 

Cambiar el DataDirectory a su ruta ejecutable

string path = AppDomain.CurrentDomain.BaseDirectory; 
AppDomain.CurrentDomain.SetData("DataDirectory", path); 

Si está utilizando ADO.NET Entity Framework, entonces se puede establecer la ruta de DataDirectory en su clase de contexto

0

Lo hice en el archivo web.config. Añadí a la respuesta de Sobhan, gracias por cierto.

<connectionStrings> 
    <add name="listdb" connectionString="Data Source=|DataDirectory|\db\listdb.sdf"/> 
    </connectionStrings> 

Donde "db" se convierte en mi directorio de la base de datos en lugar de directorio "App_Data".

y abrió normalmente con:

var db = Database.Open ("listdb");

Cuestiones relacionadas