Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

Sujet : Gestion des transaction sous Oracle [ Base de données / Oracle ] (come62)

jeudi 6 septembre 2007 à 14:11:16 | Gestion des transaction sous Oracle

come62

Bonjour à tous,

Je développe une application en C# (forcément) liée à une base Oracle.

Cependant, je n'arrive pas à gérer les transactions sur cette base : exemple, j'insère un enregistrement dans une table et lorsque j'appuie sur le bouton Annuler de ma fenêtre où j'ai codé un Rollback, il ne se passe rien.

Pouvez-vous m'aider ?

Ci-joint ma classe de connection.

Merci d'avance, (ne pas faire attention à la méthode FormaterRequete...) .




using System;
using System.Data;
using System.Data.OracleClient;
using System.Windows.Forms;

namespace DAL
{
    public class CDalOracle
    {
        #region Attributs
        private int               m_iNombreLignes;        // Nombre de lignes du résultat d'une requête
        private int               m_iNombreColonnes;      // Nombre de colonnes du résultat d'une requête
        private OracleConnection  m_oracleConnection;     // Connection à la base de données Oracle
        private OracleCommand     m_oracleCommande;       // Instruction SQL 
        private OracleDataReader  m_oracleDataReader;     // Flux de lignes de données stockant le résultat d'une requête
        private OracleTransaction m_oracleTransaction;    // Gère les transactions Commit & Rollback
        private static string     m_sCHAINE_DE_CONNEXION; // Chaine de connection à la BDD
        #endregion

        public CDalOracle()
        {
            m_iNombreLignes        = 0;
            m_iNombreColonnes      = 0;
            m_oracleConnection     = new OracleConnection();
            m_oracleCommande       = new OracleCommand();
            m_oracleDataReader     = null;
            m_sCHAINE_DE_CONNEXION = @"Data Source = (
                                         DESCRIPTION = (
                                           ADDRESS_LIST = (
                                             ADDRESS = (PROTOCOL = TCP)(HOST = SRV-TOPMAN)(PORT = 1521))
                                           )
                                           (CONNECT_DATA =
                                             (SERVER = DEDICATED)(SERVICE_NAME = bdd)
                                           )
                                         );
                                       User Id = toto; Password = toto;";
        }

        public void Commit()
        {
            m_oracleCommande.CommandType = CommandType.Text;
            m_oracleCommande.Transaction = m_oracleTransaction;
            m_oracleTransaction.Commit();
        }

        public void Connection()
        {
            try
            {
                m_oracleConnection.ConnectionString = m_sCHAINE_DE_CONNEXION;
                m_oracleConnection.Open();
            }
            catch (OracleException e)
            {
                MessageBox.Show(e.Message);
            }
        }

        public void Deconnection()
        {
            try
            {
                m_oracleConnection.Close();
            }
            catch (OracleException e)
            {
                MessageBox.Show(e.Message);
            }
        }

        public void DemarrerTransaction()
        {
            try
            {
                m_oracleTransaction          = m_oracleConnection.BeginTransaction();
                m_oracleCommande.CommandType = CommandType.Text;
                m_oracleCommande.Transaction = m_oracleTransaction;
            }
            catch (OracleException e)
            {
                MessageBox.Show(e.Message);
            }
        }

        public bool ExecuteRequete(string sRequete)
        {
            bool bRetour = false;

            try
            {
                m_oracleCommande = new OracleCommand(sRequete, m_oracleConnection);
                m_oracleCommande.ExecuteNonQuery();
                bRetour          = true;
            }
            catch (OracleException e)
            {
                //m_oracleTransaction.Rollback();
                MessageBox.Show(e.Message);
            }
            finally
            {
                m_oracleCommande = null;
            }

            return bRetour;
        }

        public bool ExecuteRequete(string sRequete, params String[] listeParametres)
        {
            bool bRetour = false;

            try
            {
                string sReq = FormaterRequeteAvecParametres(sRequete, listeParametres);

                if (sReq != null)
                {
                    m_oracleCommande = new OracleCommand(sReq, m_oracleConnection);
                    m_oracleCommande.ExecuteNonQuery();
                    bRetour          = true;
                }
                else
                {
                    //m_oracleTransaction.Rollback();
                    MessageBox.Show("Erreur lors de l'exécution de la requête.", "Erreur !");
                }
            }
            catch (OracleException e)
            {
                MessageBox.Show(e.Message);
            }
            finally
            {
                m_oracleCommande = null;
            }

            return bRetour;
        }

        public string FormaterRequeteAvecParametres(string sRequete, String[] listeParametres)
        {
            string sRetour = null;

            try
            {
                int iIndiceParams = 0;                      // Indice du paramètre courant de listeParametres
                int iNombreParams = listeParametres.Length; // Nombre de paramètres associés à sRequete
                int iLongueur     = 0;                      // Longueur de tous les paramètres de la requête
                int j             = 0;                      // Indice de cReq

                for (int i = 0; i < iNombreParams; i++)
                {
                    iLongueur += listeParametres[i].Length;

                    // Dans le cas d'un paramètre vide, on ajoute 3 caractères pour écrire IS NULL au lieu de = ''
                    if (listeParametres[i] == "")
                        iLongueur += 4;
                }

                int iLongueurNouvelleChaine = iLongueur + sRequete.Length - iNombreParams;  // Longueur de la nouvelle chaine propre
                char[] cReq                 = new char[iLongueurNouvelleChaine];

                // Pour tous les caractères de sRequete
                for (int i = 0; i < sRequete.Length; i++)
                {
                    if (sRequete[i] == '?') // Si c'est un ?, on remplace ? par le premier paramètre de listeParametres[]
                    {
                        string sParam = listeParametres[iIndiceParams++];

                        if (sRequete[i - 1] != '\'')
                            sParam = sParam.Replace(",", ".");

                        sParam = sParam.Replace("'", " ");

                        if (cReq[0] == 'S' && cReq[1] == 'E' && cReq[2] == 'L')
                        {
                            if (sParam == "")
                            {
                                cReq[j - 3] = 'I';
                                cReq[j - 2] = 'S';
                                cReq[j - 1] = ' ';
                                cReq[j++]   = 'N';
                                cReq[j++]   = 'U';
                                cReq[j++]   = 'L';
                                cReq[j++]   = 'L';
                            }
                            else
                            {
                                for (int k = 0; k < sParam.Length; k++)
                                    cReq[j++] = sParam[k];
                            }
                        }
                        else
                        {
                            for (int k = 0; k < sParam.Length; k++)
                                cReq[j++] = sParam[k];
                        }
                    }
                    else // Sinon on copie normalement le caractère
                    {
                        if (cReq[0] == 'S' && cReq[1] == 'E' && cReq[2] == 'L' && cReq[3] == 'E' && cReq[4] == 'C' && cReq[5] == 'T')
                        {
                            if (j > 3)
                            {
                                if (cReq[j - 4] == 'N' && cReq[j - 3] == 'U' && cReq[j - 2] == 'L' && cReq[j - 1] == 'L')
                                    cReq[j++] = ' ';
                                else
                                    cReq[j++] = sRequete[i];
                            }
                            else
                            {
                                cReq[j++] = sRequete[i];
                            }
                        }
                        else
                        {
                            cReq[j++] = sRequete[i];
                        }
                    }
                }

                sRetour = new string(cReq);
            }
            catch (Exception e)
            {
                MessageBox.Show(e.Message);
            }

            return sRetour;
        }

        public String[,] GetResultatsRequete(string sRequete)
        {
            String[,] sTabResult = null;

            try
            {
                m_oracleCommande   = new OracleCommand(sRequete, m_oracleConnection);
                m_oracleDataReader = m_oracleCommande.ExecuteReader();
                m_iNombreLignes    = 0;
                m_iNombreColonnes  = this.m_oracleDataReader.FieldCount;

                // Initialisation du tableau de retour
                while (m_oracleDataReader.Read())
                    m_iNombreLignes++;

                sTabResult = new String[m_iNombreLignes, m_iNombreColonnes];

                m_oracleDataReader.Close();
                m_oracleDataReader = m_oracleCommande.ExecuteReader();

                int i = 0;
                while (m_oracleDataReader.Read())
                {
                    for (int j = 0; j < m_iNombreColonnes; j++)
                        if (m_oracleDataReader.IsDBNull(j) == false)
                            sTabResult[i, j] = m_oracleDataReader.GetOracleValue(j).ToString();
                        else
                            sTabResult[i, j] = ""; // Met "" dans les champs null
                    i++;
                }
            }
            catch (OracleException e)
            {
                MessageBox.Show(e.Message);
                sTabResult = null;
            }
            finally
            {
                m_oracleDataReader.Close();
                m_oracleCommande = null;
                m_oracleDataReader = null;
            }

            return sTabResult;
        }

        public String[,] GetResultatsRequete(string sRequete, params String[] listeParametres)
        {
            String[,] sTabResult = null;

            try
            {
                string sReq        = FormaterRequeteAvecParametres(sRequete, listeParametres);
                m_oracleCommande   = new OracleCommand(sReq, m_oracleConnection);
                m_oracleDataReader = m_oracleCommande.ExecuteReader();
                m_iNombreLignes    = 0;
                m_iNombreColonnes  = this.m_oracleDataReader.FieldCount;

                // Initialisation du tableau de retour
                while (m_oracleDataReader.Read())
                    m_iNombreLignes++;

                sTabResult = new String[m_iNombreLignes, m_iNombreColonnes];

                m_oracleDataReader.Close();
                m_oracleDataReader = m_oracleCommande.ExecuteReader();

                int i = 0;
                while (m_oracleDataReader.Read())
                {
                    for (int j = 0; j < m_iNombreColonnes; j++)
                        if (m_oracleDataReader.IsDBNull(j) == false)
                            sTabResult[i, j] = m_oracleDataReader.GetOracleValue(j).ToString();
                        else
                            sTabResult[i, j] = ""; // Met "" dans les champs null
                    i++;
                }
            }
            catch (OracleException e)
            {
                MessageBox.Show(e.Message);
                sTabResult = null;
            }
            finally
            {
                m_oracleDataReader.Close();
                m_oracleCommande = null;
                m_oracleDataReader = null;
            }

            return sTabResult;
        }

        public void Rollback()
        {
            m_oracleCommande.CommandType = CommandType.Text;
            m_oracleCommande.Transaction = m_oracleTransaction;
            m_oracleTransaction.Rollback();
        }
    }
}

vendredi 7 septembre 2007 à 10:12:40 | Re : Gestion des transaction sous Oracle

rodcobalt22

Tu veux dire quoi par il ne se passe rien.

Ta modification est appliqué ou elle ne l'est pas ?
Par contre, je te conseil de revoir la gestion de tes membres car ils sont réaffecté plusieur fois (et d'après moi pour rien).

Peut être qu'en faisant le ménage tu comprendrais pourquoi cela ne fonctionne pas.

RodCobalt22, vous salue bien ;-)

vendredi 7 septembre 2007 à 10:16:29 | Re : Gestion des transaction sous Oracle

come62

En fait, lorsque je fais l'ajout et que je regarde tout de suite en base (sans commit préalable), je vois la ligne que je viens d'ajouter.
Mais lorsque j'appuie alors sur le bouton annuler de la fenetre (à partir d'où est codé le rollback) et qu'il s'exécute, je regarde en base et la ligne est toujours présente (même lorsque j'actualise).

samedi 8 septembre 2007 à 23:38:57 | Re : Gestion des transaction sous Oracle

coq

Administrateur CodeS-SourceS
Salut,

De ce que je vois, tu ne lie pas de transaction à la commande, donc tu n'utilises pas de transaction. 


/*
coq
MVP Visual C#
CoqBlog
*/

lundi 10 septembre 2007 à 10:20:04 | Re : Gestion des transaction sous Oracle

come62

Comment faire ?

Pourrais-tu me guider ?

Merci d'avance.

mardi 11 septembre 2007 à 12:10:12 | Re : Gestion des transaction sous Oracle

rodcobalt22

C'est au niveau de ton objet Command. il y a une propriété Transaction qui ne doit pas être renseigné.
Un conseil, refait ce code pour y voir plus clair car tu as des affectations dan tout les coins

RodCobalt22, vous salue bien
Pensez au TAG résolu ! Ainsi les réponses seront plus facile à trouver et les serial Helper iront plus vite

mardi 15 avril 2008 à 08:57:41 | Re : Gestion des transaction sous Oracle

cedkat

Bonjour,

Quelqu'un a-t-il résolu le problème de la ransaction en lecture seul sur l'objet command ?

J'ai beau cherché mais je vois partout cmd.Transaction = transaction, or cela ne marche pas.

Merci 

Voici mon code :

publicint ExecuteNonQuery(string query, OracleTransaction transaction)
{
   
try
   
{
      
OracleCommand cmd = F_Connexion.CreateCommand(query, F_Connexion);
      
if (transaction != null)
         cmd.Transaction = transaction;
      
if (F_Connexion.State != ConnectionState.Open)
      {
         F_Connexion.Open();
      }
      
return cmd.ExecuteNonQuery();
}
Merci

Phoenix


mardi 15 avril 2008 à 09:22:54 | Re : Gestion des transaction sous Oracle

cedkat

Un petit element qui peut avoir son importance, je n'utilise pas une connexion oracle de microsoft mais celle d'ODP.

Phoenix


mardi 15 avril 2008 à 09:25:58 | Re : Gestion des transaction sous Oracle

rodcobalt22



RodCobalt22, vous salue bien
Pensez au TAG résolu ! Ainsi les réponses seront plus facile à trouver et les serial Helper iront plus vite
 PS : Pardonnez mes fautes d'orthographe (All



Cette discussion est classé dans : string, creq, oracledatareader, oraclecommande, srequete


Répondre à ce message

Sujets en rapport avec ce message

Pb avec mon programme - help... [ par adrien78 ] Voici les sources de mon programme il bug :// project created on 09/11/2002 at 10:51// By Adrien HADJ SALAH// http://www.informatick.com// Pour me rem Propriété Get et Let en C# ? [ par DrChal ] DrChalSalutJ'aimerai convertir en C#, le code vb suivant en C#:Dim sOpsArgsDataBase As String Public Property Let OpsArgsDataBase(sArgsDataBase As Str string to int [ par fredza ] Pouvez vous m'aider SVP*/Prendre les caractères d'une textbox et les concaténer puis les retransformer en string (pas obligatoire)(EX A=65, B=66 ... d Prise de tête avec ToString [ par Wolf ] COMMENT FAIRE POUR TRANSFORMER UN TABLEAU DE BYTE EN STRING????????????????Mes murs commence à s'écrouler à force de me tapper la tête dedans!Voilà 2 Majuscules - minuscules [ par gg00xiv ] comment fait-on pour mettre une chaine de caracteres (String ou string) toute en minuscule ou toute en majuscules.Genre un Upper() ou Lower()Merci String (tableau) [ par JCpp ] Comment on realise un tableau de string en C# ?exemple :string [] a; // a[0]="toto"; a[1]="titi";Mercihttp:// Help conversion string en double [ par JCpp ] comment on convertir une chaine "string" en "double" avec visual studio .net c# ?exemple :string toto = "123.45";double titi = toto.??????????http://p Prob avec Array [ par Morpheus51Neo ] Voilà, je reprend un prog de SmallTalk pour le remettre en C#.Voici le problème de programmation qui se pose :Je n'arrive pas à utiliser Contains pour pb avec outlook [ par Jula ] recoucou,voilà, j'ai un problème en essayant d'utiliser msoutl9:je fais au début:msoutl9.Application objOutlook = new msoutl9.ApplicationClass();et à string->double [ par Jula ] et ui c bidon comme question...mais je ne sais pas comment on fait pour convertir une string en double...quelqu'un peut m'aider?Dans la vie faites com


Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Téléchargements

Logiciels à télécharger sur le même thème :

Comparez les prix Nouvelle version

Photothèque Nouveau !



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,655 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.