SQL Server存储过程不会在我的程序中引发错误

时间:2015-11-13 15:06:52

标签: sql-server delphi stored-procedures

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;

此代码没有引发任何错误?有什么想法?

3 个答案:

答案 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文档。