使用 PetaPoco 将表值参数传递给存储过程

Posted

技术标签:

【中文标题】使用 PetaPoco 将表值参数传递给存储过程【英文标题】:Pass table value param to stored procedure using PetaPoco 【发布时间】:2013-06-05 20:16:49 【问题描述】:

当我尝试使用 PetaPoco 调用 SQL Server 2008 R2 存储过程时。

我的存储过程接受一个表值参数。

如何使用表值参数调用 petapoco 中的存储过程?

这是我想要做的:

var db = new PetaPoco.Database("repikaciskaBaza");

DataTable table = new DataTable();
DataColumn id = table.Columns.Add("id", type: typeof(Int32));

for (int i = 0; i < 10;i++ )

    DataRow row = table.NewRow();
    row["id"] = i;
    table.Rows.Add(row);


var param = new SqlParameter();
param.DbType = DbType.Object;
param.ParameterName = "@art_id";

param.SqlValue = table;

var lista = db.Query<pocoArts>(";exec dbo.test_sporc_param @0", param);

这段代码给了我一个例外:

传入的表格数据流 (TDS) 远程过程调用 (RPC) 协议流不正确。 参数 3 ("@0"):数据类型 0x62 (sql_variant) 的类型特定元数据的类型无效。

如果我设置参数值

param.SqlDbType = SqlDbType.Structured;

然后我得到像

这样的异常
The table type parameter '@0' must have a valid type name.

当我定义我的参数时

            param.SqlDbType = SqlDbType.Structured;
            param.SqlValue = table;
            param.ParameterName = "@art_id";
            param.TypeName = SqlDbType.Structured.ToString();

然后我得到异常

列、参数或变量@0。 : 找不到数据类型结构化。

如何使用表值参数定义SqlParam,以便我可以将它的数据发送到 SQL Server?

解决方案

var param = new SqlParameter();
param.SqlDbType = SqlDbType.Structured; // According to marc_s
param.SqlValue = table; 
param.ParameterName = "@art_id";
param.TypeName = "dbo.typ_art_id"; // this is TYP from SQL Server database it needs to be equal to type defined in SQL Server not type of param

【问题讨论】:

虽然我不能说上述方法不起作用。我无法在我的解决方案中使用命名参数。我最终只是做了一个@0。 db.Query("INNER JOIN @0 rowIds ON ...", param).ToList() 【参考方案1】:

根据relevant MSDN documentation on table-valued parameter,你应该使用:

var param = new SqlParameter();
param.SqlDbType = SqlDbType.Structured;

SqlDbType.Structured 是关键。不要使用DbType.Object

【讨论】:

我做到了,现在我有不同的例外

以上是关于使用 PetaPoco 将表值参数传递给存储过程的主要内容,如果未能解决你的问题,请参考以下文章

将表值参数传递给具有不同字段数的存储过程

如何从.net代码将表值参数传递给存储过程

如何使用 C# 和 SQL 将表值参数传递给用户定义的数据表

将表变量作为参数传递给表值函数

EF:从 C# 将表值参数传递给用户定义的函数

将表名作为参数传递给存储过程