C# DataTable с полем ushort в качестве параметра хранимой процедуры SQL Server


У меня есть процедура хранения в 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# типы данных:

  • строка идентификатора
  • Field1 ushort
  • Field2 ushort
  • Дата DateTime

И затем я создаю SQL Параметр:

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

Добавьте его с помощью команды.Параметры.Add (param)

И, наконец, я вызываю ExecuteNonQuery.

Он выдает ошибку (в переводе с испанского):

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

Как я мог решить эту проблему?

1 2

1 ответ:

smallint в SQL Server подписан. Вам нужно будет использовать соответствующий подписанный тип данных (например, short) в коде C#. Это должно быть так просто, как:

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