【问题标题】:Impossible to add a User-Defined-Data Type parameter to my query无法向我的查询添加用户定义的数据类型参数
【发布时间】:2022-04-19 05:14:00
【问题描述】:

我正在尝试在 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 IEnumerable1.``也是。

编辑

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

【问题讨论】:

  • 我建议您在问题中添加 UDT 的定义 =)

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


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:
      1. 如果您使用 UdtTypeName="MyBoolean" 这种类型必须存在于您的 数据库
      2. 如果你设置 SqlDbType=SqlDbType.Structured 你的 类型“MyBoolean”必须是 “表值参数”look at thismore info about using table-valued parameters

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

      【讨论】:

        【解决方案4】:

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

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

        将 SqlParameter 属性 SqlDbType 赋值为 SqlDbType.Structured "param.SqlDbType = SqlDbType.Structured"

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

        【讨论】:

          【解决方案5】:

          Specified type is not registered on the target server.System.Int32, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089:恐怕你不能在Udt 类型参数的Value 属性中使用原始类型,例如int32string。您应该在 .NET 中创建您的自定义 UDT 类(使用 SqlUserDefinedTypeAttribute 装饰它们)并将它们注册到 SQL Server(请参阅详细信息 herehere),或者您可以“回退”使用您的 UDT 基于的基本 SQL 类型,如 .NET 代码中的 DecimalDateTimeNVarChar 等,而不是 Udt。我遇到了同样的问题,并投票支持第二个选项。

          【讨论】:

            猜你喜欢
            • 2020-05-16
            • 1970-01-01
            • 1970-01-01
            • 2023-03-27
            • 1970-01-01
            • 1970-01-01
            • 2020-02-06
            • 1970-01-01
            • 2014-10-06
            相关资源
            最近更新 更多