![]() |
#2
zhaochang5262015-04-07 11:01
![]() USE MBOOK 这是在SQL 2008中执行的Borrow_Book过程GO CREATE PROCEDURE Book_Borrow @in_ReaderID char(6),@in_ISBN char(18), @in_BookID char(10),@out_str char(30) OUTPUT AS BEGIN /*判断是否存在该读者*/ IF NOT EXISTS(SELECT * FROM TReader WHERE 借书证号=@in_ReaderID) BEGIN SET @out_str='该读者不存在' RETURN 0 END /*判断是否存在该图书*/ IF NOT EXISTS(SELECT * FROM TBook WHERE ISBN=@in_ISBN) BEGIN SET @out_str='该图书不存在' RETURN 0 END /*判断借书量是否已经到了借书上限数5*/ IF(SELECT 借书量 FROM TReader WHERE 借书证号=@in_ReaderID)=5 BEGIN SET @out_str='读者借书量不能大于5' RETURN 0 END /*判断库存量是否为0*/ IF (SELECT 库存量 FROM TBook WHERE ISBN=@in_ISBN)=0 BEGIN SET @out_str='图书库存量为0' RETURN 0 END /*判断读者是否已经借过该书*/ IF @in_ISBN IN (SELECT ISBN FROM TLend WHERE 借书证号=@in_BookID) BEGIN SET @out_str='读者已经借过该书' RETURN 0 END /*判断该书是否已经被借*/ IF EXISTS(SELECT * FROM TLend WHERE 图书ID=@in_BookID) BEGIN SET @out_str='该图书ID已存在' RETURN 0 END BEGIN TRAN /*开始一个事务*/ /*插入借书记录*/ INSERT INTO TLend(借书证号,ISBN,图书ID,借书时间) VALUES(@in_ReaderID,@in_ISBN,@in_BookID,GETDATE()) IF @@ERROR>0 /*如果前面一条SQL语句出错则回滚事务并返回*/ BEGIN ROLLBACK TRAN SET @out_str='执行过程中遇到错误' RETURN 0 END UPDATE TReader SET 借书量=借书量+1 WHERE 借书证号=@in_ReaderID IF @@ERROR>0 /*如果前面一条SQL语句出错则回滚事务并返回*/ BEGIN ROLLBACK TRAN SET @out_str='执行过程中遇到错误' RETURN 0 END UPDATE TBook SET 库存量=库存量-1 WHERE ISBN=@in_ISBN IF @@ERROR>0 /*如果前面一条SQL语句出错则回滚事务并返回*/ BEGIN ROLLBACK TRAN SET @out_str='执行过程中遇到错误' RETURN 0 END UPDATE TBLend SET 是否借出=1 WHERE 图书ID=@in_BookID IF @@ERROR=0 /*如果所有语句都不出错则结束事务并返回*/ BEGIN COMMIT TRAN SET @out_str='借书成功' RETURN 1 END ELSE /*如果执行出错则回滚所有操作并返回*/ BEGIN ROLLBACK TRAN SET @out_str='执行过程中遇到错误' RETURN 0 END END |

Private Sub Borrow_Click() '单击“借书”按钮
Dim Readernumber, ISBN, BookID As String
Dim in_ReaderID, in_ISBN, in_BookID, out_str '储存过程执行的参数
Dim ReturnValue As Integer '定义返回值变量
Dim Strs As String
Readernumber = ReaderID.Text
ISBN = T_ISBN.Text
BookID = T_BookID.Text
'如果借书证号、ISBN、图书ID均不为空
If Readernumber <> "" And ISBN <> "" And BookID <> "" Then
= "Book_Borrow"
= adCmdStoredProc
'追加参数法调用存储过程
Set in_ReaderID = SqlCmd.CreateParameter("@in_ReaderID", adChar, adParamInput, 8)
SqlCmd.Parameters.Append (in_ReaderID)
Set in_ISBN = SqlCmd.CreateParameter("@in_ISBN", adChar, adParamInput, 18)
SqlCmd.Parameters.Append (in_ISBN)
Set in_BookID = SqlCmd.CreateParameter("@in_BookID", adChar, adParamInput, 10)
SqlCmd.Parameters.Append (in_BookID)
Set out_str = SqlCmd.CreateParameter("@out_str", adChar, adParamInput, 30)
SqlCmd.Parameters.Append (out_str)
'参数赋值
SqlCmd("@in_ReaderID") = ReaderID.Text
SqlCmd("@in_ISBN") = T_ISBN.Text
SqlCmd("@in_BookID") = T_BookID.Text
SqlCmd.Execute (ReturnValue) '执行存储过程,并将返回值赋给ReturnValue
Strs = SqlCmd.Parameters("@out_str") '将存储过程输出参数的值赋给变量Strs
MsgBox (Strs) '给出提示信息
'删除参数
SqlCmd.Parameters.delete ("@in_ReaderID")
SqlCmd.Parameters.delete ("@in_ISBN")
SqlCmd.Parameters.delete ("@in_BookID")
SqlCmd.Parameters.delete ("@out_str")
'刷新BorrowADO控件
BorrowADO.RecordSource = "SELECT * FROM RBL WHERE 借书证号='" + Trim(Readernumber) + "'"
BorrowADO.Refresh
Else
MsgBox ("请输入正确的借书信息!")
End If
End Sub
数据库已经设置好,Book_Borrow存储过程也设置好了,在SQL中执行未出错Dim Readernumber, ISBN, BookID As String
Dim in_ReaderID, in_ISBN, in_BookID, out_str '储存过程执行的参数
Dim ReturnValue As Integer '定义返回值变量
Dim Strs As String
Readernumber = ReaderID.Text
ISBN = T_ISBN.Text
BookID = T_BookID.Text
'如果借书证号、ISBN、图书ID均不为空
If Readernumber <> "" And ISBN <> "" And BookID <> "" Then
= "Book_Borrow"
= adCmdStoredProc
'追加参数法调用存储过程
Set in_ReaderID = SqlCmd.CreateParameter("@in_ReaderID", adChar, adParamInput, 8)
SqlCmd.Parameters.Append (in_ReaderID)
Set in_ISBN = SqlCmd.CreateParameter("@in_ISBN", adChar, adParamInput, 18)
SqlCmd.Parameters.Append (in_ISBN)
Set in_BookID = SqlCmd.CreateParameter("@in_BookID", adChar, adParamInput, 10)
SqlCmd.Parameters.Append (in_BookID)
Set out_str = SqlCmd.CreateParameter("@out_str", adChar, adParamInput, 30)
SqlCmd.Parameters.Append (out_str)
'参数赋值
SqlCmd("@in_ReaderID") = ReaderID.Text
SqlCmd("@in_ISBN") = T_ISBN.Text
SqlCmd("@in_BookID") = T_BookID.Text
SqlCmd.Execute (ReturnValue) '执行存储过程,并将返回值赋给ReturnValue
Strs = SqlCmd.Parameters("@out_str") '将存储过程输出参数的值赋给变量Strs
MsgBox (Strs) '给出提示信息
'删除参数
SqlCmd.Parameters.delete ("@in_ReaderID")
SqlCmd.Parameters.delete ("@in_ISBN")
SqlCmd.Parameters.delete ("@in_BookID")
SqlCmd.Parameters.delete ("@out_str")
'刷新BorrowADO控件
BorrowADO.RecordSource = "SELECT * FROM RBL WHERE 借书证号='" + Trim(Readernumber) + "'"
BorrowADO.Refresh
Else
MsgBox ("请输入正确的借书信息!")
End If
End Sub
代码中 SqlCmd.Execute (ReturnValue) '执行存储过程,并将返回值赋给ReturnValue 这一行出错
实时错误'-2147217904 (80040e10)'
过程或函数'Book_Borrow'需要参数'@out_str',但未提供该参数
希望有高手可以帮我查查错,感谢