如何使用C#ADO.NET?

时间:2017-09-11 09:35:48

标签: c# db2 ado ibm-midrange upsert

我尝试编写SQL语句,只有当目标表中不存在行时,才会批量插入带有参数的多行。

我有一个问题如何将参数标记传递给SQL查询。当我使用下面的代码时,我得到了异常: "不允许在VALUES中使用SQL0584 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语句中传递参数没有帮助。

感谢。

1 个答案:

答案 0 :(得分:2)

谢谢,@ 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)
";