我有一个像这样的存储过程
CREATE PROCEDURE [dbo].[Update_Order]
@tblOrderProduct [ProductOrderType] READONLY
AS
BEGIN
SET NOCOUNT ON;
MERGE INTO tblKmOrder AS c1
USING @tblOrderProduct c2 ON c1.id = c2.id
WHEN MATCHED THEN
UPDATE
SET c1.client = c2.client
END
并按此类型
CREATE TYPE [dbo].[ProductOrderType] AS TABLE(id int, client nvarchar(max) null)
我将datatable作为参数传递给存储过程。问题是值没有正确映射,我使用c1.client = c2.client
但c2.client
值没有被映射;而是id值被映射,因为我像这样传递数据
id | client
1 | somename
我像这样传递
cmd.Parameters.AddWithValue("@" + parameter, dt);
我不明白查询中有什么问题我google了很多但是找不到任何东西
答案 0 :(得分:1)
.Net DataTable中定义的列必须与用户定义的表类型中定义的列完全匹配,包括列的顺序。
例如,如果用户定义的表类型定义如下:
CREATE TYPE udtt AS TABLE
(
id int,
val int
)
您的c#DataTable必须定义如下:
var dt = new DataTable();
dt.Columns.Add("id", typeof(int));
dt.Columns.Add("val", typeof(int));
如果列的顺序错误,则会导致存储过程中的列错误。这意味着如果您的数据表定义如下:
var dt = new DataTable();
dt.Columns.Add("val", typeof(int));
dt.Columns.Add("id", typeof(int));
您的存储过程会将数据表中“val”列中的任何内容作为“id”列,反之亦然。