Delphi , transaction , SQL server
Bonjour Messieurs ,Dames :D
J'ai un gros problème et je commence a nager dans mes recherches.
Coté delphi j'ai :
Code:
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
|
function GetSQLGenerator(aTableName: string): LongInt;
var Q : TSQLQuery;
var td :TTransactionDesc;
function GetUniqueId : integer;
begin
result := Random(10)+DateTimeToFileDate(Now);
end;
begin
Q := nil;
with Q do
try
try
td.TransactionID := GetUniqueId;
td.IsolationLevel := xilREPEATABLEREAD; //afin que la transaction attendent la fin des autres transaction
Q := CreateQueryFmt('',[] );
SQLConnection.StartTransaction(td);
//Q.SQLConnection.InTransaction
SQL.Clear;
SQL.Add('declare @NB D_NUMID ;');
SQL.Add(Format('execute SP_GENERATOR %s, @NB OUTPUT ; ', [QuotedSQL(aTableName)] ));
SQL.Add('select @NB ');
Open;
result := Q.Fields[0].AsInteger;
SQLConnection.Commit(td);
except
on e:EDatabaseError do begin
Q.SQLConnection.Rollback(td);
result := -1;
end;
end;
finally
FReeAndNil(Q);
end;
end; |
Ma procedure stcokée SQL serveur 2000 :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
|
CREATE PROCEDURE "SP_GENERATOR"
(
@TABLENOM D_NOM,
@AVALUE D_NUMID OUTPUT
)
as
begin
SET NOCOUNT ON;
select @AVALUE = (SELECT COUNT(*) from TABLE_CPT where NOM = @TABLENOM);
IF @AVALUE = 0 BEGIN
INSERT INTO TABLE_CPT(NOM, CPT) VALUES(@TABLENOM, 0);
END;
UPDATE TABLE_CPT SET CPT = CPT + 1 WHERE NOM= @TABLENOM;
select @AVALUE = (SELECT CPT from TABLE_CPT where NOM =@TABLENOM);
end;
GO |
Ces deux fonctions me servent pour avoir un identifiant unique par compteur dans une table Compteur (sans collision de données biensur) :
Code:
1 2 3 4 5 6
|
CREATE TABLE "TABLE_CPT" (
NOM D_NOM,
CPT D_INTEGER,
CONSTRAINT PKTABLE_CPT PRIMARY KEY (NOM)
); |
Mais voila après quelques testes, ma procédure GetSQLGenerator marche pas totalement.
Je fais plusieurs appel sur ma fonction GEtSQLGenerator('BLTAXE'), tout se passe bien.
Puis dans une autre procédure je lance la facturation ,
qui utilise aussi cette fonction mais en utilisant un autre paramètre 'FACTB' .
Mais à ce moment la delphi subit une erreur lors du StartTransaction => 'Dépassement de capacité'.
Je ne vois pas d'ou peut venir l'erreur !
Quelqu'un aurait il une idéee ????
Help me please....