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

ASP.NET Discussion :

[C#] DetailsView et Update BDD Access


Sujet :

ASP.NET

  1. #1
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Juin 2006
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2006
    Messages : 92
    Par défaut [C#] DetailsView et Update BDD Access
    Bonjour,

    Dans mon projet, lorsque je rentre sur une fiche client, j'affiche toutes les données dans un DetailsView que j'ai lié à une source de données Access. Le DetailsView est en mode Edit et j'ai mis le AutoGenerateEditButton à True pour pouvoir mettre à jour les modifications.

    Voilà comment je lie la source de données au DetailsView :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    AccessDataSource1.DataFile = System.Web.Hosting.HostingEnvironment.ApplicationPhysicalPath + "/taxe.mdb";
    AccessDataSource1.SelectCommand = "SELECT client, raison_sociale FROM client WHERE client = " + idUser; //idUser représente le numéro de fiche
    AccessDataSource1.UpdateCommand = "UPDATE client SET raison_sociale = 'poc' WHERE client = " + idUser; //je teste en mettant 'poc' comme valeur
    AccessDataSource1.DataBind();
     
    DetailsView1.DataSourceID = AccessDataSource1.ID;
    DetailsView1.DataBind();
    Le problème c'est que quand je clique sur Update, j'ai le message suivant :
    Updating is not supported by data source 'AccessDataSource1' unless UpdateCommand is specified.

    Et je ne comprends pas trop car ma requête UpdateCommand est donnée ???
    Est-ce que dans l'évènement ItemUpdating du DetailsView il faut faire quelque chose ? Moi je ne pense pas car il est lié à la source de données qui est sensé le gérer, non ?

    Merci de votre aide.

  2. #2
    Membre Expert Avatar de guitoux1
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 011
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 011
    Par défaut
    Ta requête Update doit prendre des paramètres pour fonctionner. essai un truc du style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    AccessDataSource1.UpdateCommand = "UPDATE client SET raison_sociale = @raison_sociale WHERE client = @idUser"; //je teste en mettant 'poc' comme valeur
    SqlDataSource2.UpdateParameters.Add("idUser", TypeCode.Int32, 0);
    SqlDataSource2.UpdateParameters.Add("raison_sociale", TypeCode.String, string.Empty);
    Si ça marche pas, essai aussi avec un @ devant le nom des parametres que tu ajoute à ta commande

  3. #3
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Juin 2006
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2006
    Messages : 92
    Par défaut
    Suite à ta réponse, j'ai essayé ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    AccessDataSource1.UpdateCommand = "UPDATE client SET raison_sociale = @raison_sociale WHERE client = @idUser";
    AccessDataSource1.UpdateParameters.Add("@raison_sociale", TypeCode.String, string.Empty);
    AccessDataSource1.UpdateParameters.Add("@idUser", TypeCode.String, idUser);
    J'ai même essayé sans les @, mais ça ne marche pas, toujours la même erreur...

  4. #4
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Juin 2006
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2006
    Messages : 92
    Par défaut
    Bon, en continuant de chercher, j'ai trouver sur MSDN un exemple, mais ça ne marche toujours pas chez moi... J'ai donc rajouté une fonction sur l'évènement ItemUpdating dont voilà le code (copier-coller de MSDN...) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    protected void DetailsView1_ItemUpdating(object sender, DetailsViewUpdateEventArgs e)
        {
            for (int i = 0; i < e.NewValues.Count; i++)
            {
                if (e.NewValues[i] != null)
                {
                    e.NewValues[i] = Server.HtmlEncode(e.NewValues[i].ToString());
                }
            }
        }
    Pour la liaison de ma source de données, j'ai changé pour ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    AccessDataSource1.DataFile = System.Web.Hosting.HostingEnvironment.ApplicationPhysicalPath + "/taxe.mdb";
    AccessDataSource1.SelectCommand = "SELECT client, raison_sociale FROM client WHERE client = " + idUser;
     
    AccessDataSource1.UpdateCommand = "UPDATE [client] SET [raison_sociale] = @raison_sociale WHERE [client] = @client";
    AccessDataSource1.UpdateParameters.Add("raison_sociale", TypeCode.String, string.Empty);
    AccessDataSource1.UpdateParameters.Add("client", TypeCode.String, string.Empty);
     
    AccessDataSource1.DataBind();
     
    DetailsView1.DataSourceID = AccessDataSource1.ID;
    Du coup, comme ça ne marche toujours pas je ne sais pas qu'est ce qui est bon dedans...
    Si vous avez des réponses...

  5. #5
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Juin 2006
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2006
    Messages : 92
    Par défaut
    A défaut de trouver la solution, j'ai opté pour une autre solution : j'ai placé un bouton en dessous de mon DetailsView, et lors du click, j'effectue une requête Update. Pour tester, j'ai essayé de mettre une valeur codée en dur. Voilà mon code :

    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
     
    protected void Button4_Click(object sender, EventArgs e)
    {
    // Chaîne de connexion
    string pathserv = System.Web.Hosting.HostingEnvironment.ApplicationPhysicalPath;
    string connectionString = String.Format("Provider=Microsoft.Jet.OLEDB.4.0; Ole DB Services=-4; Data Source={0}/taxe.mdb", pathserv);
    // Objet connection
    System.Data.OleDb.OleDbConnection dbConnection = new System.Data.OleDb.OleDbConnection(connectionString);
    // Ouverture
    dbConnection.Open();
    // Objet Command
    string cmd = "UPDATE client SET raison_sociale = 'poc' WHERE client = " + idUser;
    System.Data.OleDb.OleDbCommand command = new System.Data.OleDb.OleDbCommand(cmd, dbConnection);
    // Execution
    int affectedrows = command.ExecuteNonQuery();
    // Fermeture connection
    dbConnection.Close();
    }
    Le problème c'est que même ça me génère une erreur, mais celle-ci est différente :
    Erreur de syntaxe (opérateur absent) dans l'expression 'client ='.

    et dans la trace de la pile, il me dit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Line 834:        System.Data.OleDb.OleDbCommand command = new System.Data.OleDb.OleDbCommand(cmd, dbConnection);
    Line 835:        // Execution
    Line 836:        int affectedrows = command.ExecuteNonQuery();
    Line 837:        // Fermeture connection
    Line 838:        dbConnection.Close();
    Pourtant je suis sûr que ma commande Update est bonne...
    Donc là, je sèche...

    Même si vous n'avez pas une réponse à mon problème mais une autre solution, je suis preneur

  6. #6
    Membre Expert Avatar de guitoux1
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 011
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 011
    Par défaut
    D'après ton code précédent, j'ai cru comprendre que ton champ client est de type string, du coup, il te faut faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    string cmd = "UPDATE client SET raison_sociale = 'poc' WHERE client = '" + idUser + "'";

  7. #7
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Juin 2006
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2006
    Messages : 92
    Par défaut
    En fait c'est moi qui me suis trompé, le champ client est bien un entier, c'est un numéro unique. Donc en reprenant mon code avec :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    AccessDataSource1.UpdateParameters.Add("client", TypeCode.Int32, string.Empty);
    beh, ça ne marche toujours pas avec la même erreur du début...

  8. #8
    Membre Expert Avatar de guitoux1
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 011
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 011
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    AccessDataSource1.UpdateParameters.Add("client", TypeCode.Int32, string.Empty);
    Si le type est Int32, la valeur par défaut ne peut pas être string.Empty (string). Essai plutôt avec 0 comme valeur par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    AccessDataSource1.UpdateParameters.Add("client", TypeCode.Int32, 0);

  9. #9
    Rédacteur
    Avatar de lutecefalco
    Profil pro
    zadzdzddzdzd
    Inscrit en
    Juillet 2005
    Messages
    5 052
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : zadzdzddzdzd

    Informations forums :
    Inscription : Juillet 2005
    Messages : 5 052
    Par défaut
    Dans ton code, je vois pas comment tu récupères le idUser avant de t'en servir.

    Fais du debug et regarde ce que vaut ta cmdUpdate

  10. #10
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Juin 2006
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2006
    Messages : 92
    Par défaut
    Si le type est Int32, la valeur par défaut ne peut pas être string.Empty (string). Essai plutôt avec 0 comme valeur par défaut
    En fait le 3ème paramètre doit être un string, donc le 0 ne marche pas (j'ai déjà essayé...).

    Sinon, lutecefalco, en récupérant la commande de mon bouton (de ma dernière solution), effectivement il ne me met pas le idUser alors que celui-ci est récupérer juste avant puisque je m'en sers dans la SelectCommand de mon DetailsView (voir plus haut). Donc je ne comprends pas trop car c'est une variable globlale qui n'est pas effacée...

    Je vais continuer de chercher... Merci pour vos réponses.

  11. #11
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Juin 2006
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2006
    Messages : 92
    Par défaut
    Apparemment ma variable se perd lorsque la page est rechargée. En effet, je l'avais déclarer dans la classe de la page :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    public partial class _Default : System.Web.UI.Page 
    {
        string idUser = null;
    Du coup, je vais devoir trouver une autre méthode pour stocker mes variables afin de ne pas perdre leurs valeurs. Je vais aller voir du côté des variables de Session...

  12. #12
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Juin 2006
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2006
    Messages : 92
    Par défaut
    Bon, je continue de lutter...

    Alors maintenant avec les variables de session je ne perd plus mes données, donc mes requêtes sont bonnes. Par contre j'ai une autre erreur dans ma méthode de mise à jour avec mon bouton personnalisé (pas celui du DetailsView).

    Avec cette fonction...
    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
    protected void Button4_Click(object sender, EventArgs e)
    {        
    string pathserv = System.Web.Hosting.HostingEnvironment.ApplicationPhysicalPath;
    string connectionString = String.Format("Provider=Microsoft.Jet.OLEDB.4.0; Ole DB Services=-4; Data Source={0}/taxe.mdb", pathserv);
    System.Data.DataSet dataSet = new DataSet();
    System.Data.OleDb.OleDbConnection dbConnection = new System.Data.OleDb.OleDbConnection(connectionString);
    System.Data.OleDb.OleDbCommand cmd = dbConnection.CreateCommand();
    dbConnection.Open();
     
    cmd.CommandText = "UPDATE client SET raison_sociale = 'poc' WHERE client = " + Session["idUser"].ToString();
     
    System.Data.OleDb.OleDbDataAdapter dbAdapter = new System.Data.OleDb.OleDbDataAdapter(cmd);
     
    dbAdapter.Fill(dataSet);
    dbConnection.Close();
    }
    ... j'obtiens l'erreur suivante :
    L'opération doit utiliser une requête qui peut être mise à jour.
    et l'erreur est ici : dbAdapter.Fill(dataSet);


    J'ai essayé une autre méthode de mise à jour...
    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
    protected void Button4_Click(object sender, EventArgs e)
    {         
    // Chaîne de connexion
    string pathserv = System.Web.Hosting.HostingEnvironment.ApplicationPhysicalPath;
    string connectionString = String.Format("Provider=Microsoft.Jet.OLEDB.4.0; Ole DB Services=-4; Data Source={0}/taxe.mdb", pathserv);
    // Objet connection
    System.Data.OleDb.OleDbConnection dbConnection = new System.Data.OleDb.OleDbConnection(connectionString);
    // Ouverture
    dbConnection.Open();
    // Objet Command
    string cmd = "UPDATE client SET raison_sociale = 'poc' WHERE client = " + Session["idUser"].ToString();
    System.Data.OleDb.OleDbCommand command = new System.Data.OleDb.OleDbCommand(cmd, dbConnection);
    // Execution
    int affectedrows = command.ExecuteNonQuery();
    // Fermeture connection
    dbConnection.Close();
    }
    ... et j'ai la même erreur à ce niveau : int affectedrows = command.ExecuteNonQuery();

    Je ne sais pas trop ce que signifie cette erreur donc ça m'empêche de trouver une solution...
    Merci de votre aide.

  13. #13
    Membre Expert Avatar de guitoux1
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 011
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 011
    Par défaut
    Concernant ton premier PB (celui avec le DataAdapter), c'est normal, car la méthode Fill() remplis le DataSet, et donc il te faut utiliser une requête Select.

    Pour ton second PB (avec le ExceuteNonQuery()), là c'est autre chose. Je dirais que ta variable de session est vide. Essai en mode débugage de voir à quoi ressemble ta requête SQL avant qu'elle ne soit exécutée.

  14. #14
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Juin 2006
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2006
    Messages : 92
    Par défaut
    Merci guitoux1 pour ta réponse, mais c'est ce que m'avez demandé lutecefalco, et j'ai vérifié, ma requête est bonne...

  15. #15
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Juin 2006
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2006
    Messages : 92
    Par défaut
    Bon apparemment il y a un compte utilisateur et un groupe créés sur la base de données. Et quand on m'a donné la base de données on me l'avait pas dit...
    Du coup j'ai rajouté le nom d'utilisateur dans ma chaîne de connexion et maintenant j'obtiens une erreur lors du dbConnection.Open() :
    Impossible de démarrer votre application. Le fichier d'informations du groupe de travail est absent ou ouvert en mode exclusif par un autre utilisateur.

    Ce compte utilisateur me permet d'écrire dans la base et de modifier les données, et à priori pour l'instant il n'y a que moi de connecter à la base puisque c'est un serveur de test pour moi... donc je sèche encore...

  16. #16
    Membre Expert Avatar de guitoux1
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 011
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 011
    Par défaut
    Tu n'as pas la base d'ouverte avec Access en même temps ?

  17. #17
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Juin 2006
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2006
    Messages : 92
    Par défaut
    Ma base de données est sur un serveur, et il n'y a que moi qui y accède pour l'instant. J'utilise dans mon programme des DataReader mais à chaque fois je ferme les connections. La mise à jour est la seule fois où j'ouvre une connection en écriture, tout le reste c'est des requêtes Select...

    De plus, l'intérêt de mon site c'est que plusieurs personnes puissent accèder à la base de données en lecture ou en écriture, en même temps... Mais pour l'instant c'est pas gagner...

  18. #18
    Membre Expert Avatar de guitoux1
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 011
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 011
    Par défaut
    Peut-être une question de droits sur le serveur ? droits d'écriture sur le fichier/répertoire de ta BDD ?

  19. #19
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Juin 2006
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2006
    Messages : 92
    Par défaut
    Pour ce qui est de la base de données, il y a 2 groupes : Administrateurs et Utilisateurs (apparemment c'est normal). Et il y a un utilisateur commun nommé Administrateur qui a tous les droits...
    J'ai fait un petit imprim' écran...

    Pour ce qui est du serveur pour l'instant je travaille dans un dossier dans lequel je peux écrire...
    Images attachées Images attachées  

  20. #20
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Juin 2006
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2006
    Messages : 92
    Par défaut
    Bon, j'ai trouvé le problème. En fait, celui qui héberge mon site n'avait pas créé de compte utilisateur ASP .NET, donc je n'avais pas les droits en écriture en ASP .NET.

    Je vous remercie quand même pour mes autres problèmes liés à cette mise à jour fastidieuse...

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

Discussions similaires

  1. [Débutant] Update BDD Access avec Recorset
    Par kitcarflo dans le forum VB.NET
    Réponses: 3
    Dernier message: 15/06/2013, 23h07
  2. Réponses: 5
    Dernier message: 04/04/2012, 18h49
  3. Update sous Access
    Par Sk8cravis dans le forum Langage SQL
    Réponses: 7
    Dernier message: 16/04/2009, 14h29
  4. Problème d'ajout multiples dans un BDD Access
    Par arnaud_verlaine dans le forum Langage SQL
    Réponses: 3
    Dernier message: 31/05/2004, 13h34
  5. Comment créer une Table dans 1 Bdd ACCESS avec Builder??
    Par makandja dans le forum C++Builder
    Réponses: 6
    Dernier message: 17/03/2004, 20h21

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