2017-09-11 2 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

可能な複製(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) 
"; 
[.NETからパラメータ化されたDB2クエリー]の
関連する問題