2017-09-11 43 views
1

J'essaye d'écrire l'instruction SQL pour insérer plusieurs rangées dans le lot avec des paramètres dans la table seulement quand la rangée n'existe pas dans la table de cible.Comment augmenter la ligne dans DB2 iSeries en utilisant les paramètres de C# ADO.NET?

J'ai un problème comment passer des marqueurs de paramètre dans la requête SQL. Lorsque j'utilise le code ci-dessous, j'ai une exception: "SQL0584 NULL ou le marqueur de paramètre dans VALUES n'est pas autorisé."

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

Des suggestions, s'il vous plaît?

La question est Comment passer les marqueurs de paramètre dans la requête MERGE. Il n'y a pas de problème avec le code C# et il n'est pas utile d'envoyer des réponses pour passer des paramètres dans les instructions INSERT ou UPDATE.

Merci.

+1

double possible de [paramétrés DB2 Query A partir de .NET] (https://stackoverflow.com/questions/2374698/parameterized-db2-query-from-net) – BugFinder

+0

Pourquoi serait-il pas utile? Les paramètres sont passés de la même manière pour tous les types d'instructions SQL. – jmarkmurphy

+2

Essayez de fournir des informations de type de données explicites dans la clause 'VALUES', par ex. 'VALEURS (CAST (@ colonne1 AS VARCHAR (100)), CAST (@ colonne2 AS INTEGER))' (utilisez les types de données appropriés, bien sûr). – mustaccio

Répondre

1

Merci, @mustaccio!

Le type de données explicite dans l'instruction VALUES (...) a aidé.

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