Bonjour,
Dèrrière ce titre se cache un problème fréquent apparemment non résolu dans le forum :
Récupérer la valeur d'un champ en Numéro auto après une insertion dans une table (T_Contacts) pour aller lui associer des droits dans une table (T_Autorisations).
A une époque j'avais fait ça sous Oracle 9i via une procédure stockée mais là j'utilise Access 2003 ... Qui n'a pas l'air de gérer les procédures stockées, qui est cachotier quand aux noms de ses séquences, et dont l'aide ne m'aide pas vraiment pour ce problème ...
Donc voici la méthode choisie dans mon programme en C# :
Insertion dans T_Contacts
Récupération de la valeur maximale de T_Contacts.Id
Insertion dans T_Autorisations avec la valeur récupérée ci-dessus
Tel quel la valeur récupérée n'est pas forcément celle que je veut en cas d'insertions venant de plusieurs utilisateurs dans T_Contacts.
Pour sécuriser cette démarche j'utilise un System.Data.OleDb.OleDbTransaction. Il existe une énumération (IsolationLevel) à passer en paramètre de la méthode "BeginTransaction" mais j'ai pô tout compris et en essayant avec la valeur "ReadCommitted " je me suis fait jeter ...
Voici mon code actuel :
System.Data.OleDb.OleDbConnection conn =
new System.Data.OleDb.OleDbConnection(fAuth.getConnectionString());
System.Data.OleDb.OleDbCommand comm =
new System.Data.OleDb.OleDbCommand() ;
comm.Connection = conn;
conn.Open();
System.Data.OleDb.OleDbTransaction transaction;
transaction = conn.BeginTransaction();
comm.Transaction = transaction;
[Je construit mes requêtes et les exécute ...]
try
{
transaction.Commit();
}
catch(Exception ex)
{
try
{
transaction.Rollback();
}
catch (System.Data.OleDb.OleDbException exe)
{
if (transaction.Connection != null)
{
Console.WriteLine("An exception of type " + exe.GetType() +
" was encountered while attempting to roll back the transaction.");
}
}
Console.WriteLine("An exception of type " + ex.GetType() +
" was encountered while inserting the data.");
Console.WriteLine("Neither record was written to database.");
}
conn.Close();
Est-ce suffisant pour garantir que le T_Contacts.Id récupéré est bien celui que je veut ?
Merci d'avance,
Gaxx