存储过程仅在某些情况下才能正确运行

时间:2020-02-27 09:22:29

标签: sql stored-procedures sql-server-2012 lazarus

我的问题是:我有一个存储过程,有时只能正确运行,有时根本不运行,有时不能部分运行(插入表bot的某些行并非全部)。我在Win10 64位上使用lazarus 2.0.6,并使用TODBCConnection连接到SQL Server2012。

存储过程本身是正确的,在SQL Server Management Studio中,它可以正常运行。存储过程将记录写入4个不同的表中。取决于参数,每个表大约有1-400条记录。

代码:

con:TODBCConnection;
tra:TSQLTransaction;
qry:TSQLQuery;

con:=TODBCConnection.Create(nil);
tra:=TSQLTransaction.Create(nil);
qry:=TSQLQuery.Create(nil);

tra.DataBase:=con;
qry.DataBase:=con;
qry.Transaction:=tra;

con.Params.Clear;
con.Params.Add('DRIVER=SQL Server');
con.Params.Add('SERVER=xxxxx');
con.Params.Add('DATABASE='+DATENBANK_NAME);
con.Params.Add('Trusted_Connection=Yes');
con.Params.Add('AUTOCOMMIT=1');
con.Open; 

// call the procedure
sql:='EXEC dm.createStorage2 @St_Geraet='Q', @St_Bezeichnung='Q-Freezer -80', @St_Temperatur=-80, @St_Raum='Keller', @St_Gebaeude='ABC', 
@St_AnzFaecher=2, @St_AnzTuermeProFach=5, @St_MoeglicheSchubladenkombinationenProTurm='4,3', @St_MoeglicheBoxenkombinationenProSchublade='3,4', 
@St_MoeglicheBoxKapazitaeten='16,25,100', @schubladenProTurm=4, @boxenProSchublade=3, @boxkapazitaet=16;';

qry.SQL.Text:=sql;
qry.ExecSQL;

// alternatively, this will also not work:
// con.ExecuteDirect(sql);

con.Close();
qry.Free;
tra.Free;
con.Free;

如果我在qry.ExecSQL;处设置一个断点并越过它-它可以工作吗?!

似乎不需要等待qry.ExecSQL;完成并随后直接释放资源。我该怎么做才能告诉代码等待qry.ExecSQL;完成?

编辑:问题似乎是qry.ExecSQL;运行异步而不是应有的同步。如何告诉此调用同步运行?

谢谢。

1 个答案:

答案 0 :(得分:0)

已经弄清楚了:这是sqldb.pas中的一个错误,与odbc结合使用时,他无法检测到存储过程何时完成。因此,程序立即转到下一个命令,在我的情况下,这是释放数据库实例的结果-导致sql命令被中止。 现在使用“ zeos”库(https://zeoslib.sourceforge.io),它就像一个魅力。

uses
Classes, SysUtils, ZConnection, ZDataset;

...

con:=TZConnection.Create(nil);
qry:=TZQuery.Create(nil);

qry.Connection:=con;

con.Protocol:='ado';
con.Database:='DRIVER=SQL Server;Trusted_Connection=Yes;SERVER=xxxx;DATABASE='+DATENBANK_NAME;
con.Connected:=true;

其余与旧代码相同,但有一个说明: con.close();成为con.connected:=false;