如何使用 C# ADO.NET 中的参数将行更新插入 DB2 iSeries?

Ond*_*rej 3 c# db2 ado upsert ibm-midrange

我正在尝试编写 SQL 语句,仅当目标表中不存在该行时,才将带参数的多行批量插入到表中。

我在如何将参数标记传递到 SQL 查询中时遇到问题。当我使用下面的代码时,出现异常: “不允许 SQL0584 NULL 或 VALUES 中的参数标记。”

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();
    }
}
Run Code Online (Sandbox Code Playgroud)

请问有什么建议吗?

问题是如何将参数标记传递到 MERGE 查询中。C# 代码没有问题,发送如何在 INSERT 或 UPDATE 语句中传递参数的答案没有帮助。

谢谢。

Ond*_*rej 5

谢谢你,@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)
";
Run Code Online (Sandbox Code Playgroud)