为什么我接收不到存储过程返回的错误提示啊!! 大家来看看 帮下忙吧 谢谢大家了(100)

  • 主题发起人 主题发起人 Yang.SZ
  • 开始时间 开始时间
Y

Yang.SZ

Unregistered / Unconfirmed
GUEST, unregistred user!
存储过程:CREATE PROCEDURE P_STORE_BACKDEALER@BILLNO CHAR(15),@REGISTRAR CHAR(4),@TABLENAME VARCHAR(50),@USINGSYS CHAR(6)ASDECLARE @ERRMSG VARCHAR(255)SELECT KIND FROM VIEW_TEMP_STORE WHERE BILLNO = @BILLNO AND TABLENAME = @TABLENAME GROUP BY KINDIF @@ROWCOUNT > 1 BEGIN SELECT @ERRMSG = '错误,返厂项目种类过多!' GOTO ERROR1 ENDSELECT DEALER FROM VIEW_TEMP_STORE WHERE BILLNO = @BILLNO AND TABLENAME = @TABLENAME GROUP BY DEALERIF @@ROWCOUNT > 1 BEGIN SELECT @ERRMSG = '错误,返厂药品公司过多!' GOTO ERROR1 ENDBEGIN TRANSACTION STORE_BACKDEALER INSERT INTO STORE_BACKDEALER( BILLNO,NUMBER,PRODUCETIMES,SCALAR,PRICE,SALES, PRODUCEDATE,VALIDDATE,DEALER,REGISTRAR ) SELECT BILLNO,NUMBER,PRODUCETIMES,SCALAR,PRICE,SALES,PRODUCEDATE,VALIDDATE, (SELECT NUMBER FROM INFO_PRODUCT_DEALER WHERE DEALER = TEMP_STORE.DEALER), @REGISTRAR FROM TEMP_STORE WHERE BILLNO = @BILLNO AND TABLENAME = @TABLENAMEIF @@ERROR != 0 BEGIN SELECT @ERRMSG = '错误,写入返厂表时出错!' GOTO ERROR2 END UPDATE WAREROOM_STORE_WESTERN SET WAREROOM_STORE_WESTERN.SCALAR = WAREROOM_STORE_WESTERN.SCALAR - TEMP_STORE.SCALAR FROM TEMP_STORE WHERE TEMP_STORE.BILLNO = @BILLNO AND TEMP_STORE.TABLENAME = @TABLENAME AND WAREROOM_STORE_WESTERN.NUMBER = TEMP_STORE.NUMBER AND WAREROOM_STORE_WESTERN.PRODUCETIMES = TEMP_STORE.PRODUCETIMES AND WAREROOM_STORE_WESTERN.SALES = TEMP_STORE.SALESIF @@ERROR != 0 BEGIN SELECT @ERRMSG = '错误,更新库存表时出错!' GOTO ERROR2 END ENDCOMMIT TRANSACTION STORE_BACKDEALERRETURN 0ERROR1: SELECT @ERRMSG = 'ERROR:' + @ERRMSG RAISERROR(@ERRMSG , 16 , 1) RETURN -1/*********************************************/ERROR2: ROLLBACK TRANSACTION STORE_BACKDEALER SELECT @ERRMSG = 'ERROR:' + @ERRMSG RAISERROR(@ERRMSG , 16 , 1) RETURN -1/*********************************************/GODELPHI: ADOQuery1.Close; ADOQuery1.SQL.Text:= 'EXECUTE P_STORE_BACKDEALER '; ADOQuery1.SQL.Text:= ADOQuery1.SQL.Text + '@BILLNO = ''XY0000201000002'', '; ADOQuery1.SQL.Text:= ADOQuery1.SQL.Text + '@REGISTRAR = ''0000'', '; ADOQuery1.SQL.Text:= ADOQuery1.SQL.Text + '@TABLENAME = ''Frm_BackDealer'', '; ADOQuery1.SQL.Text:= ADOQuery1.SQL.Text + '@USINGSYS = ''西药库'''; ADOQuery1.ExecSQL;*******************测试时发现 在SQL的查询分析器显示结果里 有报错提示 但是DELPHI里却没有显示出来 而测试另一个存储过程时 写法和这个完全一样 却有错误返回提示 大家谁能说说这是为什么啊??
 
好象delphi中存储过程有个返回值来表示错误的吧,好象不直接报错的。
 
建议存储过程带 out 参数,delphi程序,根据存储过程的out参数,判断是否执行成功。比如存储过程最开始赋 outParam='ok',如果有错误,则outParam='错误提示'。
 
用TADOStoredProc测试即可,注意返回参数: pdReturnValue
 
以前没用过带返回参数的过程 所以一直用的ADOQuery直连存储过程 现在才发现 问题超多的 哪位大侠有时间的话 能否给我发个实例看看怎么用啊
 
我在网上找了找 原因是因为存储过程里如果有SELECT的话RAISERROR 就不显示了 都有用ADOSTOREDPROC 我就也把代码和存储过程都改了一下 我也在存储过程里定义了一个OUTPUT型的参数做为返回值了 可是发现 如果表名或字段名不对的话 还是不显示错误提示啊 这又是为了什么啊??
 
以前公司一直都是把代码全部写在程序里的 我感觉这样修改的时候不方便 就把部分代码放在存储过程里 可是没想到存储过程用起来竟然这么费事 [:(]
 
我把这个存储过程重写了一下 改成:存储过程:CREATE PROCEDURE P_STORE_BACKDEALER@BILLNO CHAR(15),@REGISTRAR CHAR(4),@TABLENAME VARCHAR(50),@USINGSYS CHAR(6),@ERRMSG VARCHAR(255) OUTPUTASSELECT KIND FROM VIEW_TEMP_STORE WHERE BILLNO = @BILLNO AND TABLENAME = @TABLENAME GROUP BY KINDIF @@ROWCOUNT > 1 BEGIN SELECT @ERRMSG = '错误,返厂项目种类过多!' GOTO ERROR1 ENDSELECT DEALER FROM VIEW_TEMP_STORE WHERE BILLNO = @BILLNO AND TABLENAME = @TABLENAME GROUP BY DEALERIF @@ROWCOUNT > 1 BEGIN SELECT @ERRMSG = '错误,返厂药品公司过多!' GOTO ERROR1 ENDBEGIN TRANSACTION STORE_BACKDEALER INSERT INTO STORE_BACKDEALER( BILLNO,NUMBER,PRODUCETIMES,SCALAR,PRICE,SALES, PRODUCEDATE,VALIDDATE,DEALER,REGISTRAR ) SELECT BILLNO,NUMBER,PRODUCETIMES,SCALAR,PRICE,SALES,PRODUCEDATE,VALIDDATE, (SELECT NUMBER FROM INFO_PRODUCT_DEALER WHERE DEALER = TEMP_STORE.DEALER), @REGISTRAR FROM TEMP_STORE WHERE BILLNO = @BILLNO AND TABLENAME = @TABLENAMEIF @@ERROR != 0 BEGIN SELECT @ERRMSG = '错误,写入返厂表时出错!' GOTO ERROR2 ENDCOMMIT TRANSACTION STORE_BACKDEALERRETURN 0ERROR1: SELECT @ERRMSG = 'ERROR:' + @ERRMSG RETURN -1/*********************************************/ERROR2: ROLLBACK TRANSACTION STORE_BACKDEALER SELECT @ERRMSG = 'ERROR:' + @ERRMSG RETURN -1/*********************************************/GO即: 没有了RAISERROR 把@ERRMSG改成返回参数 可是INSERT命令时因为不小心把表名写错了 可运行的时候还是没有错误提示返回啊 大家能说说这是怎么回事吗?? 是不是我存储过程写的有什么问题啊?? 还是整个存储过程里就是不能有SELECT命令存在。 只要有SELECT存在就没有RAISERROR和返回值??
 
呃 没有人能说点什么吗??
 
接受答案了.
 
后退
顶部