IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

update dans une table: transaction cannot be assigned to?


Sujet :

C#

  1. #1
    Membre à l'essai
    Inscrit en
    Août 2008
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 14
    Points : 12
    Points
    12
    Par défaut update dans une table: transaction cannot be assigned to?
    Bonjour!

    quelqu'un peut-il m'orienter vers une reponse, ou du moins m'expliquer ce qui se passe?

    j'utilise c#, et je veux faire un update statement dans une table de la base de donnees oracle 10g.

    voici mon code, conforme au tutoriel:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
     
                string strParam = "***";
                OracleConnection conn = new OracleConnection("User Id=" + strParam +
                                ";Password=" + strParam +
                                ";Data Source=****" );
     
                conn.Open();
                OracleTransaction trans = conn.BeginTransaction();
     
                string query = "update GRID_TILES A set A.CHECKED = 3 WHERE A.TILE_NAME = 'NE20000080'";
                OracleCommand cmd = new OracleCommand(query, conn);
                cmd.CommandType = CommandType.Text;
                cmd.Transaction = trans;
     
                try { 
                    cmd.ExecuteNonQuery();
                    trans.Commit();
                }
                catch (Exception ex)
                {
                    trans.Rollback();
                }
                finally
                {
                    cmd.Dispose();
                }
    j'obtiens l'erreur:
    "property or indexer 'Oracle.DataAccess.Client.OracleCommand.Transaction' cannot be assigned to -- it is read only"

    pourquoi?
    ce tout petit bout de code m'empeche de rentrer chez moi: le code doit marcher pour demain (donc encore au boulot)

    siouplait, qu'est-ce qui cloche?

    merci d'avance

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 753
    Points
    39 753
    Par défaut
    Bon, vu l'heure j'espère que tu es finalement rentré chez toi...

    Je commencerai par un gros coup de gueule contre Oracle, qui ne se conforme jamais à l'architecture ADO.NET : OracleCommand hérite de DbConnection, donc la propriété Transaction devrait être en lecture/écriture. Mais voilà, comme Oracle se croit au dessus de tout le monde, ils ont fait leur petite bidouille : l'implémentation implicite de la propriété (celle que tu utilises en passant par une variable OracleCommand) est read-only, et l'implémentation explicite (IDbCommand.Transaction) est en read/write, mais l'accesseur set ne fait rien

    (oui, je suis un peu remonté contre Oracle ces temps-ci...)

    Enfin bref... tout ça pour dire qu'en fait, il est inutile d'affecter la transaction à la commande, car la transaction est associée à la connexion et non à la commande. Donc, le simple fait d'appeler conn.BeginTransaction() fait que ta commande sera exécutée dans cette transaction. Tu peux donc supprimer l'instruction qui pose problème, et ça devrait marcher.

    Quelques explications sur l'utilisation des transactions en .NET avec Oracle (en anglais) :
    http://www.oracle.com/technology/pub...ns_dotnet.html

  3. #3
    Membre à l'essai
    Inscrit en
    Août 2008
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 14
    Points : 12
    Points
    12
    Par défaut
    ok, ca explique

    merci pour l'nfo

    pour ceux qui cherchent comme moi comment faire, je mets un bout de code fonctionnel et rapide apparemment:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
     
     try
                {
                    // Hardcoded connection string
                    string strCon = "User Id=***;Password=***;Data Source=***";
     
                    // Oracle connection
                    OracleConnection orclCon = new OracleConnection(strCon);
                    orclCon.Open();
     
                    // Oracle command
                    OracleCommand orclCom;
     
                    // Oracle transaction
                    OracleTransaction orclTrans;
     
                    // Set up the command
                    orclCom = new OracleCommand();
                    orclCom.CommandType = CommandType.Text;
                    orclCom.Connection = orclCon;
                    orclCom.CommandText = SQL;
     
                    // Begin transaction
                    orclTrans = orclCon.BeginTransaction();
     
                    // Execute the transaction
                    orclCom.ExecuteReader();
     
                    // Commit the transaction
                    orclTrans.Commit();
     
                    // Close the connection
                    orclCon.Close();
                    orclCon.Dispose();
                    orclCom.Dispose();
                    orclTrans.Dispose();
                }
                catch (OracleException orclEx)
                {
                    System.Diagnostics.Debug.WriteLine("Oracle Exception: " + orclEx.ToString());
                }
                catch (Exception ex)
                {
                    System.Diagnostics.Debug.WriteLine("System Exception: " + ex.ToString());
                }
    merci pour l'info!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Update dans une table
    Par hoshizora dans le forum Développement de jobs
    Réponses: 7
    Dernier message: 12/06/2012, 13h07
  2. Stocker une requête update dans une table
    Par bigtruck2010 dans le forum PL/SQL
    Réponses: 4
    Dernier message: 07/07/2011, 12h57
  3. Update dans une table
    Par sherve dans le forum Langage SQL
    Réponses: 2
    Dernier message: 02/03/2009, 12h35
  4. Update dans une table innodb
    Par Mydriaze dans le forum Débuter
    Réponses: 1
    Dernier message: 28/04/2008, 14h07
  5. [Debutant]Insertion dans une table, Transaction et Procedure
    Par etiennegaloup dans le forum PostgreSQL
    Réponses: 2
    Dernier message: 01/11/2005, 16h47

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo