如何使用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语句中传递参数的答案是没有用的。

谢谢。

+1

[参数DB2查询从.net]的可能的复制(https://*.com/questions/2374698/parameterized-db2-query-from-net) – BugFinder

+0

为什么岂不是有帮助吗?所有SQL语句类型的参数都以相同的方式传递。 – jmarkmurphy

+2

尝试在'VALUES'子句中提供显式的数据类型信息,例如'VALUES(CAST(@ column1 AS VARCHAR(100)),CAST(@ column2 AS INTEGER))'(使用适当的数据类型,当然)。 – mustaccio

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