CREATE PROCEDURE [dbo].[spTest]
@Pozitii varchar(max),
@NrZile int
AS
set @Pozitii = SUBSTRING(@Pozitii,0,LEn(@Pozitii))
CREATE TABLE #Pozitii (part varchar(20) null)
INSERT INTO #Pozitii(part)
SELECT part
FROM dbo.SDF_SplitString(@Pozitii,',')
if exists (SELECT * FROM #Pozitii)
RAISERROR('asdf',16,-1)
else RAISERROR('else',16,-1)
所以在SQL中运行这个SP就像这样
exec [spTest] '11,12,13,',1
返回:
(3 row(s) affected)
Msg 50000, Level 16, State 1, Procedure spTest, Line 27
asdf
现在如果我在delphi中运行我的程序(使用ADO对象)
procedure TframePlanificatorPozitieComanda.Button5Click(Sender: TObject);
begin
try
with dm.spTest do
begin
Close;
Parameters.ParambyName('@Pozitii').Value := '11,12,13,';
Parameters.ParambyName('@NrZile').Value := 1;
ExecProc;
end;
except
on E: Exception do
begin
ShowMessage(E.Message);
end;
end;
end;
此代码没有引发任何错误?有什么想法?
答案 0 :(得分:3)
您是否尝试过添加:
SET NOCOUNT ON;
到您的存储过程?我认为异常是在第二个结果集中,并且被第一个选择结果计数隐藏。
答案 1 :(得分:0)
错误在sql-server
中提升..但在delphi
中不是..因为已经执行了该过程..
但是在Delphi中,您可以检查过程是否成功运行或不考虑过程的结果(某些过程没有输出参数)。
在delphi
中,请检查adostoredprocedure.parameters[0]
之类的:
showmessage(vartostr(self.ADOStoredProc1.Parameters[0].Value))
if the result <> 0 that means error.
答案 2 :(得分:0)
使用Sql Server 2014,我没有得到您描述的行为。
我在服务器上有一个存储过程定义为
CREATE PROCEDURE spRaiseError(@AnError int)
AS
BEGIN
declare @Msg Char(20)
if @AnError > 0
begin
Select @Msg = 'MyError ' + convert(Char(8), @AnError)
RaisError(@Msg, 16, -1)
end
else
select 1
END
我有一个极简主义的D7 Ado项目,其中包含TAdoConnection,TAdoQuery,TDataSource和TDBGrid,如您所料,TEdit和TButton。
使用此代码
procedure TForm1.Button1Click(Sender: TObject);
var
S : String;
ErrorCount : Integer;
begin
S := 'exec spRaiseError ' + Edit1.Text;
AdoQuery1.SQL.Text := S;
try
AdoQuery1.Open;
except
end;
ErrorCount := AdoConnection1.Errors.Count;
Caption := IntToStr(ErrorCount);
end;
,如果Edit1中的数字是&gt; 0我只得到表单标题上的错误号,而如果它包含0,我在DBGrid中看到值1。
顺便说一句,在D7调试器设置中检查了“停止语言异常”,没有围绕AdoQuery1.Open的try / except,调试器会看到并从服务器捕获异常。
无论如何,这个答案的带回家消息是你可以使用TAdoConnection的Errors集合来检测是否有错误,如果有,你可以从中获取更多信息。有关TAdoConnection和其他基于Ado的Delphi类的Errors集合的更多信息,请参阅Delphi OLH amd MS Ado文档。