【发布时间】:2020-06-11 06:28:54
【问题描述】:
我的问题是:我有一个存储过程,它有时只能正确运行,有时根本不运行,有时甚至部分运行(某些行插入到 table bot 中不是全部)。我在 Win10 64 位上使用 lazarus 2.0.6 和 TODBCConnection 连接到 SQL Server 2012。
存储过程本身是正确的,在 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; 运行异步而不是应该是同步的。如何让这个调用同步运行?
提前致谢。
【问题讨论】:
-
我会去掉
@boxkapazitaet=16;中的分号,但我怀疑这是否与您的问题有关...... -
为什么要使用 TODBC?,请参阅 this 的第 4 点,您是否尝试使用
mssqlconn? -
@Luuk:对于 msssqlcon,我需要 lazuarus 未附带的特殊驱动程序。唯一的来源是 ond 网站“freetds”,您必须在该网站上将驱动程序自行编译为 dll。驱动源是基于 linux 的 quellcode,链接失效。
-
你能添加一个检查来捕捉这个存储过程的输出参数吗? (请参阅page 上的“存储过程的输出参数”。之后应该可以检查存储过程是否正确运行,或者事务是否因为某些原因而回滚......
-
请编辑您的 q 以在
sql :=右侧显示实际的、准确的代码。正如您所展示的那样,它显然 not ,因为单引号在语法上不正确。还请为您的 dm.createStorage2 添加 DDL Sql。
标签: sql stored-procedures sql-server-2012 lazarus