我可以不可知地传递 table 值参数吗?

Can I pass table-valued parameters agnostically?

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

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

将 IDbConnection 关联到 SqlConnection 的神奇之处被抽象为类似工厂的东西,我在这里称之为连接器。

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

Is there a way I can pass a table-valued parameter through ADO.NET without resorting to a concrete SQL ADO implementation

没有

在执行 SQL 特定于服务器的内容时​​,您必须向下转换为 SqlParameter,例如 Table-Valued Parameters。例如

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

当然你可以使用反射,但那样只会浪费时间。