如何使用C#ADO.NET中的参数将行插入到DB2 iSeries中?
问题描述:
我想编写SQL语句,以便只有在目标表中不存在该行时,才能将具有参数的批量多行插入到表中。如何使用C#ADO.NET中的参数将行插入到DB2 iSeries中?
我有一个问题,如何将参数标记传递到SQL查询。当我使用下面的代码时,我得到了异常: “SQL0584 VALUES中的NULL或参数标记不允许。”
using (var conn = new iDB2Connection(_connectionString)) {
await conn.OpenAsync();
using (var tran = conn.BeginTransaction()) {
using (var cmd = conn.CreateCommand()) {
cmd.Transaction = tran;
cmd.CommandText = @"
MERGE INTO TableXYZ AS mt
USING (
VALUES(@column1, @column2)
) AS vt(Column1, Column2)
ON (
mt.Column1 = vt.Column1 AND mt.Column2 = vt.Column2
)
WHEN NOT MATCHED THEN
INSERT (Column1, Column2) VALUES (vt.Column1, vt.Column2)
";
cmd.DeriveParameters();
foreach (var item in items) {
cmd.Parameters["@column1"].Value = item.Column1;
cmd.Parameters["@column2"].Value = item.Column2;
cmd.AddBatch();
}
await cmd.ExecuteNonQueryAsync();
}
tran.Commit();
}
}
有什么建议吗?
问题是如何将参数标记传递到MERGE查询。对于c#代码没有问题,发送如何在INSERT或UPDATE语句中传递参数的答案是没有用的。
谢谢。
答
谢谢@mustaccio!
VALUES(...)语句中的显式数据类型有帮助。
cmd.CommandText = @"
MERGE INTO TableXYZ AS mt
USING (
VALUES(CAST(@column1 AS BIGINT), CAST(@column2 AS BIGINT))
) AS vt(Column1, Column2)
ON (
mt.Column1 = vt.Column1 AND mt.Column2 = vt.Column2
)
WHEN NOT MATCHED THEN
INSERT (Column1, Column2) VALUES (vt.Column1, vt.Column2)
";
[参数DB2查询从.net]的可能的复制(https://stackoverflow.com/questions/2374698/parameterized-db2-query-from-net) – BugFinder
为什么岂不是有帮助吗?所有SQL语句类型的参数都以相同的方式传递。 – jmarkmurphy
尝试在'VALUES'子句中提供显式的数据类型信息,例如'VALUES(CAST(@ column1 AS VARCHAR(100)),CAST(@ column2 AS INTEGER))'(使用适当的数据类型,当然)。 – mustaccio