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

Windows Forms Discussion :

2.0 transaction FirebirdSQL par une procedure


Sujet :

Windows Forms

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    120
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 120
    Points : 48
    Points
    48
    Par défaut 2.0 transaction FirebirdSQL par une procedure
    Je lance un SOS.

    Je suis planté depuis hier à essayer de trouver une solution pour faire réaliser un traitement dans ma base de données FireBirdSQL 2.1 par le biais d'une procédure stockée.

    Ma procédure stockée fait :
    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
    46
    47
    48
    49
    50
    51
    52
    53
     
    CREATE OR ALTER PROCEDURE RECORD_INSERT(
        IDINDIVIDU INTEGER,
        DATEC TIMESTAMP,
        XX NUMERIC(5,2),
        FS NUMERIC(5,2),
        NUMECH INTEGER,
        MODE INTEGER,
        PER_ECH INTEGER)
    RETURNS (
        ERROR CHAR(1))
    AS
    declare variable ID_CARD INTEGER;
     
    BEGIN
     
        /* on vérifie si l'enregistrement existe déjà */
        FOR
        SELECT ID_CARD
        FROM CARD
        WHERE (ID_INDIVIDUS=:IDIndividu AND DATE_C=:DateC)
        INTO :ID_CARD
        DO SUSPEND;
     
        /* si l'enregistrement n'existe pas déjà */
        IF (:id_card IS NULL) THEN
            BEGIN
     
            /* on le crée */
            INSERT INTO CARD (ID_INDIVIDUS, DATE_C)
            VALUES (:IDIndividu, :DateC);
     
            /* on prend en compte l'ID de cet enregistrement */
            FOR
            SELECT ID_CARD
            FROM CARD
            WHERE (ID_INDIVIDUS=:IDIndividu AND DATE_C=:DateC)
            INTO :ID_CARD
            DO SUSPEND;
     
            END
        ELSE
            BEGIN
     
            UPDATE CARDIAQUE_COURBES_MODE
            SET MODE=:MODE, PER_ECH=:PER_ECH
            WHERE ID_CARDIAQUE=:ID_CARD;
     
            END
     
        /* dans tous les cas : on insère l'échantillon */
        INSERT INTO CARD_SAMPL (ID_CARD, NUM_ECH, TEMPS_RR, FC)
        VALUES (:ID_CARD, :NumEch, :XX, :FS);
    Ce que j'observe ???
    l'insertion dans la table CARD se fait bien,
    la clé primaire ID_CARD est bien lu (j'ai modifié la procédure pour retourner cet ID_CARD et j'ai pu observer que c'est ok).
    Mais la seconde insertion ne se fait pas.

    JE PRECISE QUE DANS MON CONTEXTE LES TABLES SONT VIDES AU MOMENT DU TEST.
    LE PROBLEME NE PROVIENT ABSOLUEMENT PAS DE LA PROCEDURE EN ELLE MEME, PUISQUE DANS IBEXPERT LA PROCEDURE FONCTIONNE BIEN.

    Mon problème est lié à l'interfacage sur mon application C#.

    voir ci-dessous :
    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
     
            public void InsertRecord(FbConnection cnx, int id, DateTime d, Decimal xx, Decimal fs, int e, int m, int p)
            {
                FbCommand cde = cnx.CreateCommand();
                cde.CommandType = CommandType.StoredProcedure;
                cde.CommandText = "RECORD_INSERT";
                try
                {
                    cde.Parameters.Add("IDINDIVIDU ", FbDbType.Integer, id);
                    cde.Parameters.Add("DATEC", FbDbType.TimeStamp, d);
                    cde.Parameters.Add("XX", FbDbType.Numeric, xx);
                    cde.Parameters.Add("FS", FbDbType.Numeric, fs);
                    cde.Parameters.Add("NUMECH", FbDbType.Integer, e);
                    cde.Parameters.Add("MODE", FbDbType.Integer, m);
                    cde.Parameters.Add("PER_ECH", FbDbType.Integer, p);
                    // ouverture de la connexion
                    if (cnx.State != ConnectionState.Open)
                        cnx.Open();
                    {
                        // execution
                        FbTransaction trx = cnx.BeginTransaction(FbTransactionOptions.Protected |
                                                                            FbTransactionOptions.Write |
                                                                            FbTransactionOptions.ReadCommitted |
                                                                            FbTransactionOptions.Wait |
                                                                            FbTransactionOptions.RecVersion |
                                                                            FbTransactionOptions.Autocommit);
                        cde.Transaction = trx;
                        object oCodeErr = cde.ExecuteScalar();
                        trx.Commit();
                    }
                }
                catch { ;}
                if (cnx.State == ConnectionState.Open)
                    cnx.Close();
            }
    J'ai essayé diverses Options FbTransactionOptions, sans trop de succès.
    Mon accès est des plus simple : Seule mon application accède à cette base de données. Certes dans 2 TABLES, mais c'est tout de même pas bien compliqué.

    Est-ce que quelqu'un peut m'expliquer où je me trompe ?
    Me préciser si j'ai obligation d'inclure l'appel de ma PROCEDURE dans une Transaction que je Commit en fin ? (Je précise qu'initialement je ne le faisait pas, mais c'était pareil au niveau du résultat)...
    Quel paramétrage donner à ces options dans mon cas simple ?

  2. #2
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    120
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 120
    Points : 48
    Points
    48
    Par défaut
    A tout hasard, je viens d'essayer en remplacant le
    par un Résultat : Même punition !

    Ca au moins c'est rassurant ! mais ça ne me donne pas la solution...

  3. #3
    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 : 42
    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 749
    Points
    39 749
    Par défaut
    Tu es sûr que tu n'as pas une exception qui est levée ? A cause de ton bloc catch vide (pratique à bannir absolument), tu ne t'en rendrais pas compte...

    Et bien que je ne connaisse pas FireBird, ça me parait un peu bizarre de faire une transaction avec une option "autocommit"... ça enlève tout l'intérêt d'utiliser une transaction
    Une conséquence possible serait que le premier INSERT se fasse et soit immédiatement commité (à cause du autocommit), et que le 2e plante.

Discussions similaires

  1. Réponses: 3
    Dernier message: 05/03/2010, 13h31
  2. [SQL]Envoie de mail par une procedure
    Par yoyopi dans le forum DB2
    Réponses: 19
    Dernier message: 22/02/2008, 16h30
  3. VB6_afficher un tableau par une procedure
    Par PROGDEV2paris dans le forum VB 6 et antérieur
    Réponses: 6
    Dernier message: 24/07/2007, 04h18
  4. [VB6] bouton desactiver par une procedure
    Par Spiritkiller dans le forum VB 6 et antérieur
    Réponses: 30
    Dernier message: 05/05/2006, 20h51
  5. modifier planification d'une tache par une procedure stockée
    Par MoTUmBo dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 24/08/2005, 15h14

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