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

Windows Forms Discussion :

[C#][Access 2003] Adapter.update()


Sujet :

Windows Forms

  1. #1
    Membre averti
    Inscrit en
    Avril 2004
    Messages
    53
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 53
    Par défaut [C#][Access 2003] Adapter.update()
    Bonjour,

    J'ai un problème lorsque je veux mettre à jour une DB Access en mode déconnecté via monDataAdapter.uptdate(maTable)

    Je fais un select d'une table, mets à jour cette datatable et veux réenrégistrer mes modifications (insert, update).
    Je précise que j'ai créé deux requete différente, une pour l'insert et une pour le update
    Tout ce passe très bien pour :
    un update
    un insert
    un update et un insert
    plusieurs update

    mais cela ne fonctionne plus pour plusieurs insert.

    En fait cela fonctionne mais les résutats ne sont pas cohérents.

    Je prend un expemple:

    J'ai une DataTable contenant 3 champs (en réalité il y en a plus de 30)
    name ==> PK
    path ==> Pk
    dateModification

    ma DB access est vide, j'ajoute dans ma DataTable (coté c#) 2 rows
    par exemple

    new_proposal_Proposition.doc
    C:\MyPrj\20060116
    12/12/2005


    et

    toto.doc
    C:\MyPrj\20060116
    12/12/2005


    ma dataTable contient bien les bonnes données, le rowState de ces 2 rows est à Inserted, jusque là pas de problème

    lorsque je fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    monDataAdapter.UpdateCommand = cmdUpdate;
    monDataAdapter.InsertCommand = cmdInsert;
     
    monDataAdapter.ContinueUpdateOnError = true;
    dModified = monDataAdapter.Update(maDataTable);
    le résultat dans la DB ressemble à ceci

    celle-ci est correcte
    new_proposal_Proposition.doc
    C:\MyPrj\20060116
    12/12/2005



    celle-ci ne l'est pas
    toto.docposal_Proposition.doc
    C:\MyPrj\20060116
    12/12/2005


    on peut voir qu'il a pris le nom du champ name et ajouter un partie du champ name de la row supérieure.

    J'ai utilisé le même code c# avec des stored procedure sous sql server 2000 et le problème ne se représente pas.

    Quelqu'un sait-il s'il existe une restriction au niveau access quant aux mises à jour de db en mode déconnecté

  2. #2
    Membre Expert
    Avatar de Piotrek
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2004
    Messages
    869
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Mars 2004
    Messages : 869
    Par défaut


    Salut

    Ca serait vraiement surprenant que cela soit un bug access. Il faut que tu execute en mode pas-a-pas et que tu verifie les insertcommands qui sont generees par l'adapter

  3. #3
    Invité de passage
    Inscrit en
    Juillet 2006
    Messages
    1
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 1
    Par défaut
    j'ai le même problème comment faites vous pour vérifier les insertcommands qui sont génées par l'adapter ?

    Merci

  4. #4
    Membre averti
    Inscrit en
    Avril 2004
    Messages
    53
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 53
    Par défaut
    C'est quand même assez bizarre, cela ressemble à un problème de flush ou quelque chose du style.

  5. #5
    Membre averti
    Inscrit en
    Avril 2004
    Messages
    53
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 53
    Par défaut
    Le plus étrange est que le même code passe avec sql server 2000.
    J'utilise Oledb dans les 2 cas.

    la seule chose qui change est qu'avec access je n'ai pas spécifié le commandeType:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cmdInsert.CommandType = CommandType.StoredProcedure;
    car il me générait un erreur me disant qu'il attendait le nom d'une requête après EXECUTE

    j'ai donc uniquement utilier le commantext:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cmdInsert.CommandText="EXECUTE maRequete";

  6. #6
    Membre Expert
    Avatar de Piotrek
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2004
    Messages
    869
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Mars 2004
    Messages : 869
    Par défaut
    Pour verifier les commandes, j'ai pas de VS sous la main pour confirmer mais il existe un evement RowUpdating et RowUpdated pour le dataadapter (il suffit de le declarer withevents et mettre le code adequat le temps de debugger, il y a des exemples dans les liens)

    La seule explication logique d'une erreur dans ton cas serait un pb dans la requete stockee d'Access pour l'insert... Ou effectivement un gros bug, je vais chercher dans ce sens si tu ne trouve pas la solution

  7. #7
    Membre averti
    Inscrit en
    Avril 2004
    Messages
    53
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 53
    Par défaut
    J'ai réessayé en prenant uniquement 4 champs.
    J'ai fait 2 inserts et toujours le même problème.
    J'ai alors vérifié les insertcommandes générés par l'adapter comme conseillé par Piotrek, en utilisant tel quel (ou presque) l'exemple de la msdn.
    Les données sont tout à fait correctes lorsque je passe dans le OnRowUpdating par contre elles ne le sont pas dans la base de données !!!!
    Je suppose donc que c'est bien une limitation (ou un bug) d'access .

  8. #8
    Membre Expert
    Avatar de Piotrek
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2004
    Messages
    869
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Mars 2004
    Messages : 869
    Par défaut
    Incroyable...

    Montre le code concernant l'adapter (sans en mettre une montagne non plus) et la requete stockee d'access

  9. #9
    Membre averti
    Inscrit en
    Avril 2004
    Messages
    53
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 53
    Par défaut
    Voilà le code de mon petit test, soit j'oublie de faire quelque chose qui m'échappe, soit il y a un bug !!

    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
    	private void Form1_Load(object sender, System.EventArgs e)
    	{
    		DataTable dtTemp = GelAllRecord();
    		gridControl1.DataSource = dtTemp;
     
    		DataRow dr = dtTemp.NewRow();
    		dr["idProfolio"] = 1;
    		dr["name"] = "420_ELECTRO titi PATRICK_7553791_229813.pp6";
    		dr["Path"] = @"G:\\out\MonsieurTOTO\WM\06_71";
    		dr["datemodification"] = DateTime.Now;
    		dtTemp.Rows.Add(dr);
     
    		DataRow dr2 = dtTemp.NewRow();
    		dr2["idProfolio"] = 2;
    		dr2["name"] = "toto.pp6";
    		dr2["Path"] = @"G:\\out\MonsieurTOTO\WM\06_40";
    		dr2["datemodification"] = DateTime.Now.AddDays(5);
    		dtTemp.Rows.Add(dr2);
     
    		SaveFile(dtTemp);
    	}
    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
    	private void SaveFile(DataTable dtAll)
    	{
    		DataTable	dt =  dtAll.GetChanges(); 
    		int dModified =0;
    		OleDbCommand cmdSaveUpd = new OleDbCommand();
    		OleDbCommand cmdSaveIns = new OleDbCommand();
     
    		OleDbConnection conDB = new OleDbConnection();
    		OleDbDataAdapter da = new OleDbDataAdapter();
     
    		try
    		{
    			conDB.ConnectionString = myConnection;
    			conDB.Open();
    			if (dt != null)
    			{	
    				cmdSaveUpd.Connection= conDB;
    				cmdSaveIns.Connection= conDB;
     
    				cmdSaveIns.CommandText="EXECUTE InsertInDB";
     
    				cmdSaveIns.Parameters.Add(new OleDbParameter("paramidProfolio", OleDbType.Integer, 8, "idProfolio"));
    				cmdSaveIns.Parameters.Add(new OleDbParameter("paramname", OleDbType.VarChar, 255, "name"));
    				cmdSaveIns.Parameters.Add(new OleDbParameter("paramPath", OleDbType.VarChar, 255, "Path"));
    				cmdSaveIns.Parameters.Add(new OleDbParameter("paramdatemodification", OleDbType.Date, 8, "datemodification"));
     
     
    				cmdSaveUpd.CommandText="EXECUTE UpdateInDB";
     
    				cmdSaveUpd.Parameters.Add(new OleDbParameter("paramidProfolio", OleDbType.Integer, 8, "idProfolio"));
    				cmdSaveUpd.Parameters.Add(new OleDbParameter("paramname", OleDbType.VarChar, 255, "name"));
    				cmdSaveUpd.Parameters.Add(new OleDbParameter("paramPath", OleDbType.VarChar, 255, "Path"));
    				cmdSaveUpd.Parameters.Add(new OleDbParameter("paramdatemodification", OleDbType.Date, 8, "datemodification"));
     
    				da.UpdateCommand = cmdSaveUpd;
    				da.InsertCommand = cmdSaveIns;
     
    				da.ContinueUpdateOnError = true;
    				da.RowUpdating += new OleDbRowUpdatingEventHandler(OnRowUpdating);
    				da.RowUpdated += new OleDbRowUpdatedEventHandler(OnRowUpdated);
     
    				dModified = da.Update(dt);		
     
     
    				if (dt.HasErrors)
    				{
    					string strMessage= null;
    					foreach(DataRow row in dt.GetErrors())
    					{
    						strMessage += ( "\n\r" + row.RowError);
    						row.RejectChanges();
    					}
    				}
    			}
    		}
    		catch (Exception ex)
    		{
    			throw ex; 
    		}
    		finally
    		{
    			conDB.Close();	
    		}
    	}
    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 DataTable GelAllRecord()
    	{
    		OleDbConnection conDB = new OleDbConnection();
    		OleDbCommand cmd = new OleDbCommand();
    		OleDbDataAdapter da;
    		DataSet ds = new DataSet();
     
    		conDB.ConnectionString = myConnection;
    		try
    		{
    			cmd.Connection = conDB;
    			cmd.CommandText= "SELECT * from ProfolioTable";
    			da = new OleDbDataAdapter(cmd);
    			da.Fill(ds,"ProfolioTable");
    			return ds.Tables[0];
    		}
    		catch(Exception ex)
    		{
    			Console.WriteLine(ex.Message);
    			return null;
    		}
    		finally
    		{
    			conDB.Close();
    		}
     
    	}
    Ma requete insert
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    PARAMETERS paramidProfolio Long, paramname Text ( 255 ), paramPath Text ( 255 ), paramdatemodification DateTime;
    INSERT INTO ProfolioTable ( idProfolio, name, Path, datemodification )
    VALUES (paramidProfolio, paramname, paramPath, paramdatemodification);

  10. #10
    Membre averti
    Inscrit en
    Avril 2004
    Messages
    53
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 53
    Par défaut
    voilà le résultat du OnRowUpdating qui est correcte
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Champ date: 26/07/2006 18:28:51   name: 420_ELECTRO titi PATRICK_7553791_229813.pp6    path: G:\\out\MonsieurTOTO\WM\06_71
    Champ date: 31/07/2006 18:28:52   name: toto.pp6    path: G:\\out\MonsieurTOTO\WM\06_40
    et voila le résultat de la DB
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Champ date: 26/07/2006 18:28:51   name: 420_ELECTRO titi PATRICK_7553791_229813.pp6    path: G:\\out\MonsieurTOTO\WM\06_71
    Champ date: 26/07/2006 18:28:52   name: toto.pp6TRO titi PATRICK_7553791_229813.pp6    path: G:\\out\MonsieurTOTO\WM\06_40
    Remarquez ce que j'ai mis en rouge, la date de la 2ème qui devrait être le 31 et non le 26. Il y a également une erreur au niveau du champ idProfolio qui devrait être de 2 mais qui a comme valeur 1 (comme la row supérieure)

  11. #11
    Membre Expert
    Avatar de Piotrek
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2004
    Messages
    869
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Mars 2004
    Messages : 869
    Par défaut
    Essaie de renommer le champ Name dans la base de donnees en autre chose Name1 par exemple, Name est un mot reserve en access mais pas en SQL Server

  12. #12
    Membre averti
    Inscrit en
    Avril 2004
    Messages
    53
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 53
    Par défaut
    Même en changeant l'intitulé du champ name et Path par un mot qui n'est pas un mot réservé, le problème est le même.

  13. #13
    Membre averti
    Inscrit en
    Avril 2004
    Messages
    53
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 53
    Par défaut
    Je rectifie apparemment 2 update ne fonctionnent pas non plus.

  14. #14
    Membre Expert
    Avatar de Piotrek
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2004
    Messages
    869
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Mars 2004
    Messages : 869
    Par défaut
    L'erreur reste pour moi totalement incomprehensible...

    Soit il te faut chercher encore, en essayant simplifiant le code au maximum ou en le reecrivant a partir de zero un petit code qui fait strictement pareil

    Verifie que tu as installe tous les services packs de VS et MDAC...

    Tiens moi au courant

Discussions similaires

  1. Réponses: 1
    Dernier message: 27/02/2009, 14h09
  2. [ADP Access 2003/SQL Serveur 2000] Vue non "updatable"
    Par billybob2 dans le forum Access
    Réponses: 14
    Dernier message: 27/02/2009, 07h43
  3. Réponses: 2
    Dernier message: 24/01/2008, 13h41
  4. [access 2003] erreur d syntaxe update
    Par Milyshyn76 dans le forum VBA Access
    Réponses: 1
    Dernier message: 12/01/2008, 05h51
  5. [access 2003][débutante] problème avec update
    Par Milyshyn76 dans le forum Requêtes et SQL.
    Réponses: 10
    Dernier message: 04/01/2008, 16h48

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