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 :
Ce que j'observe ???
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);
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 :
J'ai essayé diverses Options FbTransactionOptions, sans trop de succès.
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(); }
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 ?
Partager