c#中的SQL UDT类型参数传递

本文关键字:类型 参数传递 UDT SQL 中的 | 更新日期: 2023-09-27 18:15:17

我有一个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类型的数据在表中没有任何保存。

My c# code:

  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; }
        }

但它不是插入数据到我的数据库,并抛出以下异常:

Result Message: System。异常:指定的类型未注册目标服务器。String, mscorlib, Version=4.0.0.0,文化=中立,都必须要。

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

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

注意:我没有权限修改SQL DB中的任何东西

编辑

I tried datatable also

我代码:

 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;

显示如下错误:

Result Message: System。异常:操作数类型冲突:表类型不兼容nvarchar(50)

c#中的SQL UDT类型参数传递

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

看起来你要么设置了错误的值,要么设置了不正确的sp.UdtTypeName

检查您创建SqlParameter的方式:

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

这里的问题是你的inputPair.Type是object类型的

因此调用以下构造函数:
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 =应用程序). aspx

试试下面的代码,

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

在SQL管理工具中创建用户定义类型后,我使用了这个