изменить строку подключения в приложении класса во время выполнения? - PullRequest
2 голосов
/ 08 мая 2011

У меня есть приложение класса, которое использует ado.net для подключения к базе данных Sqlite.Приложение использует базу данных для хранения некоторых данных, и база данных может быть изменена во время выполнения.Пользователь может сделать резервные копии БД и изменить местоположение, но в этом случае мне нужно знать, как изменить строку подключения.Я пробовал этот код, но он не работал:

string conn =
    @"metadata=res://*/KzDm.csdl|res://*/KzDm.ssdl|res://*/KzDm.msl;" +
    @"provider=System.Data.SQLite;" +
    @"provider connection string=" +
    @""" +@"Data Source=" +
    @"F:\My Own programs\KrarZara2\KZ\KZ\Kzdb.s3db" +
    @""";

Entities ent = new
Entities(conn);

эта ошибка «Ключевое слово не поддерживается:« источник данных ».»случиться на этой линии

 public Entities(string connectionString) : base(connectionString, "Entities")

Ответы [ 3 ]

1 голос
/ 09 мая 2011

Я пишу это, и это работает со мной

EntityConnectionStringBuilder conn = new EntityConnectionStringBuilder();
        conn.Metadata = @"res://*/KzDm.csdl|res://*/KzDm.ssdl|res://*/KzDm.msl";
        conn.Provider = "System.Data.SQLite";
        conn.ProviderConnectionString = @"data source=F:\My Own programs\KrarZara2\KZ\KZ\KrarDS.krar;Version=3;";
        EntityConnection entity = new EntityConnection(conn.ConnectionString);
        using (DmEnt ent = new DmEnt(entity))
        {
            var parcel = ent.Parcels.SingleOrDefault(d => d.id == 1);
            var pparcc = ent.Parcels.Select(d => d.id == 2);
            Parcel r = new Parcel();
            r.ParcelNumber = "11ju";
            r.Area = 8787;

            ent.AddToParcels(r);
            ent.SaveChanges();
        }

Dm ent - модель сущностей в edmx ado.net

0 голосов
/ 08 мая 2011

Я действительно удивился, что строка подключения работает вообще. Кроме того, было бы проще использовать string.Format для построения этой строки подключения:

var filename = @"F:\My Own programs\KrarZara2\KZ\KZ\Kzdb.s3db";
var connString = string.Format("Data Source={0};UseUTF16Encoding=True;", filename );

using( var conn = new SQLiteConnection( connString ) )
{
    ...
}

Во-первых, вы должны заменить UseUTF16Encoding правильным значением для вашей настройки. Во-вторых, обратите внимание, что путь к файлу в строке подключения не заключен в кавычки.


Если вы ищете способ обмена файлами данных Sqlite во время выполнения, вы можете посмотреть эту запись в блоге:

SQLite и Entity Framework 4

Резюме решения состоит в том, чтобы проанализировать строку подключения платформы Entity, изменить файл данных и затем сбросить его:

public static string RedirectedEntityFrameworkConnectionString(string originalConnectionString, string databaseFile, string password)
{
    // Parse the Entity Framework connection string.
    var connectionStringBuilder = new EntityConnectionStringBuilder(originalConnectionString);
    if (connectionStringBuilder.Provider != "System.Data.SQLite")
    {
        throw new ArgumentException("Entity Framework connection string does not use System.Data.SQLite provider.");
    }

    // Parse the underlying provider (SQLite) connection string.
    var providerConnectionStringBuilder = new SQLiteConnectionStringBuilder(connectionStringBuilder.ProviderConnectionString);

    // Redirect to the specified database file, and apply encryption.
    providerConnectionStringBuilder.DataSource = databaseFile;
    providerConnectionStringBuilder.Password = password;

    // Rebuild the Entity Framework connection string.
    connectionStringBuilder.ProviderConnectionString = providerConnectionStringBuilder.ConnectionString;
    return connectionStringBuilder.ConnectionString;
}

Чтобы использовать, вы должны сделать что-то вроде:

const string OriginalConnectionString = "..."; // (Copy out of app.config)
var connectionString = RedirectedEntityFrameworkConnectionString(OriginalConnectionString, myFileName, null);
using (var context = new MyEntities(connectionString))
{
    ...
}
0 голосов
/ 08 мая 2011

неправильный порядок строк, должен быть:

    @""" +
    @"Data Source=" +
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...