带有 ushort 字段作为 SQL 服务器存储过程参数的 C# DataTable
C# DataTable with a ushort field as parameter to a SQL Server stored procedure
我在 SQL 服务器中有一个存储过程,它的参数是 table 值类型。
Table 值类型如下:
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])
)
然后存储过程将此 table 值类型作为参数:
PROCEDURE [dbo].[AddData]
@DataTable MytableValuedType READONLY
我从 C# 创建了一个数据Table,如下所示:
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 空缺
- Field2 空头
- 日期日期时间
然后我创建一个 SQL 参数:
SqlParameter param = new SqlParameter();
param.ParameterName = "@DataTable";
param.Value = dt;
param.SqlDbType = SqlDbType.Structured;
使用command.Parameters.Add(参数)
添加
最后我调用了 ExecuteNonQuery。
它抛出错误(翻译自西班牙语):
Column type 'Field1' not allowed. The type is "'UInt16'".
我该如何解决这个问题?
smallint
in SQL 服务器已签名。您需要在 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);
我在 SQL 服务器中有一个存储过程,它的参数是 table 值类型。
Table 值类型如下:
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])
)
然后存储过程将此 table 值类型作为参数:
PROCEDURE [dbo].[AddData]
@DataTable MytableValuedType READONLY
我从 C# 创建了一个数据Table,如下所示:
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 空缺
- Field2 空头
- 日期日期时间
然后我创建一个 SQL 参数:
SqlParameter param = new SqlParameter();
param.ParameterName = "@DataTable";
param.Value = dt;
param.SqlDbType = SqlDbType.Structured;
使用command.Parameters.Add(参数)
添加最后我调用了 ExecuteNonQuery。
它抛出错误(翻译自西班牙语):
Column type 'Field1' not allowed. The type is "'UInt16'".
我该如何解决这个问题?
smallint
in SQL 服务器已签名。您需要在 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);