gpt4 book ai didi

c# - 小巧玲珑/SQL 服务器 : passing TVP to stored procedure with needed fields only

转载 作者:行者123 更新时间:2023-12-05 04:59:31 26 4
gpt4 key购买 nike

我需要将项目集合传递给存储过程。存储过程将它们插入到多个表中。我使用声明的自定义用户类型的表值参数。

TVP 类型:

CREATE TYPE [dbo].[Type1] AS TABLE
(
[Id] [int] IDENTITY(1,1) NOT NULL,
[Field1] [nvarchar](256) NOT NULL,
[Field2] [int] NOT NULL,

PRIMARY KEY NONCLUSTERED ([Id] ASC)
WITH (IGNORE_DUP_KEY = OFF)
)

这是我使用的代码:

var dataTable = new List<SqlDataRecord>();
SqlMetaData[] metaData =
{
new SqlMetaData("Field1", SqlDbType.NVarChar, 256),
new SqlMetaData("Field2", SqlDbType.Int),
};

foreach (var item in items)
{
var record = new SqlDataRecord(metaData);
record.SetValue(0, item.Field1);
record.SetValue(1, item.Field2);
dataTable.Add(record);
}
var parameters = new DynamicParameters(new
{
Items = dataTable.AsTableValuedParameter()
});

await conn.QueryAsync(
sql: "DoSomeJob_Sproc",
param: parameters,
commandType: CommandType.StoredProcedure);

这里的问题是 TVP 类型具有标识符列,在此处插入新项目时不能(实际上也不需要)传递该列。但是如果我没有在记录元数据中指定它,我会得到一个错误

Trying to pass a table-valued parameter with 2 column(s) where the corresponding user-defined table type requires 3 column(s).

问题是:有没有办法显式指定我需要的字段(但不使用片段中所示的序号)?

最佳答案

看来我找到了答案 - 至少是如何在这里忽略身份列:

SqlMetaData[] metaData =
{
new SqlMetaData("IdentityColumn", SqlDbType.Int, true, false, SortOrder.Unspecified, -1),
new SqlMetaData("Field1", SqlDbType.NVarChar, 256),
new SqlMetaData("Field2", SqlDbType.Int),
};

foreach (var item in items)
{
var record = new SqlDataRecord(metaData);
record.SetValue(1, item.Field1); //starting from 1; 0 is for ident col
record.SetValue(2, item.Field2);
dataTable.Add(record);
}

希望这可以帮助其他人。

关于c# - 小巧玲珑/SQL 服务器 : passing TVP to stored procedure with needed fields only,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63476306/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com