Bonjour,

J'essaye depuis quelques temps de faire une requête paramétrée en VB.NET, requête que voici :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
                strRequete = "SELECT nom_mainmenu, " & _
                            "nom_section, " & _
                            "nom_sous_section " & _
                     "FROM mainmenu M " & _
                            "LEFT OUTER JOIN Sections S " & _
                                "ON M.id_mainmenu = S.id_mainmenu " & _
                            "LEFT OUTER JOIN sous_sections SS " & _
                                "ON S.id_section = SS.id_section " & _
                     "WHERE M.id_site_web = @id_siteweb"
L'unique paramètre que j'utilise se situe dans la clause WHERE de ma requête, et pour le rendre effectif, il faut bien sur le déclarer, et c'est bien là qu'est le problème.
Après plusieurs heures à faire des recherche avec mon amis Google et le Cours/Tutoriaux de Developpez.net, je n'obtiens aucun résultat.

Voici une partie de mon code :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
        Dim oConnection As New OleDb.OleDbConnection(My.Settings.ChaineCnx)
        oConnection.Open()
        Dim strRequete As String
'Position de l'assignation de valeur d'strRequete (la requête situé au dessus)
        Dim oCmdSQL As OleDbCommand = New OleDbCommand(strRequete, oConnection)
        oCmdSQL.Parameters.Add(New OleDbParameter("@id_siteweb", OleDbType.Integer, 12))
        oCmdSQL.Parameters("@id_siteweb").Value = Tmp 'Tmp est déclaré plus haut
Au niveau de la value je préfèrerais utiliser directement ma ComboBox via sa propriété DisplayMember, ou SelectedValue, mais ceci est un détail.

ComboBox que voici :

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
    Private Sub ChargeCbBox()
        'Paramètres de la requête
        Dim oConnection As New OleDb.OleDbConnection(My.Settings.ChaineCnx)
        Dim strRequete As String = "SELECT id_site_web, lib_site_web " & _
                                   "FROM sites_web"
        oConnection.Open()
        Dim oCmdSQL As New OleDb.OleDbCommand(strRequete, oConnection)
        Dim rsSite As OleDb.OleDbDataReader = oCmdSQL.ExecuteReader
        Dim oDataTable As New DataTable
        oDataTable.Load(rsSite)
 
        'Remplissage dynamique de la combo box
        With CB_CHOIXSITE
            .ValueMember = "id_site_web"
            .DisplayMember = "lib_site_web"
            .DataSource = oDataTable
        End With
 
        'Fermeture des accés à la base de données
        rsSite.Close()
        oConnection.Close()
    End Sub
Enfin bref, lorsque je m'efforce d'utiliser cette requête, je retombe inlassablement sur l'erreur :
La Variable scalaire @id_siteweb doit être déclaré.
Or, j'ai réussi à ne trouver que 3 codes équivalents à mes deux dernières lignes présentées si dessus, aboutissant tous à ce résultat, j'en déduis donc qu'il manque autre chose.

Le but est d'observer le résultat dans une DataGridView dans un premier temps, puis répartir les information dans un TreeView au final.

J'espère avoir été clair, si quelqu'un sait d'où vient le problèmes, merci de m'informer. Si il vous manque des information, il suffit de me demander.

PS: J'utilise Visual Studio 2008 et en base de donnée SQL server 2005

PS2: Petite question annexe sans importance, la déclaration d'objet sur 1 ligne est plus couteuse en terme de performance ou autre? Ou cela n'à aucune importance
Ex:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
Dim oConnection As New OleDb.OleDbConnection(My.Settings.ChaineCnx)
Plutot que:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
Dim oConnection As OleDb.OleDbConnection
oConnection = New OleDb.OleDbConnection(My.Settings.ChaineCnx)