我有一个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:未注册指定的类型 目标server.System.String,mscorlib,Version = 4.0.0.0, Culture = neutral,PublicKeyToken = b77a5c561934e089。
如果我在代码中使用varchar SQLDbType代替UDTType SQLDbType,它会成功运行但不会将数据插入表中。
我做了一些研究,但到处都有人使用Table Value Pair基础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)不兼容
答案 0 :(得分:1)
您需要正确指定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";
答案 1 :(得分:0)
尝试使用以下代码
var testingparam = command.Parameters.AddWithValue("@param3", myDataTable);
testingparam.SqlDbType = SqlDbType.Structured;
我在SQL管理工具中创建用户定义的类型之后使用过它。