2

我在SQL Server中有一個存儲過程,它具有表值類型作爲參數。以ushort字段作爲SQL Server存儲過程的參數的C#數據表

表值類型如下:

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 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字符串
  • 字段1 USHORT
  • 字段2 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'". 

我怎麼能解決這個問題?

回答

2

smallint在SQL Server中已簽名。您需要在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); 
相關問題