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)
您需要正确指定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管理工具中创建用户定义类型后,我使用了这个