c#-4.0 - 使用 PetaPoco 将表值参数传递给存储过程

标签 c#-4.0 stored-procedures sql-server-2008-r2 petapoco table-valued-parameters

当我尝试使用 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);

这段代码给了我一个异常(exception):

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

然后我得到异常

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



我如何定义 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

最佳答案

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

var param = new SqlParameter();
param.SqlDbType = SqlDbType.Structured;
SqlDbType.Structured是关键。不要使用 DbType.Object .

关于c#-4.0 - 使用 PetaPoco 将表值参数传递给存储过程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17019412/

相关文章:

visual-studio-2010 - 为什么我在调试和 Release模式之间出现算术差异,我该如何解决?

visual-studio-2010 - 不允许访问数据库文件。

sql-server - 我是否必须使用存储过程来获得查询级别的安全性,或者我仍然可以使用 Dynamic Sql 来做到这一点?

java - Hibernate 和存储过程(无参数和返回)

sql - CTE 表达式中的 TSQL-ORDER BY 子句?

sql-server - IntelliSense 无法在 SQL Server Management Studio 中工作

sql-server - 从 XML 节点查询值(可能是 NAMESPACE 问题)

c# - C#获取xml文件中重复节点的信息

c#-4.0 - 使用自定义类型鉴别器告诉 JSON.net 要反序列化类层次结构的哪种类型

sql - 找出运行缓慢的存储过程