sql2000存储过程事务如何捕获返回错误代码

lzp4881 2009-02-27 08:03:42
CREATE PROCEDURE zd_kjjLogin

@Id Int output,
@userClass nvarchar(20) output,
@department nvarchar(20) output,
@purview nvarchar(20) output,
@userName nvarchar(20),
@passWord nvarchar(20),
@IP nvarchar(20)

AS

if exists(select id from [zd_user_admin] where UserName = @userName and [Password] = @passWord) begin
begin transaction
update [zd_user_admin] set LastLoginTime = getdate(), LastLoginIP = @IP,logins = logins+'a' where UserName = @Username
if @@error<>0 begin
rollback transaction
return -1
end
commit transaction
select @Id=Id,@userClass=userClass,@department=department,@purview=purview from [zd_user_admin] where UserName = @userName
return 0
end

return 1
GO
为什么程序中捕获不到return -1这个值呢?
logins是int型,我有意让它+a,也就是想让它报错,返回-1,但是程序中捕获的却是空值
如果改成+1可以正常返回0或者1

DIM MyComm : Set MyComm = Server.CreateObject("ADODB.Command")
with MyComm
.ActiveConnection = Conn
.CommandText = "zd_kjjLogin"
.CommandType = 4
.Prepared = true
.Parameters.append .CreateParameter("RETURN",2,4)
.Parameters.append .CreateParameter("@ID",3,2,4)
.Parameters.append .CreateParameter("@userClass",200,2,20)
.Parameters.append .CreateParameter("@department",200,2,20)
.Parameters.append .CreateParameter("@purview",200,2,20)
.Parameters.append .CreateParameter("@UserName",200,1,20,userName)
.Parameters.append .CreateParameter("@Password",200,1,20,passWord)
.Parameters.append .CreateParameter("@ip",200,1,20,ip)
.Execute
end with

response.write MyComm(0)
这是调用程序
...全文
358 13 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
wanshichen 2009-05-15
  • 打赏
  • 举报
回复
学习,关注一下~
sdhdy 2009-05-15
  • 打赏
  • 举报
回复
4楼那样也可以,不过返回不同的值应该代表不同的错误提示。
sdhdy 2009-05-15
  • 打赏
  • 举报
回复
楼主可以看一下,有关帮助。
使用 RAISERROR与 PRINT 相比,RAISERROR 在把消息返回给应用程序方面的功能更强大。RAISERROR 能以下列方式中的任意一种返回消息:

已通过 sp_addmessage 系统存储过程添加到 master.dbo.sysmessages 上的由用户定义的错误信息。


在 RAISERROR 语句中指定的消息字符串。
RAISERROR 也有 PRINT 功能的一些扩展:

RAISERROR 能够指派一个特定的错误号、严重度和状态。


RAISERROR 能够请求将错误记入 Microsoft® SQL Server™ 2000 错误日志和 Microsoft Windows NT® 应用程序日志中。


消息字符串可以包含替代变量和参量,这与 C 语言中的 printf 功能相似。
当 RAISERROR 在sysmessages 中与用户定义消息的 msg_id 一同使用时,msg_id 被作为 SQL Server 的错误号码或本机错误代码返回。而当 RAISERROR 与 msg_str 而不是 msg_id 一同使用时,返回的 SQL Server 的错误号和本机错误号为 50000。

当使用 RAISERROR 返回一个用户定义的错误信息时,在每个引用该错误的 RAISERROR 中使用不同的状态号码。这可以在发生错误时帮助进行错误诊断。

RAISERROR 可以帮助我们发现并解决 Transact-SQL 代码中的问题、检查数据值或返回包含变量文本的消息。

下面的示例在返回给应用程序的消息中替换了 DB_ID 和 DB_NAME 函数的值:

DECLARE @DBID INT
SET @DBID = DB_ID()

DECLARE @DBNAME NVARCHAR(128)
SET @DBNAME = DB_NAME()

RAISERROR
('The current database ID is:%d, the database name is: %s.',
16, 1, @DBID, @DBNAME)

而以下示例使用由用户定义的消息完成了同样的处理:

sp_addmessage 50005, 16,
'The current database ID is:%d, the database name is: %s.'
GO
DECLARE @DBID INT
SET @DBID = DB_ID()

DECLARE @DBNAME NVARCHAR(128)
SET @DBNAME = DB_NAME()

RAISERROR (50005, 16, 1, @DBID, @DBNAME)
GO

第二个 RAISERROR 示例显示,替换参数可以在由用户定义的错误中指定,并且当 RAISERROR 语句执行时由替换参变量填充。

sdhdy 2009-05-15
  • 打赏
  • 举报
回复
CREATE PROCEDURE zd_kjjLogin 

@Id Int output,
@userClass nvarchar(20) output,
@department nvarchar(20) output,
@purview nvarchar(20) output,
@userName nvarchar(20),
@passWord nvarchar(20),
@IP nvarchar(20)

AS

if exists(select id from [zd_user_admin] where UserName = @userName and [Password] = @passWord) begin
begin transaction
update [zd_user_admin] set LastLoginTime = getdate(), LastLoginIP = @IP,logins = logins+'a' where UserName = @Username
if @@error <>0 begin
--捕获错误一般是这样的。
--加这一句,在前台程序可以捕捉到。
raiserror('这里写上你的错误提示',16,1)
--******************************************
rollback transaction
return -1
end
commit transaction
select @Id=Id,@userClass=userClass,@department=department,@purview=purview from [zd_user_admin] where UserName = @userName
return 0
end

return 1
Zoezs 2009-05-15
  • 打赏
  • 举报
回复

@Username
if @@error <>0 begin
rollback transaction
return -1

你都回滚了这么能执行到下一句啊?
lzp4881 2009-05-15
  • 打赏
  • 举报
回复
没有人会吗?
ChinaJiaBing 2009-02-28
  • 打赏
  • 举报
回复

看看日志,没捕过!
no_mIss 2009-02-27
  • 打赏
  • 举报
回复
这个错误,还真是捕获不了,呵呵,2005能捕获。
no_mIss 2009-02-27
  • 打赏
  • 举报
回复
我怎么觉得你的存储过程写的这么别扭呢
Andy__Huang 2009-02-27
  • 打赏
  • 举报
回复
说错了,不好意思;
因为我从来没有那么用过;
如果存储过程有返回参数值,那么在传入参数时加out 参数,而没有象你那样用


刚查到一个例子
下例检查指定作者所在州的 ID。如果所在的州是加利福尼亚州 (CA),将返回状态代码 1。否则,对于任何其它情况(state 的值是 CA 以外的值或者 au_id 没有匹配的行),将返回状态代码 2。

CREATE PROCEDURE checkstate @param varchar(11)
AS
IF (SELECT state FROM authors WHERE au_id = @param) = 'CA'
RETURN 1
ELSE
RETURN 2

下例显示从 checkstate 执行中返回的状态。第一个显示的是在加利福尼亚州的作者;第二个显示的是不在加利福尼亚州的作者,第三个显示的是无效的作者。必须先声明 @return_status 局部变量后才能使用它。

DECLARE @return_status int
EXEC @return_status = checkstate '172-32-1176'
SELECT 'Return Status' = @return_status
GO

lzp4881 2009-02-27
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 hdhai9451 的回复:]
sql server中return后面不能有值,可以用select语句给它返回值

[/Quote]
谁说的?
htl258_Tony 2009-02-27
  • 打赏
  • 举报
回复
学习
Andy__Huang 2009-02-27
  • 打赏
  • 举报
回复
sql server中return后面不能有值,可以用select语句给它返回值

CREATE PROCEDURE zd_kjjLogin
@Id Int output,
@userClass nvarchar(20) output,
@department nvarchar(20) output,
@purview nvarchar(20) output,
@userName nvarchar(20),
@passWord nvarchar(20),
@IP nvarchar(20)

AS
set nocount on --加这一句
if exists(select id from [zd_user_admin] where UserName = @userName and [Password] = @passWord) begin
begin transaction
update [zd_user_admin] set LastLoginTime = getdate(), LastLoginIP = @IP,logins = logins+'a' where UserName = @Username
if @@error <>0 begin
rollback transaction
select -1
return
end
commit transaction
select @Id=Id,@userClass=userClass,@department=department,@purview=purview from [zd_user_admin] where UserName = @userName
select 0
return
end

select 1

GO

34,838

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧