3

我正在开发的 ASP.NET Web 应用程序需要支持两种不同类型的数据库,即 Access 和 MS SQL Server 2008 Express。

对于存储在 web.config 中的每种数据库类型,我已经有了连接字符串,并且我还有另一个 web.config 值来指定要使用哪一个。所以我可以毫无问题地获得正确的连接字符串。

最大的问题在于数据库对象。对于我已经实现的 Access,我在代码中使用对象 OleDbConnection、OleDbCommand 和 OleDbDataReader 来进行数据库调用。

看来,对于 SQL Server,我不能使用这些对象,而是需要使用对象 SqlConnection、SqlCommand 和 SqlDataReader 来完成基本相同的事情。

我想尽可能多地重用我当前的代码,而不必为每种数据库类型创建两个单独的块。(我有很多将 OleDbDataReader 作为参数的方法 - 例如,我不想对每种方法都做 2 个。)

我注意到连接对象都继承自 DbConnection。数据读取器 (DbDataReader) 和命令 (DbCommand) 也是如此。

是否可以使用我现有的 Access 代码,用 Db 对象替换所有 Ole 对象,然后根据当前数据库类型将这些对象转换为正确的类型?

在一个 ASP.NET 应用程序中支持两种数据库类型是否有任何最佳实践?

如果有帮助,我可以添加我的一些代码。谢谢。

4

2 回答 2

0

是的,从框架 2.0 开始,所有数据读取器都从DbDataReader该类继承,因此您的方法可以DbDataReader代替OleDbDataReader,并且您可以将这些方法用于任何数据库。

但是,数据库具有不同的 SQL 方言,因此您要么必须停留在适用于您使用的所有数据库的功能的狭窄路径上,要么对某些任务有单独的查询。

差异的一个具体示例是 Access 使用数据文字,如#2010-09-24#SQL Server 使用日期文字,如'2010-09-24'. 通常,与日期有关的大部分内容都不同。

于 2010-09-23T22:20:26.877 回答
0

您可能缺少的链接是 DbProviderFactories 类的功能。使用此类(以及 System.Data.Common 中的相关帮助程序),您可以抽象提供程序并使用对基类(例如 DbConnection 和 DbCommand)的引用来完成工作。它看起来像这样:

private void DoSomething(string provider, string connectionString, string something)
{    
    DbProviderFactory factory = DbProviderFactories.GetFactory(provider);
    DbConnection connection = factory.CreateConnection();
    connection.ConnectionString = connectionString;
    DbCommand command = connection.CreateCommand();
    command.CommandText = something;
    DbDataReader reader = command.ExecuteReader();
    //etc...
}

获取提供者名称有点棘手,但应该是与 DbProviderFactories.GetFactoryClasses() 返回的类名称之一匹配的不变类名称。或者,您可以简单地对它们进行硬编码。它们变化不大,但它嵌入在您的代码中的魔术字符串,最终可能会导致问题。

可以通过 factory.CreateCommandBuilder 访问其他功能,这些功能可以帮助您遍历提供程序处理参数等内容的差异。

于 2010-09-23T22:31:10.033 回答