使用 PetaPoco 将表值参数传递给存储过程 [英] Pass table value param to stored procedure using PetaPoco

查看:45
本文介绍了使用 PetaPoco 将表值参数传递给存储过程的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

For while I am trying to call SQL Server 2008 R2 stored procedure using PetaPoco.

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

My stored procedure accepts a table valued parameter.

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

How I can call the stored procedure in petapoco with table value param?

这是我想要做的:

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);

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

This code gives me an exception :

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

The incoming tabular data stream (TDS) remote procedure call (RPC) protocol stream is incorrect.
Parameter 3 ("@0"): Data type 0x62 (sql_variant) has an invalid type for type-specific metadata.

如果我设置参数值

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.: 找不到数据类型结构化.

Column, parameter, or variable @0. : Cannot find data type Structured.

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

How I can define SqlParam with table valued param so I can send it whit data to 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

推荐答案

根据有关表值参数的相关 MSDN 文档,您应该使用:

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

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

The SqlDbType.Structured is the key to this. Don't use DbType.Object.

这篇关于使用 PetaPoco 将表值参数传递给存储过程的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆