如何从 C# 连接到任何数据库?

Posted

技术标签:

【中文标题】如何从 C# 连接到任何数据库?【英文标题】:How do I connect to ANY database from C#? 【发布时间】:2013-11-26 15:30:18 【问题描述】:

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

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

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

我是不是要求太多了?

【问题讨论】:

我当然不是专家,但我很确定唯一的方法是滚动您自己的中介来解释/转换从一种语言到另一种语言的语法。 很多方法,例如抽象工厂模式 SQL 在数据库中并不完全相同。 【参考方案1】:

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

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

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

【讨论】:

【参考方案2】:

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

【讨论】:

【参考方案3】:

是的。它使用interfacesDependency Injection 调用。您可以在网上找到许多文章和教程来设置这些内容。

这个想法是您根据interface 编写自己的实现。然后,您可以通过在 IoC 容器中注册要使用的代码来交换这些代码,而无需更改任何代码。

【讨论】:

【参考方案4】:

看看 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 ();
        
    

【讨论】:

以上是关于如何从 C# 连接到任何数据库?的主要内容,如果未能解决你的问题,请参考以下文章

如何建立数据库(sql)连接以使用 c# 从文本字段接收数据?

WCF C# 应用程序中的 Websockets 到 ORACLE 数据库

如何在不实际安装连接器的情况下通过 C# 使用 mysql 连接器连接到 mysql

如何使用 C# 连接到 Blob 存储容器

使用 C#、SQL Server 设计数据访问层

C# 怎么把从数据库查询出来的东西累加到dataGridView里面去