C#DataTable,带有ushort字段作为SQL Server存储过程的参数

时间:2017-06-19 11:21:11

标签: c# stored-procedures datatable user-defined-types table-valued-parameters

我在SQL Server中有一个存储过程,它具有一个表值类型作为参数。

表值类型如下:

CREATE TYPE [Serveis].[tblType_DispensadorBebidas_Abonados] AS TABLE 
(
    [ID] [varchar](9) NOT NULL,
    [Field1] [smallint] NOT NULL,
    [Field2] [smallint] NOT NULL,
    [Date] [datetime] NOT NULL,
    PRIMARY KEY ([ID])
)

然后存储过程将此表值类型作为参数:

PROCEDURE [dbo].[AddData] 
    @DataTable MytableValuedType READONLY

从C#我创建一个DataTable,如下所示:

DataTable dt = new DataTable();

dt.Columns.Add("ID", typeof(string)).SetOrdinal(0);           
dt.Columns.Add("Field1", typeof(ushort)).SetOrdinal(1);
dt.Columns.Add("Field2", typeof(ushort)).SetOrdinal(2);
dt.Columns.Add("Date", typeof(DateTime)).SetOrdinal(3);

dt.Rows.Add(this.ID,this.Field1,this.Field2,this.Date);

在C#中,数据类型是:

  • ID字符串
  • Field1 ushort
  • Field2 ushort
  • 日期日期时间

然后我创建一个SQL参数:

SqlParameter param = new SqlParameter();
param.ParameterName = "@DataTable";
param.Value = dt;
param.SqlDbType = SqlDbType.Structured;

使用command.Parameters.Add(param)

添加它

最后我调用了ExecuteNonQuery。

它抛出错误(从西班牙语翻译):

Column type 'Field1' not allowed. The type is "'UInt16'".

我怎么解决这个问题?

1 个答案:

答案 0 :(得分:2)

SQL Server中的

smallint已签名。您需要在C#代码中使用匹配的签名数据类型(即short)。这应该很简单:

    dt.Columns.Add("ID", typeof(string)).SetOrdinal(0);           
    dt.Columns.Add("Field1", typeof(short)).SetOrdinal(1);
    dt.Columns.Add("Field2", typeof(short)).SetOrdinal(2);
    dt.Columns.Add("Date", typeof(DateTime)).SetOrdinal(3);