Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Edition base Access dans un DataGridView

1 réponse
Avatar
Gloops
Bonjour tout le monde,

Bon, alors pour ce qui est de corriger les champs clefs, =E7a y est, en=20
montant une usine =E0 gaz j'ai pu faire =E7a via une connexion oledb en f=
in=20
de proc=E9dure, =E7a marche aux petits oignons. La connexion en question =

n'est ouverte que sur demande, si l'utilisateur veut modifier des champs =

clefs.

Maintenant, il reste =E0 modifier les autres champs. J'ai s=FBrement d=FB=
=20
red=E9finir des choses en route, le DataSet, la source du DataGridView,=20
toujours est-il que maintenant les modifs faites dans le DataGridView ne =

sont plus sauvegard=E9es.

A la sortie du formulaire j'affiche le champ du dataset, donc comme =E7a =

je v=E9rifie que le dataset a bien =E9t=E9 modifi=E9 tel que demand=E9 pa=
r=20
l'utilisateur, mais lorsque je recharge le formulaire je retrouve les=20
anciennes valeurs, donc les nouvelles n'ont pas =E9t=E9 sauvegard=E9es da=
ns la=20
base.

La requ=EAte UPDATE me surprend, j'en saisis une autre dans le code du=20
dataset, et l=E0 =E0 la sortie je m'aper=E7ois que le dataset n'est pas=20
modifi=E9, donc, finalement, la requ=EAte initiale n'=E9tait peut-=EAtre =
pas si=20
mauvaise que =E7a.

Bon, j'ai la solution de faire appel =E0 mon usine =E0 gaz pour sauvegard=
er=20
tous les champs, =E7a devrait finir par fonctionner, mais j'imagine qu'il=
=20
doit y avoir plus =E9l=E9gant.

Cette fois le formulaire principal est juste un menu, qui n'appelle pas=20
de donn=E9es, donc je pense avoir r=E9gl=E9 ce conflit.

Bon, on va laisser mijoter un peu.
Si quelqu'un a une d=E9marche carr=E9e pour modifier une table Access ave=
c=20
un DataGridView ...





A titre de curiosit=E9, voil=E0 l'essentiel de l'usine =E0 gaz. Il y a au=
ssi=20
un tableau d'objets dr[] d=E9clar=E9 au niveau module et initialis=E9 =E0=
new=20
dans le Form_Load.

private void button1_Click(object sender, EventArgs e)
{
if (posNumPosteTextBox.Visible)
{
this.Width =3D 650;
//MessageBox.Show(actDatePlanActionDateTimePicker.Value.ToString(),
// dr[2].ToString());

string[] sep =3D { "", "'", "'", "" };
=09
string[] nouvval =3D {posNumPosteTextBox.Text,
tyaCleTypeActionTextBox.Text,
actDatePlanActionDateTimePicker.Value.ToString("dd/MM/yyyy"),
actNumOrdreTextBox.Text};

string strSQL =3D "UPDATE tabAction SET ";
for (int n =3D 0; n < 4; n++)
{
strSQL =3D strSQL + "" +=20
dataGridView1.CurrentRow.Cells[n].OwningColumn.HeaderCell.Value.ToString(=
)
+ " =3D ";
if (dataGridView1.CurrentRow.Cells[n].ValueType.ToString() =3D=3D=20
"System.DateTime")
{
strSQL =3D strSQL + "DateValue(";
}
strSQL =3D strSQL + sep[n] + nouvval[n] + sep[n];
if (dataGridView1.CurrentRow.Cells[n].ValueType.ToString() =3D=3D=20
"System.DateTime")
{
strSQL =3D strSQL + ")";
}
strSQL =3D strSQL + ", ";
}
strSQL =3D strSQL.Substring(0, strSQL.Length - 2) + " WHERE ";
for (int n =3D 0; n < 4; n++)
{
strSQL =3D strSQL +=20
dataGridView1.CurrentRow.Cells[n].OwningColumn.HeaderCell.Value.ToString(=
)
+ " =3D ";
if (dataGridView1.CurrentRow.Cells[n].ValueType.ToString() =3D=3D=20
"System.DateTime")
{
strSQL =3D strSQL + "DateValue(";
}
strSQL =3D strSQL + sep[n] + dr[n] + sep[n];
if (dataGridView1.CurrentRow.Cells[n].ValueType.ToString() =3D=3D=20
"System.DateTime")
{
strSQL =3D strSQL + ")";
}
strSQL =3D strSQL + " AND ";
}
strSQL =3D strSQL.Substring(0, strSQL.Length - 5);
//MessageBox.Show(strSQL);

try
{
System.Data.OleDb.OleDbCommand command =3D new=20
System.Data.OleDb.OleDbCommand();
command.CommandType =3D CommandType.Text;
command.CommandText =3D strSQL;
string strConnectionString =3D=20
global::CandEtat.Properties.Settings.Default.Candid_dbConnectionString;
=09
using (System.Data.OleDb.OleDbConnection connection =3D new=20
System.Data.OleDb.OleDbConnection(strConnectionString))
{
=09
//OleDbTransaction trans =3D null;
command.Connection =3D connection;
command.UpdatedRowSource =3D UpdateRowSource.Both;
connection.Open();
//trans =3D connection.BeginTransaction();
command.ExecuteNonQuery();
//trans.Commit();
accDataSetAction.tabAction.AcceptChanges();
=20
//MessageBox.Show(accDataSetAction.tabAction.Rows[accDataSetAction.tabAct=
ion.Rows.Count=20
- 1][2].ToString());

}
}
catch (Exception Ex)
{

MessageBox.Show("Erreur lors de la modification des clefs : \n\n\n" + =

Ex.Message);
}

this.posNumPosteTextBox.ResumeLayout();
this.posNumPosteTextBox.Visible =3D false;

this.tyaCleTypeActionTextBox.ResumeLayout();
this.tyaCleTypeActionTextBox.Visible =3D false;

this.actDatePlanActionDateTimePicker.ResumeLayout();
this.actDatePlanActionDateTimePicker.Visible =3D false;

this.actNumOrdreTextBox.ResumeLayout();
this.actNumOrdreTextBox.Visible =3D false;

dataGridView1.CommitEdit(DataGridViewDataErrorContexts.Commit);
accDataSetAction.tabAction.AcceptChanges();
accDataSetAction.AcceptChanges();
=20
//MessageBox.Show(accDataSetAction.tabAction.Rows[accDataSetAction.tabAct=
ion.Rows.Count=20
- 1][2].ToString(), "Dans le DataSet");
}
else
{
this.Width =3D 1116;
dr[0] =3D dataGridView1.CurrentRow.Cells[0].Value;
dr[1] =3D dataGridView1.CurrentRow.Cells[1].Value;
dr[2] =3D dataGridView1.CurrentRow.Cells[2].Value;
dr[3] =3D dataGridView1.CurrentRow.Cells[3].Value;

this.posNumPosteTextBox.SuspendLayout();
this.posNumPosteTextBox.Visible =3D true;

this.tyaCleTypeActionTextBox.SuspendLayout();
this.tyaCleTypeActionTextBox.Visible =3D true;

this.actDatePlanActionDateTimePicker.SuspendLayout();
this.actDatePlanActionDateTimePicker.Visible =3D true;

this.actNumOrdreTextBox.SuspendLayout();
this.actNumOrdreTextBox.Visible =3D true;
}
this.Controls["posNumPosteLabel"].Visible =3D posNumPosteTextBox.Visible=
;
this.Controls["tyaCleTypeActionLabel"].Visible =3D=20
tyaCleTypeActionTextBox.Visible;
this.Controls["actDatePlanActionLabel"].Visible =3D=20
actDatePlanActionDateTimePicker.Visible;
this.Controls["actNumOrdreLabel"].Visible =3D actNumOrdreTextBox.Visible=
;

}

1 réponse

Avatar
Gloops
Bonjour,

J'ai écrit une mini-usine à gaz dans dataGridView1_CellEndEdit, avec
exécution à chaque fois.

Cette formule est la plus lente puisqu'elle requiert un appel à la base
à chaque modification de cellule, mais elle est plus facile à débog uer
puisqu'on sait dans quels cas se pose un problème d'exécution de la
requête, le code de la requête et l'exception levée.

Au vu des résultats, la piste à suivre semble être qu'il manquait l a
gestion des valeurs nulles. J'ai bien détecté un problème à ce ni veau
car un des paramètres indiquait des valeurs nulles refusées alors que je
n'avais pas conscience qu'elles le soient dans la base, mais même en
mettant quelque chose dans le champ ça ne passait pas. Il reste donc
peut-être autre chose. Les paramètres sont créés par défaut ave c taille
0, je ne suis pas très certain que ce soit approprié.
Au passage j'en ai profité pour ajouter la gestion des chaînes de
caractères comportant une apostrophe (caractère encadrant les chaîn es de
caractères), bien que le problème ne se posait pas avec les exemples
essayés au préalable.

Quand on ne met rien dans une cellule, on reçoit une valeur nulle en
retour. Je m'attendais à une chaîne vide, et en toute rigueur il devr ait
y avoir moyen de proposer les deux. Apparemment, si on veut proposer les
deux à l'utilisateur il faut réfléchir à une implémentation -pe ut-être
lui proposer le choix avec une boîte de dialogue, mais dans ce cas
j'imagine que l'édition de la requête dans une procédure événem entielle
est la bonne formule.

Si quelqu'un veut se lancer dans l'approfondissement de cette question
pour pouvoir faire les modifications dans la base Access avec une
requête de modification fournie dans le DataSet, je peux lui refiler ce
que j'ai fait histoire de gagner du temps, il faut dire qu'avec
l'exécution champ par champ on voit largement plus clair, avec la
requête du DataSet tout ce qu'on voit comme erreur est que la valeur
n'est pas sauvegardée.
_____________________________________
Gloops a écrit, le 11/08/2009 14:53 :
Bonjour tout le monde,

Bon, alors pour ce qui est de corriger les champs clefs, ça y est, en
montant une usine à gaz j'ai pu faire ça via une connexion oledb en fin
de procédure, ça marche aux petits oignons. La connexion en questio n
n'est ouverte que sur demande, si l'utilisateur veut modifier des champ s
clefs.

Maintenant, il reste à modifier les autres champs. J'ai sûrement dû
redéfinir des choses en route, le DataSet, la source du DataGridView,
toujours est-il que maintenant les modifs faites dans le DataGridView n e
sont plus sauvegardées.

A la sortie du formulaire j'affiche le champ du dataset, donc comme ç a
je vérifie que le dataset a bien été modifié tel que demandé par
l'utilisateur, mais lorsque je recharge le formulaire je retrouve les
anciennes valeurs, donc les nouvelles n'ont pas été sauvegardées dans la
base.

La requête UPDATE me surprend, j'en saisis une autre dans le code du
dataset, et là à la sortie je m'aperçois que le dataset n'est pas
modifié, donc, finalement, la requête initiale n'était peut-êtr e pas si
mauvaise que ça.

Bon, j'ai la solution de faire appel à mon usine à gaz pour sauvega rder
tous les champs, ça devrait finir par fonctionner, mais j'imagine qu' il
doit y avoir plus élégant.

Cette fois le formulaire principal est juste un menu, qui n'appelle pas
de données, donc je pense avoir réglé ce conflit.

Bon, on va laisser mijoter un peu.
Si quelqu'un a une démarche carrée pour modifier une table Access a vec
un DataGridView ...





A titre de curiosité, voilà l'essentiel de l'usine à gaz. Il y a aussi
un tableau d'objets dr[] déclaré au niveau module et initialisé à new
dans le Form_Load.

private void button1_Click(object sender, EventArgs e)
{
if (posNumPosteTextBox.Visible)
{
this.Width = 650;
//MessageBox.Show(actDatePlanActionDateTimePicker.Value.ToStrin g(),
// dr[2].ToString());

string[] sep = { "", "'", "'", "" };

string[] nouvval = {posNumPosteTextBox.Text,
tyaCleTypeActionTextBox.Text,

actDatePlanActionDateTimePicker.Value.ToString("dd/MM/yyyy"),
actNumOrdreTextBox.Text};

string strSQL = "UPDATE tabAction SET ";
for (int n = 0; n < 4; n++)
{
strSQL = strSQL + "" +
dataGridView1.CurrentRow.Cells[n].OwningColumn.HeaderCell.Value.ToStrin g()
+ " = ";
if (dataGridView1.CurrentRow.Cells[n].ValueType.ToString()
== "System.DateTime")
{
strSQL = strSQL + "DateValue(";
}
strSQL = strSQL + sep[n] + nouvval[n] + sep[n];
if (dataGridView1.CurrentRow.Cells[n].ValueType.ToString()
== "System.DateTime")
{
strSQL = strSQL + ")";
}
strSQL = strSQL + ", ";
}
strSQL = strSQL.Substring(0, strSQL.Length - 2) + " WHERE ";
for (int n = 0; n < 4; n++)
{
strSQL = strSQL +
dataGridView1.CurrentRow.Cells[n].OwningColumn.HeaderCell.Value.ToStrin g()
+ " = ";
if (dataGridView1.CurrentRow.Cells[n].ValueType.ToString()
== "System.DateTime")
{
strSQL = strSQL + "DateValue(";
}
strSQL = strSQL + sep[n] + dr[n] + sep[n];
if (dataGridView1.CurrentRow.Cells[n].ValueType.ToString()
== "System.DateTime")
{
strSQL = strSQL + ")";
}
strSQL = strSQL + " AND ";
}
strSQL = strSQL.Substring(0, strSQL.Length - 5);
//MessageBox.Show(strSQL);

try
{
System.Data.OleDb.OleDbCommand command = new
System.Data.OleDb.OleDbCommand();
command.CommandType = CommandType.Text;
command.CommandText = strSQL;
string strConnectionString =
global::CandEtat.Properties.Settings.Default.Candid_dbConnectionString;

using (System.Data.OleDb.OleDbConnection connection = new
System.Data.OleDb.OleDbConnection(strConnectionString))
{

//OleDbTransaction trans = null;
command.Connection = connection;
command.UpdatedRowSource = UpdateRowSource.Both;
connection.Open();
//trans = connection.BeginTransaction();
command.ExecuteNonQuery();
//trans.Commit();
accDataSetAction.tabAction.AcceptChanges();

//MessageBox.Show(accDataSetAction.tabAction.Rows[accDataSetAction.tabA ction.Rows.Count
- 1][2].ToString());

}
}
catch (Exception Ex)
{

MessageBox.Show("Erreur lors de la modification des clefs :
nnn" + Ex.Message);
}

this.posNumPosteTextBox.ResumeLayout();
this.posNumPosteTextBox.Visible = false;

this.tyaCleTypeActionTextBox.ResumeLayout();
this.tyaCleTypeActionTextBox.Visible = false;

this.actDatePlanActionDateTimePicker.ResumeLayout();
this.actDatePlanActionDateTimePicker.Visible = false;

this.actNumOrdreTextBox.ResumeLayout();
this.actNumOrdreTextBox.Visible = false;

dataGridView1.CommitEdit(DataGridViewDataErrorContexts.Commit);
accDataSetAction.tabAction.AcceptChanges();
accDataSetAction.AcceptChanges();

//MessageBox.Show(accDataSetAction.tabAction.Rows[accDataSetAction.tabA ction.Rows.Count
- 1][2].ToString(), "Dans le DataSet");
}
else
{
this.Width = 1116;
dr[0] = dataGridView1.CurrentRow.Cells[0].Value;
dr[1] = dataGridView1.CurrentRow.Cells[1].Value;
dr[2] = dataGridView1.CurrentRow.Cells[2].Value;
dr[3] = dataGridView1.CurrentRow.Cells[3].Value;

this.posNumPosteTextBox.SuspendLayout();
this.posNumPosteTextBox.Visible = true;

this.tyaCleTypeActionTextBox.SuspendLayout();
this.tyaCleTypeActionTextBox.Visible = true;

this.actDatePlanActionDateTimePicker.SuspendLayout();
this.actDatePlanActionDateTimePicker.Visible = true;

this.actNumOrdreTextBox.SuspendLayout();
this.actNumOrdreTextBox.Visible = true;
}
this.Controls["posNumPosteLabel"].Visible = posNumPosteTextBox.Vi sible;
this.Controls["tyaCleTypeActionLabel"].Visible =
tyaCleTypeActionTextBox.Visible;
this.Controls["actDatePlanActionLabel"].Visible =
actDatePlanActionDateTimePicker.Visible;
this.Controls["actNumOrdreLabel"].Visible = actNumOrdreTextBox.Vi sible;

}