【问题标题】:change connection string in class application at runtime?在运行时更改类应用程序中的连接字符串?
【发布时间】:2011-08-21 04:15:40
【问题描述】:

我有使用 ado.net 连接到 Sqlite 数据库的类应用程序。应用程序使用 db 来存储一些数据,并且 db 可能会在运行时更改。用户可以备份数据库并更改位置,但在这种情况下,我需要知道如何更改连接字符串。 我试过这段代码,但没有用:

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")

【问题讨论】:

    标签: c# sqlite ado.net


    【解决方案1】:

    错误的行序,应该是:

        @""" +
        @"Data Source=" +
    

    【讨论】:

    • 现在他给了我另一个错误关键字不支持:'数据源'。我换个问题
    【解决方案2】:

    我真的很惊讶连接字符串能正常工作。另外,使用 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 and 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))
    {
        ...
    }
    

    【讨论】:

    • 同样的错误,但此时 var connectionStringBuilder = new EntityConnectionStringBuilder(originalConnectionString);
    • @Khalid Omar - 你确认你可以手动使用你的连接字符串了吗?即,启动一个小项目并插入您的连接字符串以连接到您的数据库?
    • 是的,我手动使用它,如果 app.config 中的旧连接字符串在我更改 connstr 时应用程序运行正常,则可以
    • @Khalid Omar - 你试过我上面添加的链接中的代码吗?
    【解决方案3】:

    我写了它,它对我有用

    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 中的实体模型

    【讨论】:

      猜你喜欢
      • 2010-10-01
      • 1970-01-01
      • 2017-11-17
      • 1970-01-01
      • 2019-04-02
      • 1970-01-01
      • 1970-01-01
      • 2012-04-30
      • 1970-01-01
      相关资源
      最近更新 更多