5

是否可以在 C# 中构建与 SQL Server 或 MySQL 无关的数据库无关代码,仅取决于连接字符串?

我想我正在寻找可以在数据库服务器上抛出 SQL 并返回一组非常简单的行/列的东西。这个数据库可以是……SQL、MySQL、Access、Filemaker,等等。似乎所有数据库都有自己的驱动程序和对象库。SqlConnection 与 MySqlConnection 等。

我知道 OBDC 和 OdbcConnection,理论上它们可以满足我的要求,但我也不想一直在服务器上创建 ODBC 连接。

我在这里要求太多了吗?

4

4 回答 4

5

看看 NHibernate、LLBLGEN、MyGeneration、NetTiers 和其他 ORM。

它们可能允许你做一些你需要的抽象。有些是免费的,有些是收费的。

我个人喜欢NHibernate。

您可以使用 gleng 之类的接口执行上述操作:

public static IDbDataAdapter GetDataAdapter (Database db)
    {
        switch (db)
        {
            default:
            case "MsSql":
                return new SqlDataAdapter ();
            case "MySql"
                return new MySqlDataAdapter ();
        }
    }

    public static IDbCommand GetCommand (Database db)
    {
        switch (db)
        {
            default:
            case "MsSql":
                return new SqlCommand ();
            case "MySql"
                return new MySqlCommand ();
        }
    }
于 2013-11-13T20:40:36.823 回答
2

是的。它被称为使用interfacesand Dependency Injection。您可以在网上找到许多文章和教程来设置这些东西。

这个想法是您基于interface. IoC然后,您可以通过在容器中注册要使用的代码来交换这些代码,而无需更改任何代码。

于 2013-11-13T20:38:10.620 回答
0

如果不使用 ORM,答案是“不”。我的目标是将 SQL 作为字符串发送,并取回一个简单的行列矩阵。这显然是不可能的。

我最终编写了自己的对象,该对象接受一个字符串和数据库类型的枚举,然后它使用 switch 语句来使用各种对象库进行连接。我静态编译了库。

不是最优雅的解决方案,但它做了我想要的。

于 2013-12-11T19:09:04.057 回答
0

应该可以使用System.Data.OleDb命名空间中的类,如 OleDbConnection、OleDbCommand ......如果你只使用非常基本的 sql 语句,这应该可以工作......你还应该小心选择列中的数据类型您的表定义,因为每个提供者支持的类型会有所不同

于 2013-11-14T06:40:44.243 回答