Создание строки подключения с относительным путем для доступа к базе данных SQLite в c # - PullRequest
0 голосов
/ 02 августа 2011

В настоящее время я работаю в 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");

Создано инфраструктурой 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 ]

2 голосов
/ 02 августа 2011

Возможно, вы захотите использовать класс EntityConnectionStringBuilder

, который упростит хотя бы изоляцию строки подключения до части 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);
0 голосов
/ 02 августа 2011

Проблема не в относительном, а в абсолютном пути, а в том, что вы пытаетесь записать в каталог приложения, который запрещен более новой версией Windows по соображениям безопасности ...

Так что это больше проблема разрешения/ rights - в зависимости от вашей ОС (то есть Windows 7 ...) и пользователя, с которым вы запускаете приложение (ia Administrator?) по соображениям безопасности, вам не разрешено писать в каталог приложения ... если вам нужно где-нибудь с read+ напишите, что вы должны использовать http://msdn.microsoft.com/de-de/library/system.windows.forms.application.userappdatapath.aspx

Просто проверьте, находится ли БД в этом пути - если не скопируйте его туда - и используйте его там ...

Другие местоположения могут быть ApplicationData / CommonApplicationData/ LocalApplicationData от http://msdn.microsoft.com/de-de/library/14tx8hby.aspx и http://msdn.microsoft.com/de-de/library/system.environment.specialfolder.aspx

...