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

How to upsert row into DB2 iSeries using parameters in C# ADO.NET?

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

我在如何将参数标记传递到 SQL 查询时遇到问题。当我使用下面的代码时出现异常: "SQL0584 NULL or parameter marker in VALUES not allowed."

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)
";