执行包含多个INSERT,UPDATE,...语句的SQL脚本时遇到Delphi/ADO错误处理困难。只有脚本的第一条SQL语句失败时,我才会在Delphi中遇到异常。如果第一条语句通过,那么Delphi中不会有例外,无论脚本中发生了什么。在Delphi中使用多个INSERT,UPDATE,...语句执行SQL脚本时的错误处理
这在Delphi代码使用:
var
DataSet: TADOQuery;
begin
...
try
DataSet.Close;
DataSet.ParamCheck := true;
DataSet.SQL.LoadFromFile(FileName);
DataSet.Prepared := true;
try
DataSet.ExecSQL;
finally
DataSet.Close;
end;
except
on E: Exception do
Logging.AddText(E.ClassName + ' error raised when executing ' + FileName + '. Message: ' + E.Message);
end;
...
end;
为了测试我用这个简单的脚本:
INSERT INTO TESTTABLE
VALUES ('John', 24);
INSERT INTO TESTTABLE
VALUES ('Ed', '32');
其中TestTable的仅仅是含有两列的简单表:名称NVARCHAR(50)和年龄INT。
当您在第一个INSERT语句中用'twentyfour'替换24,并用Delphi代码运行脚本时,Delphi/ADO将引发异常。但是,如果在第二个INSERT语句中将32替换为“thirtytwo”,则不会有例外。
我试图把脚本在存储过程中“dbo.ErrorHandling”和发送
EXEC dbo.ErrorHandling
到ADO解决这个问题,但它并没有帮助。
CREATE PROCEDURE dbo.ErrorHandling
AS
BEGIN
INSERT INTO TESTTABLE
VALUES ('John', 24);
INSERT INTO TESTTABLE
VALUES ('Ed', '32');
END
我可以解决通过使用脚本try和catch,并让它记录错误的记录表的问题。在每个脚本执行后,Delphi可以检查这个表是否有新的错误。
但是,是否有可能在Delphi中捕获所有SQL服务器错误,还是必须一个一个地执行INSERTS,UPDATES ......?
我用Delphi XE6和SQLServer 2008 R2
我在为新软件版本升级数据库时执行此操作。我总是把整个事情放在数据库事务中,所以它在失败时回滚。如果让SQL Server生成脚本,它会在每个命令之后放置GO。如果您逐行浏览代码中的文件,按照您的要求构建查询,请在清除查询并开始下一个查询之前查找这些查询并在“GO”之前执行查询。这有帮助吗? – 2014-11-03 15:22:36