【问题标题】:Can I pass table-valued parameters agnostically?我可以不可知地传递表值参数吗?
【发布时间】:2021-06-27 20:06:45
【问题描述】:

我已经投入了一些精力来使用 ADO.NET 以不可知的方式与后端 SQL Server 进行通信。我编写代码以使用 IDbConnection、IDbCommand、IDataReader,而不是具体类型。这对我来说效果很好。我可以编写如下代码:

using (IDbConnection connection = Connector.Connection)
using (IDbCommand command = connection.CreateCommand())
{
    ...
    command.AddParameter("@id", id);
    using (IDataReader reader = command.ExecuteReader()) {...}
    ....
}

将 IDbConnection 与 SqlConnection 相关联的魔力被抽象为类似于工厂的东西,我在这里称之为连接器。

我们希望使用表值参数作为存储过程的参数。我没有看到任何使用不使用 SqlConnection、SqlCommand、SqlParamater 和 SqlDataType 的 SQL 表值参数的示例。有没有一种方法可以通过 ADO.NET 传递表值参数,而无需借助具体的 SQL ADO 实现?

【问题讨论】:

  • 只是好奇,您是否考虑过将参数作为序列化 JSON 传递,然后在 SQL 过程中对其进行反序列化?不确定这是否会有所帮助:sweatsmile:
  • 这是一个关于方法的好主意。如果我不能使用漂亮的原生功能,那就太糟糕了。

标签: c# sql ado.net


【解决方案1】:

有没有一种方法可以通过 ADO.NET 传递表值参数,而无需借助具体的 SQL ADO 实现

没有。

在执行特定于 SQL Server 的操作(例如表值参数)时,您必须向下转换为 SqlParameter。例如

var param = command.AddParameter("@table", dt);
var sqlParam = (SqlParameter) param;
sqlParam.SqlDbType = SqlDbType.Structured;  
sqlParam.TypeName = "dbo.CategoryTableType";  

当然你可以使用反射,但这只是浪费时间。

【讨论】:

  • 只有TypeName需要吗? DbParameter.DbType 和 SqlDbType 是否关联?
  • DbParameter.DbType 接受由驱动程序映射到 Sql Server 类型的“标准”DbTypes 的枚举。但并非所有 SQL Server 类型都有对应的 DbType。
猜你喜欢
  • 1970-01-01
  • 2020-02-11
  • 2013-01-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-23
  • 2015-12-29
相关资源
最近更新 更多