gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-29 00:10:35 27 4
gpt4 key购买 nike

我们正在制作一个相当严肃的应用程序,需要对客户想要使用的数据库保持不可知。最初我们计划支持 MySQL、Oracle 和 SQL Server。表和 View 和查询一样简单(没有真正花哨的 SQL),因此问题:

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

显然选项 2 不涉及开销,但我认为性能不如本地访问好?

最佳答案

Note: This answer is relevant if you decide to use basic ADO.NET 2 functionality instead of an ORM (such as Entity Framework or NHibernate) or LINQ to SQL.

假设您在 app.config 中定义了一个连接字符串:

<connectionStrings>
<add name="SomeConnection"
providerName="System.Data.SqlClient"
connectionString="..." />
</connectionStrings>

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

(请注意,非标准提供程序,即默认情况下不在 .NET Framework 中的提供程序,need to be registered 首先位于 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();
}
}

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


延伸阅读:

关于c# - 保持应用程序数据库不可知(ADO.NET 与封装数据库逻辑),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3080601/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com