动态更新用户输入上的连接字符串

时间:2015-05-22 15:17:27

标签: c# asp.net-mvc entity-framework asp.net-mvc-4

我有10个具有相同架构的数据库(appx.20表)。我正在使用MVC5和Entity Framework 6.我需要根据用户输入在这些数据库之间进行更改。即通过选择与今年相关的年份数据库,需要选择。

我通过使用以下代码操作web.config文件来成功完成此任务:

        public static bool setDBConnectionString(string path)
    {
        try
        {
            string dataSource = @"metadata=res://*/Models.Micropay.Micropay.csdl|res://*/Models.Micropay.Micropay.ssdl|res://*/Models.Micropay.Micropay.msl;provider=VfpEntityFrameworkProvider2;provider connection string='data source=" + path + "'";

            var configuration = WebConfigurationManager.OpenWebConfiguration("~");
            var section = (ConnectionStringsSection)configuration.GetSection("connectionStrings");
            section.ConnectionStrings["connectionStringEntity"].ConnectionString = dataSource;
            configuration.Save(ConfigurationSaveMode.Modified);
            ConfigurationManager.RefreshSection("connectionStrings");
        }
        catch
        {
            return false;
        }
        return true;
    }

但是,这不是基于项目规模和用户数量的最佳解决方案。

我尝试使用以下代码重建连接字符串:

            Debug.WriteLine(this.Database.Connection.ConnectionString);
        var entityCnxStringBuilder = new EntityConnectionStringBuilder
            (System.Configuration.ConfigurationManager
             .ConnectionStrings["connectionStringEntity"].ConnectionString);

        var sqlCnxStringBuilder = new SqlConnectionStringBuilder
            (entityCnxStringBuilder.ProviderConnectionString);

        sqlCnxStringBuilder.DataSource = @"C:\location";

        this.Database.Connection.ConnectionString
            = sqlCnxStringBuilder.ConnectionString;


        this.Database.Connection.Open();

但我无法解决以下错误消息:

"多步OLE DB操作产生错误。检查每个OLE DB状态值(如果可用)。没有工作。"

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:3)

为什么不使用DbContext类的the other overload。这个重载的签名是DbContext(字符串)。因此,您可以手动将连接字符串传递给类对象。此外,如果您对代码中传递的连接字符串不满意。将所有字符串添加到Web.Config并传递其名称。

所以在那之后你的代码就像。

string userInput // actul user input
var connS = SomeLogicClass.GetConnString(userInput);
using(var db = new YourDbContext:DbContext){
  //do your operations
}