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 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79
|
//// Partie du code correspond à la sélection
// Ma chine de connexion définit dans le settings du projet
private OdbcConnection maCnx=Systems.Settings.Default.ChaineConnexion;
// Transaction
private OdbcTransaction maTrans= maCnx.BeginTransaction();
// Ma Commande pour le select
private OdbcCommand maCmd = new OdbcCommand();
// Mon Adapter
private OdbcDataAdapter myAdp;
// Mon DataSet de remplissage
private DataSet myDS = new DataSet();
// Paramétrage de ma commande:
Cmd.Connection = maCnx;
Cmd.CommandType=CommandType.Text;
Cmd.CommandText = "SELECT * FROM mytable";
Cmd.Transaction = maTrans;
myAdp = new OdbcDataAdapter(Cmd);
myAdp.Fill(DS, "MaTable");
// Fermeture de la transaction
maTrans.Rollback();
//// Partie du code ou je modifie mes DataRow
foreach (DataRow dr in DS.Tables["MaTable"].Rows)
{
if ((int)dr["col1"]==1)
dr["col1"] = (int)2;
if ((int)dr["col1"]==3)
dr["col1"] = (int)4;
}
//// Partie du code ou je met à jour la base de données
/* maTrans = maCnx.BeginTransaction();
myCmd.Trans = maTrans;
OdbcCommandBuilder bldr = new OdbcCommandBuilder(myAdp);
myAdp.Update(DS.Table["maTable"]);
Si j'avais fonctionné de la sorte ça n'aurait pas marché pour cause de violation d'accès concurentiel. En effet : ma commande updateCommande de mon DataAdapter à une commandText de la façon suivante : (je l'ai vu en debug) ; "UPDATE mytable set col1= ?, col2 = ? where col1 = ? and col2 = ?"
Si ma valeur originale de col2 = Null, il ne sait pas tester correctement le test.
J'ai donc redéfinit l'update command de la manière suivante : */
myAdp.UpdateCommand = new OdbcCommand();
myAdp.UpdateCommand.Connexion = maCnx;
maTrans = maCnx.BeginTransaction();
myAdp.Transaction = maTrans;
myAdp.UpdateCommand.CommandText = "UPDATE mytable SET col1 = ? " +
" WHERE col1 = ?, (col2 = ? or " +
" col2 IS NULL and ? IS NULL";
//Configuration de mes paramètres
OdbcParameter Prm = new OdbcParameter();
Prm.SourceVersion = DataRowState.Current;
Prm.SourceColumn = DS.Tables["MyTable"].Columns["col1"].ColumnName;
myAdp.UpdateCommand.Parameters.Add(Prm);
Prm = new OdbcParameter();
Prm.SourceVersion = DataRowState.Originale;
Prm.SourceColumn = DS.Tables["MyTable"].Columns["col1"].ColumnName;
myAdp.UpdateCommand.Parameters.Add(Prm);
Prm = new OdbcParameter();
Prm.SourceVersion = DataRowState.Originale;
Prm.SourceColumn = DS.Tables["MyTable"].Columns["col2"].ColumnName;
myAdp.UpdateCommand.Parameters.Add(Prm);
Prm = new OdbcParameter();
Prm.SourceVersion = DataRowState.Originale;
Prm.SourceColumn = DS.Tables["MyTable"].Columns["col2"].ColumnName;
myAdp.UpdateCommand.Parameters.Add(Prm);
// Lancement de la requete
myAdp.UpdateCommand.ExecuteNonQuery(); |
Partager