none
Comment créer une procédure stockée RRS feed

  • Question

  • Bonjour

    Je cherche à créer une procédure stockée sur une base Access.

    Pour cela dans l'Explorateur de seveur, après m'être connecté sur ma base je clique droit sur "Procédures stockées" mais je n'ai pas de menu pour me permettant de créer une procédure stockée.

    Merci

    Bernard


    Bernard Bouree

    samedi 30 décembre 2017 10:41

Toutes les réponses

  • Bonjour

    Est-ce que ma question est mal formulée ?

    Bernard


    Bernard Bouree

    dimanche 7 janvier 2018 10:15
  • Bonjour,

    Non votre question n'est pas mal formulée mais vous ne précisez pas ni votre version d'Access ni sur quelle plateforme (SQL server je suppose).

    S'il s'agit d'un adp (ou ade) par exemple...

    Ensuite, avez-vous vue sur tout votre projet ?

    Voyez-vous toutes les tables ?

    etc...

    Pouvez-vous préciser votre contexte de travail ?


    Argy

    lundi 8 janvier 2018 13:21
    Modérateur
  • Bonjour

    Voici donc quelques précisions.

    Je travaille avec une base Access dont je ne suis pas à l'origine et que je dois mettre à jour puis redistribuer.

    Pour cela j'ai un programme en C# avec VS 2017 community qui interroge la base Access via des requêtes sql.

    Or ce programme génére des erreurs aléatoires lors de la mise à jour de la base avec une erreur fatale 

    L'opération doit utiliser une requête qui peut être mise à jour.

    Cette erreur n'apparait que sur un faible nombre d'enregistrements (environ 10%) et de façon aléatoire, c'est à dire que les enregistrements impactés ne sont pas les mêmes à chaque run!

    On m'a proposé de passer sous SQL Serveur au lieu de Access mais cela n'est pas possible pour les raisons indiqués ci-dessus.

    J'ai également été conseillé d'utiliser des procedures stockées pour régler ce problème.

    Mais je ne peux les mettre directement dans la base Access car je dois traiter à chaque fois un nouveau fichier.

    J'ai chercher le moyen de les coder dans VS mais n'ai pas trouvé comment.

    J'ai donc établi une connection dans l'explorateur de serveur avec la base Access mais n'ai pas trouvé le moyen de le faire. En effet dans la liste des tables, requêtes, il y a bien la lite des "procédure stockées" mais impossible d'en rajouter !

    J'utilise ela dernière version d'Access.

    Merci pour votre aide.

    Bernard


    Bernard Bouree

    lundi 8 janvier 2018 16:09
  • Bonjour,

    Selon mma vision des choses, votre requête ne peut être mise à jour parce que la structure de la table ne permet pas de le faire.

    Du fait que les tables sont attachées, celle sollicitée doit ête pourvue d'un champ indéxé unique (valeurs uniques) 

    et ce dernier doit être utilisé pour élaborer la clé de filtrage de vos enregistrements à mettre à jour.

    Je vous proposerais volontiers de tester votre requête dans Access avant de chercher à l'implémenter dans votre projet.

    Le fait de mettre en place des ProcStoc n'apportera rien à votre problème, ce dernier étant à la source.



    Argy

    mardi 9 janvier 2018 13:03
    Modérateur
  • Bonjour

    Je n'utilise qu'une seule table qui possède un index à clé  unique.

    Si "elle ne pouvait être mise à jour" pourquoi ce problème ne se rencontre que sur une faible proportion des enregistrements et ceci de façon aléatoire, c'est à dire pour des enregistrements différents à chaque run.

    Ci dessous le code de mise à jour de la table.

     var query = "UPDATE tblLR " +
                            "SET Location = @location " +
                            ", SortedLocation = @sortedLocation" +
                             ", ShortName = @shortName" +
                            ", Latitude = @latitude" +
                            ", Longitude = @longitude " +
                            " WHERE IDLR = @idLr";

    using (var dBcon = new OleDbConnection(Legacy.ConString))
                {
                    using (var cmd = new OleDbCommand(query, dBcon))
                    {
                        cmd.Parameters.Add("@location", OleDbType.VarChar).Value = topLegacy.Location;
                        cmd.Parameters.Add("@sortedLocation", OleDbType.VarChar).Value = topLegacy.Location;
                        cmd.Parameters.Add("@shortName", OleDbType.VarChar).Value = topLegacy.ShortName;
                        cmd.Parameters.Add("@latitude", OleDbType.Double).Value = topLegacy.Latitude;
                        cmd.Parameters.Add("@longitude", OleDbType.Double).Value = topLegacy.Longitude;
                        cmd.Parameters.Add("@idLr", OleDbType.BigInt).Value = topLegacy.Idlr;

                        //cmd.CommandType = CommandType.StoredProcedure;

                        try
                        {
                            dBcon.Open();
                            var result = cmd.ExecuteNonQuery();
                            //var result = cmd.ExecuteScalar();
                            if (result <= 0)
                            {
                                topLegacy.EstErreur = true;
                                topLegacy.ErreurText = "Erreur lors de la mise à jour de la table";
                                string msg = "Erreur dans MettreAJourLegacy avec comme arguments: " +
                                               "\n topLegacy =  " + topLegacy.Idlr + " " + topLegacy.ToString() +
                                                "\n topGeoDB = " + topGeoDb.ToString();
                                MessageBox.Show(msg, "Erreur fatale dans la méthode MettreAJourLegacy()", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                                return false;
                            }
                            return true;
                        }
                        catch (OleDbException ex)
                        {
                            topLegacy.EstErreur = true;
                            topLegacy.ErreurText = "Erreur fatale lors de la mise à jour de la table";
                            string msg = ex.Message + "\n Erreur dans MettreAJourLegacy avec comme arguments: " +
                                            "\n topLegacy =  " + topLegacy.Idlr + " " + topLegacy.ToString() +
                                             "\n topGeoDB = " + topGeoDb.ToString();

                            //  MessageBox.Show(msg, "Erreur fatale dans la méthode MettreAJourLegacy()", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                            //  ToponymeLegacy.ListeToponymesNonTraites.Add(topLegacy);
                            return false;
                        }
                    }
                }

    Merci pour votre aide.

    Bernard


    Bernard Bouree


    mardi 9 janvier 2018 15:40
  • Bonjour,

    Pouvez-vous essayer cette procédure (plus simple)  ?

       {
         OleDbCommand oCmd = new OleDbCommand(@"UPDATE tblLR SET Location = @location , SortedLocation = @sortedLocation, ShortName = @shortName, Latitude = @latitude, Longitude = @longitude  WHERE IDLR = @idLr", oConnection);
            oCmd.Parameters.AddWithValue("@SortedLocation", txtSortedLocation.Text);
            oCmd.Parameters.AddWithValue("@ShortName", txtShortName.Text);
            oCmd.Parameters.AddWithValue("@Latitude", txtLatitude.Text);
            oCmd.Parameters.AddWithValue("@Longitude", txtLongitude.Text);
            oCmd.Parameters.AddWithValue("@IDLR", txtIDLr.Text);
            try
            {oConnection.Open();
            }
            catch (Exception ex)
            {MessageBox.Show(ex.Message);
            }
            try
            {oCmd.ExecuteNonQuery();
                MessageBox.Show("Mise à jour effectuée avec succès.");
            }
            catch (Exception ex)
            {MessageBox.Show(ex.Message);
            }
            finally
            {oConnection.Close();
            }
        }

    Qu'est ce que ça donne...?


    Argy


    mercredi 10 janvier 2018 09:52
    Modérateur
  • Bonsoir

    Merci pour votre aide

    J'ai adapté le code pour coller à la structure de mes données, et j'obtiens l'erreur

    Aucune valeur donnée pour un ou plusieurs des paramètres requis.

    Voici mon code adapté:

     using (var dBcon = new OleDbConnection(Legacy.ConString))
                {
                    OleDbCommand oCmd = new OleDbCommand(@"UPDATE tblLR SET Location = @location , SortedLocation = @sortedLocation, ShortName = @shortName, Latitude = @latitude, Longitude = @longitude  WHERE IDLR = @idLr", dBcon);
                    oCmd.Parameters.AddWithValue("@SortedLocation", topLegacy.SortedLocation.ToString());
                    oCmd.Parameters.AddWithValue("@ShortName", topLegacy.ShortName.ToString());
                    oCmd.Parameters.AddWithValue("@Latitude", (double)topLegacy.Latitude);
                    oCmd.Parameters.AddWithValue("@Longitude", (double)topLegacy.Longitude);
                    oCmd.Parameters.AddWithValue("@IDLR", (Int32)topLegacy.Idlr);
                    try
                    {
                        dBcon.Open();
                    }
                    catch (Exception ex)
                    {
                        MessageBox.Show(ex.Source);
                        return false;
                    }
                    try
                    {
                        oCmd.ExecuteNonQuery();
                        MessageBox.Show("Mise à jour effectuée avec succès.");
                        return true;
                    }
                    catch (Exception ex)
                    {
                        MessageBox.Show(ex.Message);
                        return false;
                    }
                    finally
                    {
                        dBcon.Close();
                    }


    Bernard Bouree

    mercredi 10 janvier 2018 20:17
  • Bonjour

    J'ai corrigé le code et j'ai toujours la même erreur sur certains enregistrements : 

    L'opération doit utiliser une requête qui peut être mise à jour.

    Voici mon code:

    query = @"UPDATE tblLR SET Location = @location " +
                    ", SortedLocation = @sortedLocation " +
                    ", ShortName = @shortName " +
                    ", Latitude = @latitude " +
                    ", Longitude = @longitude " +
                    " WHERE IDLR = @idLr";


                using (var dBcon = new OleDbConnection(Legacy.ConString))
                {
                    OleDbCommand oCmd = new OleDbCommand(query, dBcon);
                    oCmd.Parameters.AddWithValue("@location", topLegacy.Location.ToString());
                    oCmd.Parameters.AddWithValue("@SortedLocation", topLegacy.SortedLocation.ToString());
                    oCmd.Parameters.AddWithValue("@ShortName", topLegacy.ShortName.ToString());
                    oCmd.Parameters.AddWithValue("@Latitude", (double)topLegacy.Latitude);
                    oCmd.Parameters.AddWithValue("@Longitude", (double)topLegacy.Longitude);
                    oCmd.Parameters.AddWithValue("@IDLR", (Int32)topLegacy.Idlr);

                    try
                    {
                        dBcon.Open();
                    }
                    catch (Exception ex)
                    {
                        MessageBox.Show(ex.Source);
                        return false;
                    }
                    try
                    {
                        oCmd.ExecuteNonQuery();
                        //MessageBox.Show("Mise à jour effectuée avec succès.");
                        return true;
                    }
                    catch (Exception ex)
                    {
                        MessageBox.Show(ex.Message);
                        return false;
                    }
                    finally
                    {
                        dBcon.Close();
                    }


    Bernard Bouree

    samedi 20 janvier 2018 14:31
  • Bonjour,

    Il fait prendre le problème à la racine...

    Est-ce qu'au sein d'Access, via une requête, vous pouvez opérer à la même mise à jour sans erreur ?

    • Si oui, c'est que votre code n'est pas correct.
    • Si non, c'est que votre table ne permet pas les M.A.J.


    Argy

    dimanche 21 janvier 2018 11:51
    Modérateur