Bonjour,

Je souhaite réaliser une application qui modifie des données dans une base. Je souhaite que celle-ci, en lui passant un paramètre (dans la suite, ce sera le booléen reportOnly), exécute ou "simule" l'éxécution de ce traitement.
Dans les deux cas, je souhaite afficher ce qui est modifié / aurait été modifié.

Pour insérer, j'utilise une requête de la forme INSERT... SELECT...
Ainsi, pour afficher ce qui aurait été inséré, seule la clause SELECT (et tout ce qui suit) est à prendre en compte.

Le code mis en place est le suivant :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
StringBuilder SqlCmd = new StringBuilder(String.Empty);
 
// Construction de la requete
SqlCmd.Append("SELECT DISTINCT ... ");
// etc
 
// Liste de paramètres : utilisateur à habiliter
OleDbParameter[] parametersList = new OleDbParameter[1];
 
// Affectation du paramètre
parametersList[0] = new OleDbParameter("@Par1", valeur);
 
// Recuperation lignes
OleDbDataReader dataReader = null;
dataReader = ReturnDrFromSqlCommand(SqlCmd.ToString(), parametersList);
try
{
  while (dataReader.Read())
  {
    // Pour chaque ligne du dataReader, recuperation des infos
  }
}
finally
{
  dataReader.Close();
}
if (!reportOnly)
{
  // Exécution (insertion)   
  string SqlCmd2 = "INSERT INTO ... " + SqlCmd.ToString();
  ExecuteQueryOnDataBase(SqlCmd2.ToString(), parametersList);
}
Si cela peut être utile, le code de la méthode ExecuteQueryOnDataBase :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public void ExecuteQueryOnDataBase(string sqlCommand, OleDbParameter[] sqlParameters)
{
  OleDbCommand oCommand = null;
 
  oCommand = new OleDbCommand(sqlCommand, DataLayer.SqlCnx);
  try
  {
    oCommand.CommandType = CommandType.Text;
    foreach (OleDbParameter parameter in sqlParameters)
      {
        oCommand.Parameters.Add(parameter);
      }
 
      oCommand.ExecuteNonQuery();
  }
  finally
  {
    oCommand.Parameters.Clear();
    oCommand.Dispose();
  }
}
et de ReturnDrFromSqlCommand :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
public static OleDbDataReader ReturnDrFromSqlCommand(IDbConnexion connexion, string sqlText)
{
    OleDbCommand command;
    OleDbDataReader dataReader;
 
    if (!connexion.Connected)
        connexion.Connect();
 
 
    command = new OleDbCommand(sqlText, connexion.SqlCnx);
 
    try
    {
        dataReader = command.ExecuteReader();
    }
    catch (OleDbException exc)
    {
        throw new EStarnetException(exc, sqlText);
    }
    finally
    {
        command.Dispose();
    }
 
    return dataReader;
}
Et voilà mon problème : lors de l'éxécution de la seconde requête (celle d'insertion), j'obtiens le message d'erreur suivant dans les log :
2008-07-04 15:42:59,543 ERROR MonBatch.MonBatch - Exception: System.ArgumentException
Message: L'élément OleDbParameter est déjà contenu dans un autre OleDbParameterCollection.
Source: System.Data
J'avoue que je ne vois pas en quoi ça pose un problème, ni comment résoudre ceci proprement (j'ai bien des idées sales à base de copie / duplication de code... mais je ne veux même pas y penser).

Merci pour votre aide !

Alban