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 ответ:
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);