IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Développement SQL Server Discussion :

Appeler une procédure stockée depuis une application C# Windows Form. [2008R2]


Sujet :

Développement SQL Server

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2012
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2012
    Messages : 21
    Points : 13
    Points
    13
    Par défaut Appeler une procédure stockée depuis une application C# Windows Form.
    Bonjour à tous,
    étant débutant aussi bien en langage SQL qu'en C# je fais appel à votre aide pour m'éclairer sur un problème.
    Je cherche à faire une petite application permettant de stocker des connaissances (fonctions, docs, tips...) dans une BDD puis de venir rechercher et consulter ces données à l'aide d'une procédure stockée selon les paramètres d'entrée définis.
    La procédure fonctionne comme je le souhaite mais je ne comprends pas, malgré de nombreuses recherches sur Internet, comment l'appeler - lui passer les paramètres - voir le résultat depuis une application Windows form C# ne contenant qu'un simple bouton pour le moment (le code est situé dans l'événement clic du bouton).

    *procédure stockée*
    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
     
    ALTER PROCEDURE [dbo].[G4HDC_ConsultationSp](
    @typologie nvarchar(50) = NULL,
    @categorie nvarchar(50)= NULL,
    @libelle nvarchar(200)= NULL,
    @description nvarchar(MAX)= NULL,
    @createur nvarchar(50)= NULL)
     
    AS
    BEGIN 
     
     
    	SELECT * 
    	FROM  HDC_connaissance
            WHERE typologie  LIKE isnull('%'+@typologie+'%',typologie) and    categorie LIKE isnull('%'+@categorie+'%',categorie) and libelle LIKE  isnull('%'+@libelle+'%',libelle) 
    	      and description LIKE isnull('%'+@description+'%',description) and createur LIKE isnull('%'+@createur+'%',createur)
    	ORDER BY typologie,categorie,createur,libelle,description
     
     
    END
    *code (C#) de l'événement "clic" du bouton*
    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
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
     
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    using System.Data.SqlClient;
     
    namespace WindowsFormsApplication1
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
     
            }
     
            private void Form1_Load(object sender, EventArgs e)
            {
     
            }
     
            private void button1_Click(object sender, EventArgs e)
            {
     
                SqlConnection cnx;
                cnx = new SqlConnection("Data Source=****;Initial Catalog=****;User Id=****;Password=****");
     
                SqlCommand maCommande;
                maCommande = new SqlCommand();
                maCommande.CommandText = "G4HDC_ConsultationSp";
                maCommande.CommandType = CommandType.StoredProcedure;
                maCommande.Connection = cnx;
     
                SqlParameter parm1 = new SqlParameter("@typologie", SqlDbType.NVarChar);
                parm1.Value = null;
                parm1.Direction = ParameterDirection.InputOutput;
                maCommande.Parameters.Add(parm1);
     
                SqlParameter parm2 = new SqlParameter("@categorie", SqlDbType.NVarChar);
                parm2.Value = null;
                parm2.Direction = ParameterDirection.InputOutput;
                maCommande.Parameters.Add(parm2);
     
                SqlParameter parm3 = new SqlParameter("@libelle", SqlDbType.NVarChar);
                parm3.Value = null;
                parm3.Direction = ParameterDirection.InputOutput;
                maCommande.Parameters.Add(parm3);
     
                SqlParameter parm4 = new SqlParameter("@description", SqlDbType.NVarChar);
                parm4.Value = "écart";
                parm4.Direction = ParameterDirection.InputOutput;
                maCommande.Parameters.Add(parm4);
     
                SqlParameter parm5 = new SqlParameter("@createur", SqlDbType.NVarChar);
                parm5.Value = null;
                parm5.Direction = ParameterDirection.InputOutput;
                maCommande.Parameters.Add(parm5);
     
                SqlParameter parm6 = new SqlParameter("@date_creation", SqlDbType.DateTime);
                parm6.Value = null;
                parm6.Direction = ParameterDirection.Output;
                maCommande.Parameters.Add(parm6);
     
                SqlParameter parm7 = new SqlParameter("@emplct_fichier", SqlDbType.NVarChar);
                parm7.Value = null;
                parm7.Direction = ParameterDirection.Output;
                maCommande.Parameters.Add(parm7);
     
                cnx.Open();
                SqlDataReader Rdata;
                Rdata = maCommande.ExecuteReader();
                cnx.Close();
     
                MessageBox.Show(parm1.Value.ToString());
     
            }
        }
    }
    Dans cet exemple, je passe la valeur "écart" à mon paramètre parm4 (InputOutput) et je veux que mon paramètre parm1 (InputOutput) s'affiche en sortie avec le résultat de la procédure stockée. Mais lorsque je lance le débogage et que je clic sur le bouton rien ne se passe et une erreur "InvalidOperationException n'a pas été gérée - String[0] : la propriété Size a une taille non valide, 0." apparaît.

    Merci d'avance pour votre aide, vos pistes.

  2. #2
    Membre actif
    Avatar de SQL_EVAN
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Juillet 2011
    Messages
    161
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Thaïlande

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Conseil

    Informations forums :
    Inscription : Juillet 2011
    Messages : 161
    Points : 245
    Points
    245
    Par défaut
    Je ne suis pas développeur C# mais les dévs dans mes équipes ont souvent parlé de Entity Framework pour faciliter la jointure entre la couche SGBDR et application en C#

    http://msdn.microsoft.com/en-us/data/ef.aspx
    "Toute technologie suffisamment avancée est indiscernable de la magie." - Arthur C. Clarke

    Evan Barke - Ingénieur d'Etudes et Développement SQL Server
    Blog SQL Server, T-SQL, SSIS, Administration www.transactivesql.com
    Twitter - TransactiveSQL
    N'oubliez pas les boutons et

  3. #3
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2012
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2012
    Messages : 21
    Points : 13
    Points
    13
    Par défaut
    @SQL EVAN : merci d'avoir pris le temps de me lire, j'ai regardé le package Entity Framework cela peut être intéressant mais dans un premier temps je préférerai essayer de trouver la solution dans le code C# pour appeler ma stored procedure car je ne pense pas en être bien loin. Si d'autres idées je suis preneur .
    Merci a tous

  4. #4
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2012
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2012
    Messages : 21
    Points : 13
    Points
    13
    Par défaut
    Quelqu’un aurait une piste pour le code C# ?
    Je pense que le connexion à la BDD est bonne mais je ne passe surement pas les paramètres comme il le faudrait à la procédure (même si j'ai l'impression de suivre à la lettre certains tutos sur internet). Idem pour récupérer et afficher le résultat de ma procédure stockée, je ne pense pas bien me servir de la fonction "ExecuteReader".

  5. #5
    Membre éprouvé
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2009
    Messages
    623
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Août 2009
    Messages : 623
    Points : 1 049
    Points
    1 049
    Par défaut
    Tu passes plus de paramètres à ta procédure qu'elle en a. En plus, tu définis en C# des paramètres output sans que la procédure stockée les envoie.

    Il y a plusieurs façon de faire. Soit tu ne passes à ta procédure que des paramètres input et tu récupère le résultat dans un DataTable par exemple. Soit tu crées des paramètres output à ta procédure pour pouvoir les utiliser.

    Edit : tu trouveras toutes les informations ici
    Blog Perso | Kankuru (logiciel gratuit pour SQL Server)

  6. #6
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2012
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2012
    Messages : 21
    Points : 13
    Points
    13
    Par défaut
    @darkelend : merci beaucoup j'essaie de suite de faire un tri dans mes paramètres.

    edit : j'ai supprimé les paramètres d'entrées qui étaient de trop et redéfinis les autres en Input au lieu de InputOutput. Mais je ne comprends pas comment récupérer le résultat dans un DateTable ni le rôle du ExecuteReader à la fin de mon code. Merci de ton aide darkelend.

  7. #7
    Expert confirmé
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Points : 4 239
    Points
    4 239
    Par défaut
    Hello,

    Voici un bout de code pour t'aider.

    C'est du VB mais y a des traducteurs de vb vers c# (sur developerfusion je crois notamment).

    Code vb : 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
     
    'création de la connexion
    Using cnx As new SqlConnection(la_connectionString_qui_va_bien)
        'création de la commande
        Using cmd as SqlCommand = cnx.CreateCommand
            cmd.CommandType = StoredProcedure
            cmd.CommandText = MaStoredProcedure
            'ajout des paramètres
            cmd.Parameter.Add(le_parametre_qui_va_bien)
     
            'ouverture de la connexion
            cnx.Open()
     
            'exécution de la procédure stockée
            'procédure renvoyant un jeu de résultat
            Using dr as SqlDataReader = cmd.ExecuteReader
                If dr.HasRows Then
                    While dr.Read
                        result.Add(New MonObjet(dr.item(0), ..., dr.item(n))
                    End While
                End If
            End Using
     
            'procédure ne renvoyant pas de jeu de résultat
            cmd.ExecuteNonQuery()      
        End Using
    End Using
    Où result est une liste d'objet du type adéquat (suivant ce que tu as besoin de recevoir). Tu peux aussi, plutôt que de créer une liste, instancier une datatable et la remplir dans la boucle while.

    Les deux petits blocs après le commentaire "exécution de la procédure stockée sont là pour illustrer les 2 cas possibles. Tu ne dois pas avoir les 2. Ce sera soit l'un, soit l'autre.

    En espérant avoir aidé
    Kropernic

  8. #8
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2012
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2012
    Messages : 21
    Points : 13
    Points
    13
    Par défaut
    @kropernic : merci beaucoup je vais me pencher sur la boucle renvoyant un jeu de résultat et essayer de l'intégrer dans mon code.

  9. #9
    Expert confirmé
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Points : 4 239
    Points
    4 239
    Par défaut
    Maintenant, ce que je t'ai montré, c'est la méthode que j'utilise personnellement et vers laquelle tu semblais te diriger dès le départ.

    Il en a également une seconde où on utilise les datasets et où tout peut se faire en mode design. Cette méthode ne nécessite plus que quelques lignes de code.

    Personnellement, je ne suis pas fan car VS écrit alors plein de code à notre place et qu'on n'a plus aucun contrôle dessus.

    Je ne vais pas te donner la marche à suivre car je ne la connais plus mais tu pourras la retrouver facilement dans le cours de Mr. Lasserre que tu peux trouver ici. Bon, c'est un cours de VB mais les traducteurs de code existent toujours ;-).
    Kropernic

  10. #10
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2012
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2012
    Messages : 21
    Points : 13
    Points
    13
    Par défaut
    @kropernic : merci encore pour ta précieuse aide qui m'a bien aiguillé. J'ai instancié un DataTable, défini mes colonnes mais lorsque je lance le débogage et que je clic sur le bouton de mon projet rien ne se passe : pas d'erreur mais pas de résultat non plus
    Je suppose que je ne dois pas remplir mon DataTable correctement ou/et j'utilise surement la classe SqlDataAdapter d'une mauvaise manière.

    *code C# de l'événement clic du bouton*

    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
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    using System.Data.SqlClient;
     
    namespace WindowsFormsApplication1
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
     
            }
     
            private void Form1_Load(object sender, EventArgs e)
            {
     
            }
     
            private void button1_Click(object sender, EventArgs e)
            {
     
                SqlConnection cnx;
                cnx = new SqlConnection("Data Source=PC601;Initial Catalog=G4_HDC;User Id=sa;Password=****;");
     
                SqlCommand maCommande;
                maCommande = new SqlCommand();
                maCommande.CommandType = CommandType.StoredProcedure;
                maCommande.CommandText = "G4HDC_ConsultationSp";
                maCommande.Connection = cnx;
     
                SqlParameter parm1 = new SqlParameter("@typologie", SqlDbType.NVarChar);
                parm1.Value = null;
                parm1.Direction = ParameterDirection.Input;
                maCommande.Parameters.Add(parm1);
     
                SqlParameter parm2 = new SqlParameter("@categorie", SqlDbType.NVarChar);
                parm2.Value = null;
                parm2.Direction = ParameterDirection.Input;
                maCommande.Parameters.Add(parm2);
     
                SqlParameter parm3 = new SqlParameter("@libelle", SqlDbType.NVarChar);
                parm3.Value = null;
                parm3.Direction = ParameterDirection.Input;
                maCommande.Parameters.Add(parm3);
     
                SqlParameter parm4 = new SqlParameter("@description", SqlDbType.NVarChar);
                parm4.Value = null;
                parm4.Direction = ParameterDirection.Input;
                maCommande.Parameters.Add(parm4);
     
                SqlParameter parm5 = new SqlParameter("@createur", SqlDbType.NVarChar);
                parm5.Value = null;
                parm5.Direction = ParameterDirection.Input;
                maCommande.Parameters.Add(parm5);
     
                cnx.Open();
     
                /*SqlDataReader Rdata;
                Rdata = maCommande.ExecuteReader();*/
     
                System.Data.DataTable workTable = new DataTable("Connaissance_G4");
     
                DataColumn column;
                DataColumn column1;
                DataColumn column2;
                DataColumn column3;
                DataColumn column4;
                DataColumn column5;
                DataColumn column6;
                DataColumn column7;
                /*DataRow row;*/
     
                column = new DataColumn();
                column.DataType = System.Type.GetType("System.Int32");
                column.ColumnName = "Id";
                column.ReadOnly = true;
                column.Unique = true;
                workTable.Columns.Add(column);
     
                column1 = new DataColumn();
                column1.DataType = System.Type.GetType("System.String");
                column1.ColumnName = "Typologie";
                column1.ReadOnly = true;
                column1.Unique = false;
                workTable.Columns.Add(column1);
     
                column2 = new DataColumn();
                column2.DataType = System.Type.GetType("System.String");
                column2.ColumnName = "Categorie";
                column2.ReadOnly = true;
                column2.Unique = false;
                workTable.Columns.Add(column2);
     
                column3 = new DataColumn();
                column3.DataType = System.Type.GetType("System.String");
                column3.ColumnName = "Libelle";
                column3.ReadOnly = true;
                column3.Unique = false;
                workTable.Columns.Add(column3);
     
                column4 = new DataColumn();
                column4.DataType = System.Type.GetType("System.String");
                column4.ColumnName = "Description";
                column4.ReadOnly = true;
                column4.Unique = false;
                workTable.Columns.Add(column4);
     
                column5 = new DataColumn();
                column5.DataType = System.Type.GetType("System.String");
                column5.ColumnName = "Createur";
                column5.ReadOnly = true;
                column5.Unique = false;
                workTable.Columns.Add(column5);
     
                column6 = new DataColumn();
                column6.DataType = System.Type.GetType("System.DateTime");
                column6.ColumnName = "Date_Creation";
                column6.ReadOnly = true;
                column6.Unique = false;
                workTable.Columns.Add(column6);
     
                column7 = new DataColumn();
                column7.DataType = System.Type.GetType("System.String");
                column7.ColumnName = "Emplct_Fichier";
                column7.ReadOnly = true;
                column7.Unique = false;
                workTable.Columns.Add(column7);
     
                SqlDataAdapter adapter = new SqlDataAdapter();
                adapter.SelectCommand = maCommande;
                adapter.Fill(workTable);
     
                cnx.Close();
     
     
            }
        }
    }
    Merci d'avance pour ton aide et ta réactivité, il est vrai que je maîtrise très peu mon sujet et que mes recherches personnelles ne sont pas toujours très fructueuses

  11. #11
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Points : 12 371
    Points
    12 371
    Par défaut
    Bonjour,

    Je subodore que le composant graphique dans lequel vous souhaitez montrer le résultat est un DataGridView.
    Supposons que celui-ci est nommé dataGridView1 : il vous manque donc :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    dataGridView1.DataSource = worktable;
    Ce bout de code est à mettre juste avant cnx.Close();

    @++

  12. #12
    Expert confirmé
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Points : 4 239
    Points
    4 239
    Par défaut
    +1 avec Elsuket.

    C'est que j'étais en train d'écrire quand mon téléphone à sonner...

    Cependant, si vous continuez à rencontrer des problèmes, faites un tour du côté du forum .NET>Langages>C#. Ces sujets ont déjà été traités maintes et maintes fois .

    De plus, les solutions fournies seraient directement en C#
    Kropernic

  13. #13
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2012
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2012
    Messages : 21
    Points : 13
    Points
    13
    Par défaut
    @elsuket : tout d’abord merci pour ton aide.
    J'ai inséré ce bout de code mais je n'ai toujours aucun résultat à l'affichage, aurais tu une idée ? Il y a surement quelque chose qui cloche dans mon code mais après de nombreuses relectures je ne trouve toujours pas.

    Voilà le bout de code que j'ai rajouté avant le cnx.Close(); de mon code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SqlDataAdapter adapter = new SqlDataAdapter();
                adapter.SelectCommand = maCommande;
                adapter.Fill(workTable);
     
                DataGridView dataGridViewResult = new DataGridView();
                dataGridViewResult.DataSource = workTable;
     
                cnx.Close();
    Malgré l'ajout de ces deux lignes avant le cnx.Close(); rien ne change je dois me tromper quelque part.

  14. #14
    Expert confirmé
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Points : 4 239
    Points
    4 239
    Par défaut
    En parlant de l'hypothèse que votre projet est de type Windows Form, faites ceci pour tester :

    1. ajoutez une nouvelle form nommée "frmTest"
    2. sur frmTest, déposez via l'interface graphique de visual studio un composant de type DataGridView (onglet data dans la toolbox) et nommez le "dgvTest"
    3. sur frmTest, déposer via l'interface graphique, un bouton nommé "btnTest".
    4. double-cliquez sur le bouton (cela ouvre la fenêtre de code, crée la procédure pour gérer l'évènement clic du bouton et y place le curseur)
    5. créez une variable globale à la form nommée "tbTest" de type DataTable
    6. créez une nouvelle procédure nommée "LoadData" dans laquelle vous copiez-collez le code que vous écrit dans l'évènement de votre bouton et qui pose actuellement problème sans l'ajout proposé par elsuket (replacez votre worktable par ma tbTest ).
    7. dans la gestion d’événement créée au point 4, mettez le code suivant :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      LoadData()
      dgvTest.DataSource = tbTest
    8. Testez.

    A venir, un exemple de code.
    Kropernic

  15. #15
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2012
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2012
    Messages : 21
    Points : 13
    Points
    13
    Par défaut
    @kropernic : merci de votre investissement. Je pars manger et je teste dès que je peux la solution proposée.

  16. #16
    Expert confirmé
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Points : 4 239
    Points
    4 239
    Par défaut
    Quand je disais que je ne maitrisais pas bien cette méthode, je ne mentais pas...

    En écrivant un exemple de code, je me suis rendu compte que j'ai dit quelques âneries dans mon message précédent.

    Bref, voici un exemple de code que vous pouvez compléter pour votre usage.
    Code vb : 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
    Imports System.Data.SqlClient
     
    Public Class frmTest
     
        Private Sub LoadData()
            Using cnx As SqlConnection = New SqlConnection("Data Source=PC601;Initial Catalog=G4_HDC;User Id=sa;Password=****;")
                Using cmd As SqlCommand = cnx.CreateCommand
                    cmd.CommandText = "G4HDC_ConsultationSp"
                    cmd.CommandType = CommandType.StoredProcedure
     
                    Dim prm1 As New SqlParameter("@typologie", SqlDbType.NVarChar, 1000) 'vous oubliez de préciser la taille de vos paramètres litéraux...  J'ai mis 1000 au hasard.
                    prm1.Value = DBNull.Value
                    prm1.Direction = ParameterDirection.Input
                    cmd.Parameters.Add(prm1)
     
                    'la même chose pour les autres paramètres
     
                    Dim tbTest = New DataTable("Connaissance_G4")
     
                    Dim col As DataColumn
     
                    col = New DataColumn("Id")
                    col.DataType = Type.GetType("System.Int32")
                    col.ReadOnly = True
                    col.Unique = False
                    tbTest.Columns.Add()
     
                    col = New DataColumn("Typologie")
                    col.DataType = Type.GetType("System.String")
                    col.ReadOnly = True
                    col.Unique = False
                    tbTest.Columns.Add(col)
     
                    'etc pour les autres colonnes
     
                    Using da As SqlDataAdapter = New SqlDataAdapter(cmd)
                        da.Fill(tbTest)
                        dgvTest.DataSource = tbTest
                    End Using
                End Using
            End Using
        End Sub
     
        Private Sub btnTest_Click(sender As System.Object, e As System.EventArgs) Handles btnTest.Click
            LoadData()
        End Sub
    End Class

    A priori, cela devrait fonctionner mais je n'aime pas car tbTest n'existe qu'au sein de la procédure LoadData. Il n'est pas possible de faire le moindre traitement sur les résultats en dehors de cette procédure (à moins d'en faire une copie).

    Voici comment personnellement je ferais :
    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
    Imports System.Data.SqlClient
     
    Public Class MonObjet
        Public Property Id As Integer
        Public Property Typologie As String
        'etc pour les autres colonnes de votre datatable
     
        Public Sub New(id As Integer, typologie As String) 'arguments à compléter avec vos colonnes mais attention aux valeurs nulles provenant de la DB !!!
            Me.Id = id
            Me.Typologie = typologie
        End Sub
    End Class
     
    Public Class frmTest
        Dim data As List(Of MonObjet)
     
        Private Sub LoadData()
            Using cnx As SqlConnection = New SqlConnection("Data Source=PC601;Initial Catalog=G4_HDC;User Id=sa;Password=****;")
                Using cmd As SqlCommand = cnx.CreateCommand
                    cmd.CommandText = "G4HDC_ConsultationSp"
                    cmd.CommandType = CommandType.StoredProcedure
     
                    Dim prm1 As New SqlParameter("@typologie", SqlDbType.NVarChar, 1000) 'vous oubliez de préciser la taille de vos paramètres litéraux...  J'ai mis 1000 au hasard.
                    prm1.Value = DBNull.Value
                    prm1.Direction = ParameterDirection.Input
                    cmd.Parameters.Add(prm1)
     
                    'la même chose pour les autres paramètres
     
                    Using dr As SqlDataReader = cmd.ExecuteReader
                        If dr.HasRows Then
                            data = New List(Of MonObjet)
                            While dr.Read
                                data.Add(New MonObjet(CInt(dr.Item("id")), CStr(dr.Item("typologie")))) 'id et typologie sont en fait les noms des colonnes retournées par votre procédure stockées.  A compléter bien sûr
                            End While
                        End If
                    End Using
                End Using
            End Using
        End Sub
     
        Private Sub btnTest_Click(sender As System.Object, e As System.EventArgs) Handles btnTest.Click
            LoadData()
            dgvTest.DataSource = data
        End Sub
    End Class
    Il y a bien sûr encore moyen d'améliorer tout cela.
    Kropernic

  17. #17
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2012
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2012
    Messages : 21
    Points : 13
    Points
    13
    Par défaut
    super ! merci à vous kropernic et elsuket je sens que je suis près du but. Merci de vous être investi dans mon projet.

    Une dernière petite question : dans Visual c# 2010 express, lorsque je clic sur connexion de données > ajouter une connexion > et que je sélectionne mon fichier ".mdf" de ma BDD j'ai un message d'erreur qui me dit que le fichier ne peut pas être lié au projet car il est déjà en cours d'utilisation et ce même lorsque je ferme MS SQL Server. Je ne vois pas de quoi cela peut venir.

  18. #18
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2012
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2012
    Messages : 21
    Points : 13
    Points
    13
    Par défaut
    Problème définitivement résolu grâce à votre aide. Le code de kropernic fonctionne parfaitement. Un grand MERCI.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 3
    Dernier message: 30/12/2008, 09h33
  2. Réponses: 7
    Dernier message: 18/01/2008, 18h01
  3. Réponses: 27
    Dernier message: 08/03/2007, 16h09
  4. Appel d'une procédure stockée dans une procédure stockée
    Par MrEddy dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 13/09/2006, 16h17
  5. Réponses: 3
    Dernier message: 17/01/2006, 17h12

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo