无法在我的查询中添加User-Defined-Data Type参数

时间:2011-05-11 15:02:00

标签: c# sql sql-server-2008 user-defined-types

我正在尝试将用户定义的数据类型与C#和SQL Server 2008一起使用,但是在执行command.ExecuteReader()时出现异常。

string qyery = "SELECT * FROM Product WHERE IsAvailableProduct < @Param";
SqlCommand command = new SqlCommand(qyery, conn);
SqlParameter param = new SqlParameter("@Param", SqlDbType.Structured);

param.UdtTypeName = "MyBolean";
param.SqlDbType = SqlDbType.Structured;
param.Value = 1;

command.Parameters.Add(param);
SqlDataReader reader = command.ExecuteReader();

引发的例外是:

  

Failed to convert parameter value from a Int32 to a IEnumerable``1.

我的代码出了什么问题?

编辑

如果我将 SqlDbType 更改为 Udt ,我会遇到以下异常:Specified type is not registered on the target server.System.Int32, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089.

如果我将 DbType 属性设置为 Int (这是“MyBolean”的基本类型),则结果为异常Failed to convert parameter value from a Int32 to a IEnumerable 1.``也被提出来了。

编辑

我修改了标题,因为在SQL Server 2008中,它是“用户定义数据类型”而没有“用户定义的类型”

4 个答案:

答案 0 :(得分:2)

SqlDbType枚举值Structured用于表示您正在传递Table Value Parameter,这就是为什么您收到的错误消息为值你传入的是一个整数,而不是用作TVP的“某事物列表”。

您需要根据param.SqlDbType的基础数据类型设置MyBolean,我怀疑这可能是BitInt

答案 1 :(得分:0)

乍一看,我猜你至少需要制作SqlDbType = Udt(不是Stuctured)。

答案 2 :(得分:0)

  1. 如果您使用UdtTypeName =“MyBoolean” 这种类型必须存在于你的 数据库
  2. 如果你设置了 SqlDbType = SqlDbType.Structured你的 类型“MyBoolean”必须是 “表值参数”look at thismore info about using table-valued parameters
  3. 所以当你设置那些属性时,参数值必须至少实现IEnumerable(即一个对象列表),但是你提供了整数值,这导致了错误

答案 3 :(得分:0)

我的数据库中有用户定义的表类型(假设这是MyTableTypeList)。这些在我的存储过程中用作参数。 要通过此数据类型传递值,请执行以下操作:

声明一个类似于我的用户定义表类型的DataTable,在其中填充值。

将SqlParameter属性SqlDbType指定为SqlDbType.Structured“param.SqlDbType = SqlDbType.Structured”

使用User-Defnied表类型的名称指定TypeName属性。 “param.TypeName =”MyTableTypeList“