Bonjour à tous.

J'ai décidé (enfin) de passer à C# et je me trouve confronté à un souci que je ne comprends pas puisque la même chose en VB fonctionne.

J'ai une erreur sur une SqlParameter qui serait déjà utilisé et je comprends pas pourquoi il me remonte cette erreur.
Je vais vous présenter mon code :
Dans ma page :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
protected void Page_Load(object sender, EventArgs e)
    {
        SqlParameter[] LParam = new SqlParameter[1];
        LParam[0] = new SqlParameter("Urlsite", "Test");
        string testDB = DataAccess.RetounerScalaire("SELECT 1", LParam);
        System.Data.DataTable DT = DataAccess.RetournerTable("SELECT * FROM Heros", LParam);
        Outil.Logage(testDB);
        Outil.Logage(DT.Rows[0].ItemArray[1].ToString());
    }
En gros je fais quoi ? Je monte un tableau de paramètre (même si là il n'y en a qu'un seul, c'est pas très grave, c'est un exercice). Ensuite j'appelle ma fonction pour me retourner soit un scalaire soit une datatable de la BDD. Pour l'exercice, j'ai utilisé le la même tableau de paramètre, histoire de faire simple, mais dans mes sites en VB.NET cela m'arrive d'utiliser le même tableau pour plusieurs requêtes et ça marche bien.

Maintenant vous voulez voir ce qu'il se passe dans ma fonction (je vous donne toute la classe, comme ça, il n'y a pas de manque et vous verrez, c'est assez basique comme idée, mais ça rend bien service pour aller chercher les données dans la BDD) :
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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
public class DataAccess
{
    /// <summary>
    /// Constructeur de la classe DataAccess pour récupérer les données par l'envoi de trois paramètres
    /// </summary>
    /// <param name="Requete">La requête para lle même, en code SQL avec les alias des paramètres.</param>
    /// <param name="Pram">Le tableau de paramètres associé et préparé en amont dans le code.</param>
    /// <param name="TypeRQ">Une chaine donant une indication sur le type de résultat attendu. Pour l'instant c'est TB pour une table, SC pour un scalaire</param>
	public DataAccess()
	{
 
	}
    public static DataTable RetournerTable(string Requete, SqlParameter[] Param)
    {
        return RemplirTable(Requete,Param);
    }
    public static string RetounerScalaire(string Requete, SqlParameter[] Param)
    {
        DataTable LaTable = RemplirTable(Requete, Param);
        string str = "";
        if (LaTable.Rows.Count == 0)
        {
            str = "";
        }
        else
        {
            str = LaTable.Rows[0].ItemArray[0].ToString();
        }
        return str;
    }
    /// <summary>
    /// Récupération du résultat de la requeête dans une DataTable qui sera analysée en retour dans le constructeur.
    /// </summary>
    /// <param name="Requete">La requête en dur sous forme de chaine avec les alias des paramètres</param>
    /// <param name="Param">Le tableau de paramètres monté en amont</param>
    /// <returns></returns>
    public static DataTable RemplirTable(string Requete, SqlParameter[] Param) 
    {
        //Récuparation de la chaine de connection dans le fichier de configuration (web.config)
        SqlConnection oConnex = new SqlConnection(ConfigurationManager.ConnectionStrings["DataDev"].ConnectionString);
        //Définition de la datatable de récupération des données
        DataTable Table = new DataTable();
        //Exécution de la requête et remplissage de la DataTable pour renvoi
        try
        {
            SqlCommand oCommand = new SqlCommand(Requete);
            SqlDataAdapter Adapteur = new SqlDataAdapter(oCommand);
            SqlCommandBuilder oCommandBuilder = new SqlCommandBuilder(Adapteur);
            oConnex.Open();
            oCommand.Connection = oConnex;
            oCommand.Parameters.AddRange(Param);
            Adapteur.Fill(Table);
        }
        catch (System.IO.IOException e)
        {
            Outil.Logage(e.Message);
            Outil.Logage(Requete);
            //throw;
        }
        finally
        {
            oConnex.Close();
        }
        return Table;
    }
}
Le plantage se fait sur la ligne " oCommand.Parameters.AddRange(Param);" avec le message d'erreur suivant :
L'élément SqlParameter est déjà contenu dans un autre SqlParameterCollection.
Je ne comprends pas pourquoi il me dit qu'il est déjà là alors que je fais appel à une autre requête en fait.
Est ce que C# ne gère pas la mémoire comme VB.NET (certainement) ?
Est ce que j'ai merdé sur ma classe avec le constructeur ?
Et si oui, comment je corrige le truc ?

Merci pour votre aide.