【问题标题】:SQL UDT Type parameter pass in C#C# 中的 SQL UDT 类型参数传递
【发布时间】:2015-09-30 06:21:42
【问题描述】:

我有一个 SQL UDT 类型为

CREATE TYPE [dbo].[UDTName] FROM nvarchar(50) NULL
GO

我在一个过程中使用它来将数据插入到我的数据库中。我的程序是这样的

CREATE PROCEDURE [dbo].[proc_name]
(
  @param1 int,
  @param2 int,
  @param3 UDTName,
  @param4 UDTComment,
  @param5 UDTType   = '' output,
  @param6 UDTType   = '' output
)

当我从我的 C# 代码中调用此过程时,UDT 类型的数据没有保存在表中。

我的 C# 代码:

  private IDictionary<string, string> RunQuery(string procName, List<Parameter> input) {
foreach (Parameter inputPair in input)
                    {
         SqlParameter sp = new SqlParameter("@" + inputPair.Name , inputPair.Type);  
                    // I have tried SQLDbType as Varchar, nVarchar also
         sp.Direction = System.Data.ParameterDirection.Input
         sp.SqlDbType = SqlDbType.Udt;
         // i have an if condition around it to check if it is UDT type only then add a UdtTypeName 
         sp.UdtTypeName = "UDTName"; // I have tried dbo.UDTName also
         sp.Size = inputPair.Size; //setting only in case of varchar
         sp.Value = inputPair.Value;

         cmd.Parameters.Add(sp);

}
  cmd.CommandType = CommandType.StoredProcedure;

                param1.ParameterName = "@param5";
                param1.SqlDbType = System.Data.SqlDbType.VarChar;
                param1.Size = 255;
                param1.Direction = System.Data.ParameterDirection.Output;
                cmd.Parameters.Add(param1);

 _reader = cmd.ExecuteReader();
}

参数类是

     public class Parameter
        {
            public string Name { get; set; }
            public object Value { get; set; }
            public object Type { get; set; }
            public bool isUDT { get; set; }
            public int Size { get; set; }
public bool UdtTypeName  { get; set; }
        }

但它没有将数据插入我的数据库并引发以下异常:

结果消息:System.Exception:指定类型未注册 目标服务器.System.String, mscorlib, Version=4.0.0.0, 文化=中性,PublicKeyToken=b77a5c561934e089。

如果我在代码中使用 varchar SQLDbType 代替 UDTType SQLDbType,它会成功运行,但不会将数据插入表中。

我做了一些研究,但到处都有人使用基于表值对的 UDT 类型。

注意:我无权更改 SQL DB 中的任何内容。

编辑

我也试过数据表

我的代码:

 DataTable dataTable = new DataTable("UDTName");
                            dataTable.Columns.Add();
                            dataTable.Rows.Add("my_value");

                            var inputParam = cmd.Parameters.AddWithValue("@param3", dataTable);
                            inputParam.SqlDbType = SqlDbType.Structured;
                            inputParam.Direction = System.Data.ParameterDirection.Input;

显示如下错误:

结果消息:System.Exception:操作数类型冲突:表类型与 nvarchar(50) 不兼容

【问题讨论】:

  • 什么是inputPair?它会抛出Exception 吗?如果是这样,有什么例外。如果不是,您能否显示所有调用存储过程的代码。
  • 忽略inputpair..实际上在我的代码中,因为我有30多个参数要在过程中传递,所以我正在遍历一个字典..你可以忽略它,..编辑我的问题
  • 为什么你同时标记了 mysql 和 sql-server ?
  • 对不起...已删除,希望有人对此有任何想法....

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


【解决方案1】:

您需要正确指定 2 种类型(sp.SqlDbTypesp.UdtTypeName),名称和值。

您似乎设置了错误的值或不正确的sp.UdtTypeName

检查你创建SqlParameter的方式:

SqlParameter sp = new SqlParameter("@" + inputPair.Name , inputPair.Type);

这里的问题是你的inputPair.Type 是对象类型。

所以调用了下面的构造函数:

public SqlParameter( string parameterName , object value )

而不是您可能期望的另一个:

public SqlParameter( string parameterName , SqlDbType dbType )

您的代码应该是这样的:

SqlParameter sp = new SqlParameter("@" + inputPair.Name , value);
sp.SqlDbType = SqlDbType.Udt;
sp.UdtTypeName = "UDTName";

https://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlparameter.udttypename(v=vs.90).aspx

【讨论】:

    【解决方案2】:

    试试下面的代码,

    var testingparam = command.Parameters.AddWithValue("@param3", myDataTable);
    testingparam.SqlDbType = SqlDbType.Structured;
    

    我在 SQL 管理工具中创建用户定义类型后使用了它。

    【讨论】:

    • 我的 UDT 类型不是表类型...你能给我一些想法..我怎样才能创建一个数据表?
    • @user3035305 你能在你的问题中添加完整的工作代码,然后我会尝试相应地回答
    猜你喜欢
    • 2010-12-19
    • 2020-11-12
    • 1970-01-01
    • 2021-08-03
    • 1970-01-01
    • 2020-09-13
    • 1970-01-01
    • 2019-04-23
    • 1970-01-01
    相关资源
    最近更新 更多