构建相对路径连接字符串以访问c#中的SQLite数据库

时间:2011-08-02 15:39:21

标签: c# sqlite connection-string relative-path

我目前在c#中使用位于应用程序目录中的SQLite数据库文件(data.db3)。在开发过程中,使用了绝对路径,到目前为止工作正常。现在我试图通过使用相对路径来访问数据库,但由于可能错误的连接字符串而失败。以下连接字符串工作正常,由ADO.Net框架自动创建。

<connectionStrings>
<add name="dataEntities" 
 connectionString="metadata=res://*/DataEntities.csdl|res://*/DataEntities.ssdl|res://*/DataEntities.msl;provider=System.Data.SQLite;provider connection string='data source=&quot;C:\Projekte\DataProvider\data.db3&quot;;datetimeformat=Ticks'" 
 providerName="System.Data.EntityClient" />
</connectionStrings>

现在我尝试使用相对路径访问数据库(全部失败):

  1. dataContext = new dataEntities("Data Source=data.db3");
  2. dataContext = new dataEntities("Data Source=.\\data.db3");
  3. dataContext = new dataEntities("Data Source=data.db3;Version=3;DateTimeFormat=Ticks;");
  4. dataContext = new dataEntities("metadata=res://*/DataEntities.csdl|res://*/DataEntities.ssdl|res://*/DataEntities.msl;provider=System.Data.SQLite;provider connection string='data source=&quot;data.db3&quot;;datetimeformat=Ticks'" providerName="System.Data.EntityClient");
  5. 由ADO​​.Net框架创建:

    public partial class dataEntities : ObjectContext
    {
    
        public dataEntities() : base("name=dataEntities", "dataEntities")
        {
            this.ContextOptions.LazyLoadingEnabled = true;
            OnContextCreated();
        }
    
        public dataEntities(string connectionString) : base(connectionString, "dataEntities")
        {
            this.ContextOptions.LazyLoadingEnabled = true;
            OnContextCreated();
        }
    
     /// ……
    

    }

2 个答案:

答案 0 :(得分:2)

您可能需要考虑使用EntityConnectionStringBuilder class

这将简化至少将连接字符串隔离到SQL部分。

string baseFolder = AppDomain.CurrentDomain.BaseDirectory;

string sqlLiteConnectionString = string.Format(
  "data source=\"{0}\";datetimeformat=Ticks", 
  Path.Combine(baseFolder, "data.db3"));

var entityConnectionString = new EntityConnectionStringBuilder
{
  Metadata = "res://*",
  Provider = "System.Data.EntityClient",
  ProviderConnectionString = sqlLiteConnectionString,
}.ConnectionString;

var entities = new dataEntities(entityConnectionString);

答案 1 :(得分:0)

问题不是相对于绝对路径,而是因为出于安全原因,您试图在应用程序目录中写入这一事实,而这是由较新的Windows版本禁止的......

所以这更多是权限/权限的问题 - 取决于您的操作系统(即Windows 7 ...)和运行应用程序的用户(ia管理员?)出于安全原因,您不能在应用程序中写入目录...如果你需要一个有读+写的地方,你应该使用http://msdn.microsoft.com/de-de/library/system.windows.forms.application.userappdatapath.aspx

只需检查数据库是否在该路径中 - 如果不在那里复制 - 并在那里使用它......

其他位置可以是来自http://msdn.microsoft.com/de-de/library/14tx8hby.aspxhttp://msdn.microsoft.com/de-de/library/system.environment.specialfolder.aspx

的ApplicationData / CommonApplicationData / LocalApplicationData