【发布时间】:2013-11-15 15:35:10
【问题描述】:
使用 DbProviderFactories 可以实现与提供者无关的数据库访问。
var factory = DbProviderFactories.GetFactory("ProviderInvariantName");
using (var connection = factory.CreateConnection())
{
connection.Open();
using (var command = connection.CreateCommand())
{
command.CommandText = "SELECT * FROM TableName";
...
}
}
但是如果我想参数化我的查询呢?提供者之间的参数格式不同(@param、:param、?、...)。框架中是否对此提供支持?还是我必须自己编写代码,用我的 CommandText 中的通用参数替换提供者特定的表单?
澄清: 对于 OleDbCommand,我的 CommandText 如下所示:
SELECT * FROM TableName WHERE ColumName = ?
对于 SqlCommand,我的 CommandText 如下所示:
SELECT * FROM TableName WHERE ColumName = @paramName
对于 OracleCommand,我的 CommandText 如下所示:
SELECT * FROM TableName WHERE ColumName = :paramName
我说的是CommandText中参数占位符的格式,不是DbParameter对象。
【问题讨论】:
-
为您选择的供应商使用 EF 和 Linq 提供程序?
-
不是当前项目的选项。
-
企业图书馆数据访问应用程序块中有代码可以实现这一点;我用过但不记得它是如何实现的,但是可以下载源代码,所以你可以看看。
-
@Rikalous:我检查了它,但看起来只有存储过程的 API。另请参阅我对 Rob A 答案的评论。