我正在尝试使用PetaPoco调用SQL Server 2008 R2存储过程。
我的存储过程接受表值参数。
如何使用表值param调用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。 :找不到数据类型Structured。
如何使用表值param定义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 :(得分:4)
根据relevant MSDN documentation on table-valued parameter,你应该使用:
var param = new SqlParameter();
param.SqlDbType = SqlDbType.Structured;
SqlDbType.Structured
是关键。请勿使用DbType.Object
。