代码之家  ›  专栏  ›  技术社区  ›  Ondrej

如何使用C#ADO中的参数将行插入DB2 iSeries。网络?

  •  3
  • Ondrej  · 技术社区  · 7 年前

    我试图编写SQL语句,仅当目标表中不存在多行时,才使用参数将多行批量插入表中。

    如何将参数标记传递到SQL查询中,我遇到了一个问题。当我使用下面的代码时,出现了异常:

    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();
        }
    }
    

    有什么建议吗?

    问题是 如何将参数标记传递到合并查询中

    谢谢

    1 回复  |  直到 7 年前
        1
  •  4
  •   Ondrej    7 年前

    值(…)中的显式数据类型声明起到了帮助作用。

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