无法将用户定义的数据类型参数添加到我的查询中

5

我正在尝试在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();

抛出的异常是:

无法将参数值从Int32转换为IEnumerable``1。

我的代码哪里有问题?

编辑:

如果我将SqlDbType更改为Udt,则会出现此异常:指定类型未在目标服务器上注册。System.Int32,mscorlib,Version = 2.0.0.0,Culture = neutral,PublicKeyToken = b77a5c561934e089。

如果我将DbType属性设置为Int(这是“MyBolean”的基本类型),则还会引发该异常:无法将参数值从Int32转换为IEnumerable 1.``

编辑:

我修改了标题,因为在SQL Server 2008中,它是“User Define DATA Type”,而不是“User Defined Types”。


1
我建议你在问题中添加一个UDT的定义 =) - Rob
5个回答

2

枚举值SqlDbType中的Structured用于指示您正在传递表值参数,这就是为什么您收到错误消息的原因,因为您传递的值是整数,而不是用作TVP的“某个列表”的值。

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


0
乍一看,我猜你至少需要将 SqlDbType 设置为 Udt(而不是 Structured)。

0
  1. 如果您使用UdtTypeName="MyBoolean",则此类型必须存在于您的数据库中
  2. 另外,如果您设置SqlDbType=SqlDbType.Structured,则您的类型"MyBoolean"必须是"表值参数"请参阅此处有关使用表值参数的更多信息

因此,当您设置这些属性参数值时,至少必须实现IEnumerable(即对象列表),但您提供了整数值,这导致错误。


0

指定的类型未在目标服务器上注册。System.Int32,mscorlib,Version=2.0.0.0,Culture=neutral,PublicKeyToken=b77a5c561934e089:很抱歉,您不能在Udt类型参数的Value属性中使用原始类型,如int32string。您应该在.NET中创建自定义UDT类(用SqlUserDefinedTypeAttribute进行装饰),并在SQL Server上注册它们(请参见此处此处的详细信息),或者您可以“回退”到使用基本的SQL类型来代替Udt,例如DecimalDateTimeNVarChar等。我也遇到了同样的问题,并选择了第二个选项。


0

我的数据库中有用户定义的表类型(假设为MyTableTypeList)。这些被用作存储过程中的参数。

为了通过这种数据类型传递值,我会执行以下操作:

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

将SqlParameter属性SqlDbType分配为SqlDbType.Structured "param.SqlDbType = SqlDbType.Structured"

将TypeName属性分配为用户定义表类型的名称。"param.TypeName = "MyTableTypeList"


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接