Validation manquante

Le
Gloops
Bonjour tout le monde,

Dans une application Winform, j'accède à une base Access avec un
DataGridView.

A côté de ce DataGridView, sur l'enregistrement sélectionné, je c=
rée une
requête update (pour rectifier un champ de clef, voir fil précédent=
), et
je l'exécute avec une oledbConnection.

Tant que mon application est ouverte, même après avoir fermé le
formulaire, la valeur est bien corrigée, ça baigne.

Patatras, dès que j'ai fermé l'application, à l'utilisation suivant=
e, le
champ a repris la valeur qu'il avait avant.

Il manque une validation quelque part, j'hésite à dire où

Si quelqu'un pouvait me rafraichir les esprits

J'ai essayé

dataGridView1.CommitEdit(DataGridViewDataErrorContexts.Commit);

command.UpdatedRowSource = UpdateRowSource.Both;
// avant d'ouvrir la connection


J'ai aussi essayé avec une transaction, mais curieusement, ce que je
comprends du texte de l'erreur est qu'on ne peut ouvrir une transaction
que si il y en a déjà une en cours, alors que je me serais naïvemen=
t
représenté l'inverse.

code :
OleDbTransaction trans = null;
command.Connection = connection;
command.UpdatedRowSource = UpdateRowSource.Both;
connection.Open();
trans = connection.BeginTransaction();
command.ExecuteNonQuery();
trans.Commit();

erreur sur ExecuteNonQuery :
"System.InvalidOperationException: ExecuteNonQuery implique que la
commande comporte une transaction lorsque la connexion attribuée à la=

commande se trouve dans une transaction locale en attente. La propriété=

Transaction de la commande n'a pas été initialisée.
à
System.Data.OleDb.OleDbConnectionInternal.ValidateTransaction(OleDbTransa=
ction
transaction, String method)
à
System.Data.OleDb.OleDbConnection.ValidateTransaction(OleDbTransaction
transaction, String method)
à
System.Data.OleDb.OleDbCommand.ValidateConnectionAndTransaction(String
method)
à
System.Data.OleDb.OleDbCommand.ExecuteReaderInternal(CommandBehavior
behavior, String method)
à System.Data.OleDb.OleDbCommand.ExecuteNonQuery()
à CandEtat.frmActions.button1_Click(Object sender, EventArgs e) dan=
s
C:\Documents and Settings\admin\Mes documents\Visual Studio
2005\Projects\CandEtat\CandEtat\frmActions.cs:ligne 109"
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Gloops
Le #19911731
ça y est, ça marche.

Le formulaire où sont faites les modifications n'est pas le formulaire
principal, et le formulaire principal avait un DataSet ouvert sur la
même table. ça fait que les anciennes données restaient chargées dans le
DataSet du formulaire principal, et donc était restaurées lors de la
fermeture de celui-ci.

J'ai créé un formulaire de menu pour appeler l'un ou l'autre, comme ç a
le formulaire principal ne contient plus de données, et le problème n e
se pose plus.

J'ai bien essayé d'appliquer le principe dont parlait cc18 l'autre jour ,
à savoir déclarer public la source de données du formulaire princip al,
et l'appeler depuis l'autre formulaire. Il s'avère que cette affaire-là
est un fichu casse-tête. En effet, le owner n'est renseigné qu'aprè s le
InitializeComponent, donc si on veut aller fouiller dedans ça suppose d e
décaler les instructions du InitializeComponent concernant la source
commune vers le Form_Load. J'ai essayé de jouer à ça, et puis il
s'avérait que le DataGridView était vide, alors que la DataTable
contenait bien les données. ça peut être intéressant de chercher un peu
plus loin, mais pour le moment j'ai préféré en rester à des faç ons de
travailler plus habituelles.

Bon alors pour les tests il faut prendre en compte autre chose encore :
depuis l'environnement de développement on se retrouve systématiqueme nt
avec les mêmes données, car la base comporte l'attribut Copy Always,
donc lors de la compilation la base est copiée du répertoire source v ers
bindebug. Après déploiement ce problème ne se pose plus -ou alors on
change la propriété Copy to Output Directory.

Pour tout dire, je n'ai déployé qu'après avoir créé un formulai re
principal sans données.
_____________________________________
Gloops a écrit, le 10/08/2009 17:35 :
Bonjour tout le monde,

Dans une application Winform, j'accède à une base Access avec un
DataGridView.

A côté de ce DataGridView, sur l'enregistrement sélectionné, je crée une
requête update (pour rectifier un champ de clef, voir fil précéde nt), et
je l'exécute avec une oledbConnection.

Tant que mon application est ouverte, même après avoir fermé le
formulaire, la valeur est bien corrigée, ça baigne.

Patatras, dès que j'ai fermé l'application, à l'utilisation suiva nte, le
champ a repris la valeur qu'il avait avant.

Il manque une validation quelque part, j'hésite à dire où ...

Si quelqu'un pouvait me rafraichir les esprits ...

J'ai essayé

dataGridView1.CommitEdit(DataGridViewDataErrorContexts.Commit);

command.UpdatedRowSource = UpdateRowSource.Both;
// avant d'ouvrir la connection


J'ai aussi essayé avec une transaction, mais curieusement, ce que je
comprends du texte de l'erreur est qu'on ne peut ouvrir une transaction
que si il y en a déjà une en cours, alors que je me serais naïvem ent
représenté l'inverse.

code :
OleDbTransaction trans = null;
command.Connection = connection;
command.UpdatedRowSource = UpdateRowSource.Both;
connection.Open();
trans = connection.BeginTransaction();
command.ExecuteNonQuery();
trans.Commit();

erreur sur ExecuteNonQuery :
"System.InvalidOperationException: ExecuteNonQuery implique que la
commande comporte une transaction lorsque la connexion attribuée à la
commande se trouve dans une transaction locale en attente. La proprié té
Transaction de la commande n'a pas été initialisée.rn
à
System.Data.OleDb.OleDbConnectionInternal.ValidateTransaction(OleDbTran saction
transaction, String method)rn
à
System.Data.OleDb.OleDbConnection.ValidateTransaction(OleDbTransaction
transaction, String method)rn
à
System.Data.OleDb.OleDbCommand.ValidateConnectionAndTransaction(String
method)rn
à
System.Data.OleDb.OleDbCommand.ExecuteReaderInternal(CommandBehavior
behavior, String method)rn
à System.Data.OleDb.OleDbCommand.ExecuteNonQuery()rn
à CandEtat.frmActions.button1_Click(Object sender, EventArgs e) da ns
C:\Documents and Settings\admin\Mes documents\Visual Studio
2005\Projects\CandEtat\CandEtat\frmActions.cs:ligne 109"



Publicité
Poster une réponse
Anonyme