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

C# Discussion :

SqlAdapter et procédure stockée


Sujet :

C#

  1. #1
    Membre du Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Novembre 2014
    Messages
    70
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Dordogne (Aquitaine)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2014
    Messages : 70
    Points : 40
    Points
    40
    Par défaut SqlAdapter et procédure stockée
    bonjour,

    Mon objectif au départ est d'arriver à utiliser une procédure stockée avec un argument en entrée pour définir la clause "where" de mon select !
    Face à mon échec, j'essaye de simplifier :

    Ma procédure stockée (simple select) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    USE [test]
    GO
    /****** Object:  StoredProcedure [dbo].[p_liste_tache]    Script Date: 07/11/2015 19:21:07 ******/
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    ALTER PROCEDURE [dbo].[p_liste_tache]
     
    AS
     select Id_tache,demande_tache,date_tache as Date,intervenant_tache as Intervenant,detail_tache as Detail from tblDemandeTache where demande_tache='96';

    Une partie de mon code C#
    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
    try
      {
     
         String connectionString = "Data Source=CHNET\\SQLEXPRESS;Initial Catalog=test;User ID=sa;Password=*";
         SqlConnection connection = new SqlConnection(connectionString);
     
     
    // Create a DataSet.
    DataSet data = new DataSet();
    data.Locale = System.Globalization.CultureInfo.InvariantCulture;
    SqlCommand cmd = new SqlCommand("p_liste_tache",connection);
    cmd.CommandType = CommandType.StoredProcedure;
    SqlDataAdapter masterDataAdapter = new
    SqlDataAdapter(cmd);
    masterDataAdapter.Fill(data, "tblDemandeTache");
    Je ne passe pour l'instant volontairement de paramètre à ma procédure !
    Si j'éxécute ma procédure dans SqlServer, elle me retourne bien l'enregistrement par contre, le code C# lui ne retourne rien ("derrière un bind sur un
    controle GridView construit à la volée) !
    Par contre si dans ma procédure je supprime la clause "where demande_tache='96';" le DataSet est bien alimenté et mon code C# fonctionne.
    J'ai préféré ne pas vous coller tout mon code C# cela n'est peut être pas utile
    J'ai déjà utilisé des procédures stockées pour des update et insert pas de soucis mais je ne vois pas pourquoi cela fonctionne sous sqlserver et pas via C#

    Une idée ?

    Merci

  2. #2
    Membre du Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Novembre 2014
    Messages
    70
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Dordogne (Aquitaine)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2014
    Messages : 70
    Points : 40
    Points
    40
    Par défaut
    bonjour,

    Face ou déluge de propositions et de conseils

    J'ai essayé de reprendre le code dans un formulaire (winform) et de chercher à alimenter un DataGridView via un simple bouton.
    L'objectif est :

    - Afficher dans le premier DataGridView le résultat d'un select sur la table "tblDemandeTache". Dans cette table une clé étranger vers la table "tblDemandeTacheDocument".
    - Afficher dans le deuxième DataGridView le résultat d'un select sur la table "tblDemandeTacheDocument".

    J'utilise au niveau DAL les objets habituels; SqlConnection, DataSet, SqlDataAdapter et DataRelation

    Lorsque j’exécute le code ci-dessous, tout fonctionne. La relation entre les deux DataGrid est bonne. Lorsqu'il n'y a pas dans les tables de "jointure"
    possible, le deuxième DataGrid est vide. Donc, l'approche admet qu'il n'y ai pas nécessairement de correspondance. Par contre, si j'ajoute
    au premier select la clause suivante : "where id_tache='10'" et bien la j'ai une exception qui me dit qu'au niveau de la création de la relation, "cette contrainte ne peut pas être activée, car toutes les valeurs n'ont pas de valeurs parentes correspondantes"...
    Cela est bien embêtant sachant que mon objectif final est de passer à une procédure stockée un identifiant pour "filtrer" via une clause where les
    enregistrements correspondants pour limiter l'affichage dans mon premier DataGrid !

    Avez vous une idée sur l'approche à adopter ? en amont une requête SQL avec jointure pour limiter les enregistrements et travailler au niveau affichage
    les DataGridView (je connais pas bien les méthodes) !

    Toutes les idées sont les biens venues !
    Merci




    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
            private void AlimenterDataGrid(object sender, EventArgs e)
            {
     
                SqlConnection con_listeTache = new SqlConnection("Data Source=CHNET\\SQLEXPRESS;Initial Catalog=test;User ID=sa;Password=*");
                DataSet ds = new DataSet();
                SqlDataAdapter sda_principal = new SqlDataAdapter("select Id_tache,demande_tache,date_tache as Date,intervenant_tache as Intervenant,detail_tache as Detail from tblDemandeTache", con_listeTache);
                sda_principal.Fill(ds, "tblTache");
     
     
                SqlDataAdapter sda_secondaire = new SqlDataAdapter("select Id_tache,fichier_document from tblDemandeTacheDocument", con_listeTache);
                sda_secondaire.Fill(ds, "tblDocument");
     
     
                DataRelation relation = new DataRelation("TacheDocument",
                ds.Tables["tblTache"].Columns["Id_tache"],
                ds.Tables["tblDocument"].Columns["Id_tache"]);
                ds.Relations.Add(relation);
     
                tacheBindingSource.DataSource = ds;
                tacheBindingSource.DataMember = "tblTache";
                documentBindingSource.DataSource = tacheBindingSource;
                documentBindingSource.DataMember = "TacheDocument";
     
                dataGridView1.DataSource = tacheBindingSource;
                dataGridView2.DataSource = documentBindingSource;
     
            }

    [EDIT]
    Oups, j'oublié lorsque je dis que je souhaite passer un identifiant à ma procédure stockée, je filtre sur un autre champ que "Id_tache" ...
    Non mais c'était juste une précision !

    Merci

Discussions similaires

  1. passage d'un nom de table dans une procédure stockée
    Par thierry V dans le forum MS SQL Server
    Réponses: 7
    Dernier message: 26/07/2010, 16h48
  2. Procédure stocké:Insert et renvoie de la clé primair
    Par caramel dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 17/04/2003, 09h34
  3. [Pervasive SQL ] procédure stockée
    Par magellan dans le forum Autres SGBD
    Réponses: 2
    Dernier message: 25/10/2002, 13h17
  4. Explication procédure stockée
    Par underworld dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 09/09/2002, 10h51
  5. [Comparatif] Procédures stockées, triggers, etc.
    Par MCZz dans le forum Décisions SGBD
    Réponses: 3
    Dernier message: 28/08/2002, 12h27

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