首页 > 解决方案 > 企业库中等效的用户定义 SQL 类型

问题描述

我正在尝试传递参数,它是 SQL Server 中的表类型。我找不到兼容的 c# 类型。

我将多个参数传递给存储过程,其中一个参数是 SQL 中的用户定义类型。

Database Connection = new SqlDatabase(ConnectionString);
DbCommand Cmd= Connection.GetStoredProcCommand("ProcedureName");
..................
Connection.AddInParameter(Cmd, "@custom", DbType.Object, custom);

存储过程如下所示:

ALTER PROCEDURE [dbo].[ProcedureName]
  @custom dbo.CstmType READONLY 
AS

此代码引发以下错误:

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

我厌倦了在互联网上找到这个问题的答案。有人可以提供富有成效的建议如何解决此错误以及适当的数据类型应该是什么?

标签: c#sql-serverstored-proceduresenterprise-libraryuser-defined-types

解决方案


在您的 C# 代码中,使用您在用户定义表类型中添加的相同字段创建 DataTable。如,

DataTable dt = new DataTable();
dt.Columns.Add("column1");
dt.Columns.Add("column2");

之后,在这个表中插入数据,比如,

dt.Rows.Add(new Object[]{ value1,value2 });

在过程调用中添加参数,如下所示,

SqlCommand cmd = new SqlCommand("ProcedureName", con)
cmd.CommandType = CommandType.StoredProcedure;
var List = new SqlParameter("@custom", SqlDbType.Structured);
List.TypeName = "CstmType";
List.Value = dt;
cmd.Parameters.Add(List);

在您的存储过程中,为用户定义的表类型添加参数

@custom dbo.CstmType READONLY

推荐阅读