保持应用程序数据库不可知(ADO.NET与封装DB逻辑)

And*_*ite 13 c# mysql database oracle oledb

我们正在制作一个相当严肃的应用程序,需要与客户想要使用的数据库保持无关.最初我们计划支持MySQL,Oracle和SQL Server.表和视图和查询一样简单(没有真正奇特的SQL),因此问题是:

  1. 使用本机数据库驱动程序(MySQLDbConnection等)并封装执行查询和处理结果的逻辑或
  2. 使用通用的OleDbConnection

显然,选项2不涉及开销,但我认为性能不如原生访问那么大?

sta*_*ica 11

注意:如果您决定使用基本的ADO.NET 2功能而不是ORM(例如Entity Framework或NHibernate)或LINQ to SQL,则此答案是相关的.

假设你有一个在你的app.config:中定义的连接字符串:

<connectionStrings>
    <add name="SomeConnection"
         providerName="System.Data.SqlClient"
         connectionString="..." />
</connectionStrings>
Run Code Online (Sandbox Code Playgroud)

注意providerName属性及其值的存在.您还可以为另一个数据库提供程序输入值,例如System.Data.SQLite.

(请注意,非标准提供程序,即默认情况下不在.NET Framework中的提供程序,需要首先app.config在客户端计算机中或在客户端计算机中注册machine.config.)

现在,您可以使用完全与提供程序无关的方式使用指定的数据库,如下所示:

using System.Configuration;  // for ConfigurationManager
using System.Data;           // for all interface types
using System.Data.Common;    // for DbProviderFactories

var cs = ConfigurationManager.ConnectionStrings["SomeConnection"];
//                                              ^^^^^^^^^^^^^^^^

var factory = DbProviderFactories.GetFactory(cs.ProviderName);
//                                           ^^^^^^^^^^^^^^^

using (IDbConnection connection = factory.CreateConnection())
{
    connection.ConnectionString = cs.ConnectionString;
    //                            ^^^^^^^^^^^^^^^^^^^
    connection.Open();
    try
    {
        using (IDbCommand command = connection.CreateCommand())
        {
            ...  // do something with the database
        }
    }
    finally
    {
        connection.Close();
    }
}
Run Code Online (Sandbox Code Playgroud)

请注意此代码仅适用于接口类型.您指定特定数据库提供程序的唯一位置是通过文件中的providerName属性值app.config.(我已经app.config^^^s 标记了设置的所有地方.)


进一步阅读:

  • PS:这个答案没有涉及的是参数化命令..NET Framework不提供与DB-provider无关的方法来引用SQL`CommandText`中的命令参数. (2认同)
  • ...或者质疑你是否真的*需要你的代码与数据库无关/不可知.您实际上将生产数据库实际迁移到不同的RDBMS的频率是多少?也许并不常见. (2认同)

Dar*_*rov 7

使用ORM的 IMHO 是一个很好的设计决策,以便拥有一个与数据库无关的应用程序.切换数据库可能就像更改配置设置和连接字符串一样简单.


Ste*_*ary 5

您不需要OleDbConnection访问非特定的 ADO.NET 提供程序。只需使用DbConnectionet。阿尔。有关更多信息,请参阅DbProviderFactoriesMSDN