3

我正在创建一个 C# 应用程序来替换使用 MySQL 数据库的 VB6 应用程序,其中应用程序的多个副本使用相同的数据库。新应用程序必须能够使用当前的 MySQL 数据库,但我也希望它与数据库无关,以便应用程序的未来实例可以使用用户想要的任何服务器。在一个完美的世界中,我希望应用程序在首次运行时向用户显示一个对话框,让他们选择数据库类型(MySQL、SQL Server 等)并指定服务器 ip、用户、密码和数据库姓名。然后,该应用程序将连接到该服务器,如果数据库已经存在,则使用该数据库,如果不存在,则创建一个新数据库。

使用 Code First 我已经了解如何使用现有数据库或创建新数据库,但只能通过在 App.config 文件中对连接字符串进行硬编码。

    <add name="GumpIndexDatabase"
     connectionString="server=localhost;userid=123;password=123;port=3306;database=gump_new_data;pooling=false;"
     providerName="MySql.Data.MySqlClient"
     />

我可以在启动应用程序之前更改连接字符串和提供程序,并且一切都按预期工作。我也可以在启动后更改连接字符串,但不能更改提供程序,并且我必须知道提供程序是 MySQL 还是 MSSQL 才能正确获取连接字符串详细信息(例如:用户或用户 ID)

class GumpIndexDatabase: DbContext
{
    public GumpIndexDatabase(string connectionName)
        : base(MakeConnectionString(connectionName))
    {
    }
    private static string MakeConnectionString(string connectionName)
    {
         if (connectionName=MySQL) {
             //return MySQL string
         } else {
             //return SQL Server string
         }
    }

几个小时的搜索还没有找到如何做这样的事情的例子,所以我怀疑它是不允许或推荐的,即使它看起来很简单。我看过一些关于连接字符串构建器的文章,但不明白如何从通用对象中获取数据库特定的字符串。

所以一个简单的问题:如何在运行时指定数据库连接细节?

4

2 回答 2

1

我不建议强制执行此功能,除非您 100% 肯定没有它就无法生存。它增加了很多维护任务,现在可能并不明显(例如更新到新版本、修复错误、花费大量时间找出通用接口、维护这些接口、大量测试等等)。因此,除非它是一个请求的业务功能 - 忘记它。

但是,如果您知道自己在做什么,则此问题通常通过接口解决。可能有这些通用接口(弄清楚它们是一项任务):

  • IConnection
  • IDataProvider
  • IRepository<T>

目前,您将使用 MySql 数据库实现接口,例如class MySqlConnection : IConnection. 如果您需要 MS SQL class MsSqlConnection : IConnection,.

实际上,您必须将所有功能抽象为通用接口。您必须为要支持的每个数据库/存储引擎提供实现。在运行时,您将使用 IoC 容器和 DI 原理来设置当前实现。所有子依赖项将使用作为参数传递给构造函数(或属性或方法)的接口

于 2013-03-27T22:19:10.390 回答
0

你试过Database房产吗?

GumpIndexDatabase.Database.Connection.ConnectionString = "your conn string";

我只是对它进行了很短的测试,因此不能保证它可以正常工作。但是我在我的一个服务层类的构造函数中成功地使用了它:

public class MyService
{
    protected DataContext DataContext { get; set; }

    public MyService(DataContext dataContext)
    {
        DataContext = dataContext;
        DataContext.Database.Connection.ConnectionString = "conn string";
    }
}

刚刚看到DbContext有过载DbContext(string nameOrConnectionString)。你应该也可以使用它。

使用现有连接

或者您使用现有的连接。你DbContext应该有这样的东西:

public class DataContext : DbContext
{
    public DataContext(DbConnection existingConnection)
        : base(existingConnection, true) { }
}

然后在需要的任何地方初始化它:

public void SomeMethod()
{
    var connString = "whatever"; // could also be something like Textbox1.Text
    using (var connection = new SqlConnection(connString))
    {
        var context = new DataContext(connection);
    }
}

当然SqlConnection可以是任何继承自DbConnection. 请参阅DbConnection 类

于 2013-03-27T19:44:55.423 回答