[C#] Procédures stockées dans LocalDb
Répondre à la discussion
Affichage des résultats 1 à 18 sur 18

[C#] Procédures stockées dans LocalDb



  1. #1
    Gus2108

    [C#] Procédures stockées dans LocalDb


    ------

    Bonjour à tous,

    Dans le cadre d'un petit projet, j'utilise LocalDb et je voudrais tester les fonctionnalités avec des procédures stockées.

    Malheureusement, je ne trouve rien sur le net concernant LocalDb et les procédures stockées
    Mon problème ici est que je voudrais exécuter ma procédure stockée via un bouton prévu à cet effet (voir photo)
    mais je ne trouve pas le bout de code nécessaire à cela qui pourtant ne doit surement pas être bien compliqué

    J'aurais donc besoin de vos avis d'expert, est ce que quelqu'un pourrait m'éclairer ??

    D'avance merci à tous

    Nom : Procédure Stockée.jpg
Affichages : 96
Taille : 231,2 Ko

    -----

  2. #2
    Bluedeep

    Re : [C#] Procédures stockées dans LocalDb

    Bonjour

    Je n'ai jamais utilisé LocalDb, mais pour ce qui est des PS il se comporte normalement comme Sql Server (et pas comme Sql Server CE qui ne supporte pas les PS).

    Donc, le code d'appel "standard" (instanciation de connexion, instanciation d'objet commande, exécution de la commande) doit fonctionner parfaitement.

  3. #3
    Gus2108

    Re : [C#] Procédures stockées dans LocalDb

    Bonjour,

    Je me suis effectivement rendu compte qu'il était impossible d'utiliser les PS avec Sql Server CE pour cela je me suis dirigé vers LocalDb.
    Maintenant quand j'essaie l'instanciation de connexion cela me génère une erreur, que je n'avais pas avec le CE :/

    J'ai essayé ce code :

    private void RequetePs_Click(object sender, EventArgs e)
    {
    SqlConnection BddCon = new SqlConnection(Data Source = (LocalDB)\MSSQLLocalDB; AttachDbFilename = "C:\Users\Gaylord\Documents\Vi sual Studio 2015\Projects\WindowsFormsTest Localdb\WindowsFormsTestLocald b\Localdb.mdf"; Integrated Security = True);
    BddCon.Open();
    MessageBox.Show("Connection à la BDD réalisée avec succés");
    }

    ainsi que celui-ci :

    private void RequetePs_Click(object sender, EventArgs e)
    {
    SqlConnection BddCon = new SqlConnection("Data Source = C:\Users\Gaylord\Documents\Vis ual Studio 2015\Projects\WindowsFormsTest Localdb\WindowsFormsTestLocald b\Localdb.mdf");
    BddCon.Open();
    MessageBox.Show("Connection à la BDD réalisée avec succés");
    }

    Dans les deux cas une erreur est générée et le code ne s’exécute plus lors d'un click du bouton...
    Même mettre des \\ au lieu de \ dans le chemin d'accès n'a rien changé !

    Est ce que qqun pourrait m'aider ??

  4. #4
    Bluedeep

    Re : [C#] Procédures stockées dans LocalDb

    Citation Envoyé par Gus2108 Voir le message

    Dans les deux cas une erreur est générée et le code ne s’exécute plus lors d'un click du bouton...
    Même mettre des \\ au lieu de \ dans le chemin d'accès n'a rien changé !

    Est ce que qqun pourrait m'aider ??
    Avec le détail de l'exception levée on serait sans doute à même de t'aider, mais sans info ca va être dur.

    Sinon , merci d’utiliser les balise "QUOTE" pour poster du code, cela facilite beaucoup la lecture.

  5. A voir en vidéo sur Futura
  6. #5
    Gus2108

    Re : [C#] Procédures stockées dans LocalDb

    Merci pour votre réponse rapide, voici le message que je reçois :
    Nom : Erreur VS.jpg
Affichages : 93
Taille : 130,2 Ko

    Si vous avez besoin du détail, je peux également le poster

  7. #6
    Jack
    Modérateur

    Re : [C#] Procédures stockées dans LocalDb

    Citation Envoyé par Bluedeep Voir le message
    Sinon , merci d’utiliser les balise "QUOTE" pour poster du code, cela facilite beaucoup la lecture.
    Tu as raison, mais il s'agit des balises code (bouton # dans l'éditeur avancé pour ceux qui ne veulent pas les entrer sous forme textuelle)

  8. #7
    Bluedeep

    Re : [C#] Procédures stockées dans LocalDb

    Alors,

    - dans la chaîne de connexion du premier code, il manque le nom de la base.
    - le deuxième code ne peut pas fonctionner (on ne peut pas préciser un nom de fichier comme database dans la chaîne de connexion !)
    - poste néanmoins le détail de l'exception (pour le premier code).

  9. #8
    Gus2108

    Re : [C#] Procédures stockées dans LocalDb

    Pour le premier point, le nom de ma base n'est-il pas "Localdb.mdf" ?

    Le détail de l'exception est le suivant :

    L'exception System.Data.SqlClient.SqlExcep tion n'a pas été gérée
    Class=20
    ErrorCode=-2146232060
    HResult=-2146232060
    LineNumber=0
    Message=Une erreur liée au réseau ou spécifique à l'instance s'est produite lors de l'établissement d'une connexion à SQL Server. Le serveur est introuvable ou n'est pas accessible. Vérifiez que le nom de l'instance est correct et que SQL Server est configuré pour autoriser les connexions distantes. (provider: SQL Network Interfaces, error: 26 - Erreur lors de la localisation du serveur/de l'instance spécifiés)
    Number=-1
    Server=""
    Source=.Net SqlClient Data Provider
    State=0
    StackTrace:
    à System.Data.SqlClient.SqlInter nalConnectionTds..ctor(DbConne ctionPoolIdentity identity, SqlConnectionString connectionOptions, SqlCredential credential, Object providerInfo, String newPassword, SecureString newSecurePassword, Boolean redirectedUserInstance, SqlConnectionString userConnectionOptions, SessionData reconnectSessionData, DbConnectionPool pool, String accessToken, Boolean applyTransientFaultHandling)
    à System.Data.SqlClient.SqlConne ctionFactory.CreateConnection( DbConnectionOptions options, DbConnectionPoolKey poolKey, Object poolGroupProviderInfo, DbConnectionPool pool, DbConnection owningConnection, DbConnectionOptions userOptions)
    à System.Data.ProviderBase.DbCon nectionFactory.CreatePooledCon nection(DbConnectionPool pool, DbConnection owningObject, DbConnectionOptions options, DbConnectionPoolKey poolKey, DbConnectionOptions userOptions)
    à System.Data.ProviderBase.DbCon nectionPool.CreateObject(DbCon nection owningObject, DbConnectionOptions userOptions, DbConnectionInternal oldConnection)
    à System.Data.ProviderBase.DbCon nectionPool.UserCreateRequest( DbConnection owningObject, DbConnectionOptions userOptions, DbConnectionInternal oldConnection)
    à System.Data.ProviderBase.DbCon nectionPool.TryGetConnection(D bConnection owningObject, UInt32 waitForMultipleObjectsTimeout, Boolean allowCreate, Boolean onlyOneCheckConnection, DbConnectionOptions userOptions, DbConnectionInternal& connection)
    à System.Data.ProviderBase.DbCon nectionPool.TryGetConnection(D bConnection owningObject, TaskCompletionSource`1 retry, DbConnectionOptions userOptions, DbConnectionInternal& connection)
    à System.Data.ProviderBase.DbCon nectionFactory.TryGetConnectio n(DbConnection owningConnection, TaskCompletionSource`1 retry, DbConnectionOptions userOptions, DbConnectionInternal oldConnection, DbConnectionInternal& connection)
    à System.Data.ProviderBase.DbCon nectionInternal.TryOpenConnect ionInternal(DbConnection outerConnection, DbConnectionFactory connectionFactory, TaskCompletionSource`1 retry, DbConnectionOptions userOptions)
    à System.Data.ProviderBase.DbCon nectionClosed.TryOpenConnectio n(DbConnection outerConnection, DbConnectionFactory connectionFactory, TaskCompletionSource`1 retry, DbConnectionOptions userOptions)
    à System.Data.SqlClient.SqlConne ction.TryOpenInner(TaskComplet ionSource`1 retry)
    à System.Data.SqlClient.SqlConne ction.TryOpen(TaskCompletionSo urce`1 retry)
    à System.Data.SqlClient.SqlConne ction.Open()
    à WindowsFormsTestLocaldb.Form1. RequetePs_Click(Object sender, EventArgs e) dans C:\Users\Gaylord\Documents\Vis ual Studio 2015\Projects\WindowsFormsTest Localdb\WindowsFormsTestLocald b\Form1.cs:ligne 49
    à System.Windows.Forms.Control.O nClick(EventArgs e)
    à System.Windows.Forms.Button.On Click(EventArgs e)
    à System.Windows.Forms.Button.On MouseUp(MouseEventArgs mevent)
    à System.Windows.Forms.Control.W mMouseUp(Message& m, MouseButtons button, Int32 clicks)
    à System.Windows.Forms.Control.W ndProc(Message& m)
    à System.Windows.Forms.ButtonBas e.WndProc(Message& m)
    à System.Windows.Forms.Button.Wn dProc(Message& m)
    à System.Windows.Forms.Control.C ontrolNativeWindow.OnMessage(M essage& m)
    à System.Windows.Forms.Control.C ontrolNativeWindow.WndProc(Mes sage& m)
    à System.Windows.Forms.NativeWin dow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
    à System.Windows.Forms.UnsafeNat iveMethods.DispatchMessageW(MS G& msg)
    à System.Windows.Forms.Applicati on.ComponentManager.System.Win dows.Forms.UnsafeNativeMethods .IMsoComponentManager.FPushMes sageLoop(IntPtr dwComponentID, Int32 reason, Int32 pvLoopData)
    à System.Windows.Forms.Applicati on.ThreadContext.RunMessageLoo pInner(Int32 reason, ApplicationContext context)
    à System.Windows.Forms.Applicati on.ThreadContext.RunMessageLoo p(Int32 reason, ApplicationContext context)
    à System.Windows.Forms.Applicati on.Run(Form mainForm)
    à WindowsFormsTestLocaldb.Progra m.Main() dans C:\Users\Gaylord\Documents\Vis ual Studio 2015\Projects\WindowsFormsTest Localdb\WindowsFormsTestLocald b\Program.cs:ligne 19
    à System.AppDomain._nExecuteAsse mbly(RuntimeAssembly assembly, String[] args)
    à System.AppDomain.ExecuteAssemb ly(String assemblyFile, Evidence assemblySecurity, String[] args)
    à Microsoft.VisualStudio.Hosting Process.HostProc.RunUsersAssem bly()
    à System.Threading.ThreadHelper. ThreadStart_Context(Object state)
    à System.Threading.ExecutionCont ext.RunInternal(ExecutionConte xt executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
    à System.Threading.ExecutionCont ext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
    à System.Threading.ExecutionCont ext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
    à System.Threading.ThreadHelper. ThreadStart()
    InnerException:

  10. #9
    Gus2108

    Re : [C#] Procédures stockées dans LocalDb

    J'ai finalement réussi à effectuer la connexion avec ma data base
    reste à savoir appeler ma PS, je vous tiens au courant !
    Un grand merci en tout cas

    pour info j'ai simplement changé la ligne de code pour la connexion en mettant celle-ci:
    Code:
    SqlConnection BddCon = new SqlConnection(global::WindowsFormsTestLocaldb.Properties.Settings.Default.LocaldbConnectionString);
    Dernière modification par Gus2108 ; 25/04/2016 à 19h10.

  11. #10
    Gus2108

    Re : [C#] Procédures stockées dans LocalDb

    Re,

    J'ai avancé un petit peu, j'essaie d'exécuter une petite PS simple (SELECT COUNT(*)) vraiment basique pour commencer mais j'ai un problème avec mon DataReader :

    "Procedure or function 'NombreEmployes' expects parameter '@Id', which was not supplied"

    Voici mon code, je voudrais afficher le résultat de ma PS dans un messagebox
    Code:
    private void RequetePs_Click(object sender, EventArgs e)
            {
                SqlConnection BddCon = new SqlConnection(global::WindowsFormsTestLocaldb.Properties.Settings.Default.LocaldbConnectionString);
    
                SqlCommand cmd = new SqlCommand("NombreEmployes", BddCon);
                cmd.CommandType = CommandType.StoredProcedure;
                SqlParameter Id = cmd.Parameters.Add("@Id", SqlDbType.Int);
                SqlParameter Nom = cmd.Parameters.Add("@Nom", SqlDbType.NVarChar);
                SqlParameter Prenom = cmd.Parameters.Add("@Prenom", SqlDbType.NVarChar);
                SqlParameter Age = cmd.Parameters.Add("@Age", SqlDbType.Int);
    
                BddCon.Open();
                MessageBox.Show("Connection à la BDD réalisée avec succés");
    
                SqlDataReader read = cmd.ExecuteReader();
                String NombreLignes;
                NombreLignes = Convert.ToString(read);
                MessageBox.Show(NombreLignes);
    
                BddCon.Close();
            }

  12. #11
    Bluedeep

    Re : [C#] Procédures stockées dans LocalDb

    Citation Envoyé par Gus2108 Voir le message
    Pour le premier point, le nom de ma base n'est-il pas "Localdb.mdf" ?
    Non : c'est le nom du fichier qui contient la base.

  13. #12
    Bluedeep

    Re : [C#] Procédures stockées dans LocalDb

    Bonjour

    Citation Envoyé par Gus2108 Voir le message
    Re,

    J'ai avancé un petit peu, j'essaie d'exécuter une petite PS simple (SELECT COUNT(*)) vraiment basique pour commencer mais j'ai un problème avec mon DataReader :

    "Procedure or function 'NombreEmployes' expects parameter '@Id', which was not supplied"
    Normal : tu instancies tes paramètres (jusque là c'est parfait)mais tu ne leur affecte pas de valeurs.
    Utilise plutot la méthode AddWithValue sur la collection Parameters. (ainsi pas besoin de préciser le type, il sera inféré en fonction de la valeur)
    Sinon, tu doit appeler au moins une fois la méthode Read sur l'objet DataReader pour récupérer les données (le premier appel te positionne sur la première ligne du retour de la PS)
    Si elle rertourne "false" c'est qu'il n'y a pas de données.

    Poste à tout hasard la source complète de ta PS.
    Dernière modification par Bluedeep ; 26/04/2016 à 08h15.

  14. #13
    Bluedeep

    Re : [C#] Procédures stockées dans LocalDb

    Autre chose :

    Pour récuperer les données tu dois utiliser :


    Code:
    int NombreLignes = (int)read[0];

  15. #14
    Gus2108

    Re : [C#] Procédures stockées dans LocalDb

    Bonjour Bluedeep,

    Tout d'abord, un grand merci pour le temps que tu passes à me répondre !

    Tout d'abord voila le code de ma PS:

    Code:
    CREATE PROCEDURE [dbo].[NombreEmployes]
    	@Id int,
    	@Nom nvarchar(50),
    	@Prenom nvarchar(50),
    	@Age int
    AS
    	SELECT COUNT(*) as NbLignes FROM Employes
    Ce que je ne comprends pas c'est cette fameuse instanciation des paramètres dans mon code C#
    Je veux simplement compter le nombre de lignes dans ma table pour commencer
    Dernière modification par Gus2108 ; 26/04/2016 à 09h25.

  16. #15
    Gus2108

    Re : [C#] Procédures stockées dans LocalDb

    J'ai trouvé mon erreur, endouille que je suis ! Ma PS n'était pas correcte !

    Voici la version de mon code qui fonctionne

    PS-SQL
    Code:
    CREATE PROCEDURE [dbo].[NombreEmployes]
    	@Id int = NULL,
    	@Nom nvarchar(50) = NULL,
    	@Prenom nvarchar(50) = NULL,
    	@Age int = NULL
    AS
    	SELECT COUNT(*) as NbLignes FROM Employes
    C#
    Code:
            private void RequetePs_Click(object sender, EventArgs e)
            {
                SqlConnection BddCon = new SqlConnection(global::WindowsFormsTestLocaldb.Properties.Settings.Default.LocaldbConnectionString);
                BddCon.Open();
                MessageBox.Show("Connection à la BDD réalisée avec succés");
                int NbLignes;
    
                SqlCommand cmd = new SqlCommand("NombreEmployes", BddCon);
                cmd.CommandType = CommandType.StoredProcedure;
                SqlParameter Id = cmd.Parameters.Add("@Id", SqlDbType.Int);
                SqlParameter Nom = cmd.Parameters.Add("@Nom", SqlDbType.NVarChar);
                SqlParameter Prenom = cmd.Parameters.Add("@Prenom", SqlDbType.NVarChar);
                SqlParameter Age = cmd.Parameters.Add("@Age", SqlDbType.Int);
    
                SqlDataReader reader = cmd.ExecuteReader();
                reader.Read();
                NbLignes = (int)reader["NbLignes"];
                MessageBox.Show("Requête réalisée avec succès \nNombre de lignes = " + NbLignes);
    
                reader.Close();
                BddCon.Close();
            }
    N'hésitez pas à faire des remarques si jamais je fais des choses inutiles ou des bêtises dans mon code

  17. #16
    Bluedeep

    Re : [C#] Procédures stockées dans LocalDb

    Citation Envoyé par Gus2108 Voir le message
    N'hésitez pas à faire des remarques si jamais je fais des choses inutiles ou des bêtises dans mon code
    Pas grand chose de grave, à vrai dire, mais en vrac :

    - test le retour à "false" de l'appel à reader.Read(), (même si ici ta PS retournant un scalaire, elle ne peut pas a priori retourner null) sinon la référence à reader[0] lèverait une exception.

    - pour appeler une PS qui ne retourne pas de ligne mais uniquement un scalaire comme ici, utilise ExecuteScalar plutôt que ExecuteReader (de même que pour une PS qui ne retourne rien tu devras utiliser ExecuteNonQuery).
    - Utiliser AddWithValue au lieu de Add pour instancier les paramètres passés à une PS permet d'éviter de préciser le type
    - Utilise les blocs "using" pour les objets "disposables" à durée de vie limitée (ici SqlConnection, SqlCommand, SqlDataReader)
    Dernière modification par Bluedeep ; 26/04/2016 à 11h28.

  18. #17
    Gus2108

    Re : [C#] Procédures stockées dans LocalDb

    Re Bluedeep,

    Merci pour tes propositions, j'essayerais tout ca, pour rendre mon code bien propre dans une phase ultérieure.

    J'ai une dernière question, j'effectue une PS pour insérer un nouvel employé via le code suivant:
    Code:
            private void Insert_Click(object sender, EventArgs e)
            {
                SqlConnection BddCon = new SqlConnection(global::WindowsFormsTestLocaldb.Properties.Settings.Default.LocaldbConnectionString);
                BddCon.Open();
                MessageBox.Show("Connection à la BDD réalisée avec succés");
    
                SqlCommand insert = new SqlCommand("InsertEmployes", BddCon);
                insert.CommandType = CommandType.StoredProcedure;
                SqlParameter Id = insert.Parameters.AddWithValue("@Id", idTextBox.Text);
                SqlParameter Nom = insert.Parameters.AddWithValue("@Nom", nomTextBox.Text);
                SqlParameter Prenom = insert.Parameters.AddWithValue("@Prenom", prenomTextBox.Text);
                SqlParameter Age = insert.Parameters.AddWithValue("@Age", ageTextBox.Text);
    
                insert.ExecuteNonQuery();
                this.employesTableAdapter.Fill(this.localdbDataSet1.Employes);
                MessageBox.Show("Ajout effectué avec succès");
            }
    Mes données ajoutées sont bien visibles dans la fenêtre de l'application par contre si je ferme l'appli, mes données ne sont pas dans ma table...
    J'imagine que cela est lié à l'utilisation du TableAdapter ? Du coup si je veux que cet ajout de données soit effectif dans ma BDD je dois effectuer une requête update ?

  19. #18
    Bluedeep

    Re : [C#] Procédures stockées dans LocalDb

    Citation Envoyé par Gus2108 Voir le message
    Mes données ajoutées sont bien visibles dans la fenêtre de l'application par contre si je ferme l'appli, mes données ne sont pas dans ma table...
    J'imagine que cela est lié à l'utilisation du TableAdapter ? Du coup si je veux que cet ajout de données soit effectif dans ma BDD je dois effectuer une requête update ?
    En général on évite de mélanger des dataadapter avec des commandes directes.

    Si tu comment out la ligne qui peuple le dataadapter, ta table dans la base est elle mise à jour ?

    Si non, c'est qu'il y a un problème avec ta PS (poste la source). Note que tu peux tester ta PS directement avec SSMS (quoique je ne sais pas si la LocalDb est connectable via SSMS - je dirais a priori oui).

Discussions similaires

  1. Lecture des informations stockées sur un CD
    Par Max-la-menace dans le forum Physique
    Réponses: 2
    Dernier message: 16/04/2015, 13h56
  2. Nouvelles procédures lors d'une RCP
    Par invite2057cd1d dans le forum Secourisme spécial Croix-Rouge
    Réponses: 1
    Dernier message: 13/06/2007, 23h02
  3. Procédures annulation de vol
    Par invite58238e9a dans le forum Astronautique
    Réponses: 28
    Dernier message: 04/09/2005, 14h09