【问题标题】:Provider-agnostic parameterized queries与提供者无关的参数化查询
【发布时间】: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 答案的评论。

标签: .net sql database


【解决方案1】:

我同意瑞卡洛斯的观点。 You can use the Enterprise Library Data Access Block.

这些参数并不特定于 db 的类型。例如,以下内容适用于 Oracle 和 Sql。您的数据库和连接也是通用的。

Db = DatabaseFactory.CreateDatabase(ConnString);
Connection = Db.CreateConnection();

var dbCommand = Db.GetStoredProcCommand("sp_xxx");

Db.AddInParameter(dbCommand, "lob", DbType.Int32, 200);
Db.AddInParameter(dbCommand, "attr", DbType.String, "whatever");

我唯一不使用这种方法的情况是针对我当前版本中尚未实现的某些东西,例如 TVP 参数或其他东西,但您可以简单地为此进行转换。

((SqlDatabase)Db).AddInParameter(dbCommand, "location_codes", SqlDbType.Structured, dataTable); 

【讨论】:

  • 请参阅我的说明。您的代码正在调用存储过程,CommandText 中没有参数占位符。我还检查了 EntLib 的 Database 类,唯一有趣的方法是 BuildParameterName。但是只有 SqlDatabase 实现了。
  • 我现在关注你了,我稍后再看看。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多