2017-09-11 39 views
1

我想編寫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://stackoverflow.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

回答

1

謝謝@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) 
"; 
相關問題