小妹我快急疯了,求求各位高手哥哥姐姐帮忙,帮帮小妹吧,快崩溃了
小妹我刚学习VC,在VC6.0中调用带有存储过程的返回值时遇到了问题,希望各位哥哥姐姐们帮帮小妹,我的存储过程是:
CREATE PROCEDURE Book_Borrow @in_ReaderID char(8), @in_ISBN char(18), @in_BookID char(10), @out_str char(30) OUTPUT
AS
BEGIN
IF NOT EXISTS(SELECT * FROM TReader WHERE ReaderID=@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
IF (SELECT Num FROM TReader WHERE ReaderID=@in_ReaderID)=5
BEGIN
SET @out_str= '读者借书量不能大于5'
RETURN 0
END
IF (SELECT SNum FROM TBook WHERE ISBN=@in_ISBN)=0
BEGIN
SET @out_str= '图书库存量为0'
RETURN 0
END
IF @in_ISBN IN (SELECT ISBN FROM TLend WHERE ReaderID=@in_ReaderID)
BEGIN
SET @out_str= '读者已经借过该书'
RETURN 0
END
IF EXISTS(SELECT * FROM TLend WHERE BookID=@in_BookID)
BEGIN
SET @out_str= '该图书ID已存在'
RETURN 0
END
BEGIN TRAN /*开始一个事务*/
INSERT INTO TLend VALUES(@in_BookID, @in_ReaderID, @in_ISBN, GETDATE())
IF @@ERROR>0 /*如果前面一条SQL语句出错则回滚事务并返回*/
BEGIN
ROLLBACK TRAN
SET @out_str= '执行过程中遇到错误'
RETURN 0
END
UPDATE TReader SET Num=Num+1 WHERE ReaderID=@in_ReaderID
IF @@ERROR>0 /*如果前面一条SQL语句出错则回滚事务并返回*/
BEGIN
ROLLBACK TRAN
SET @out_str= '执行过程中遇到错误'
RETURN 0
END
UPDATE TBook SET SNum=SNum-1 WHERE ISBN=@in_ISBN
IF @@ERROR=0 /*如果所有语句都不出错则结束事务并返回*/
BEGIN
COMMIT TRAN
SET @out_str= '借书成功'
RETURN 1
END
ELSE /*如果执行出错则回滚所有操作并返回*/
BEGIN
ROLLBACK TRAN
SET @out_str= '执行过程中遇到错误'
RETURN 0
END
END
在VC中调用函数为:
UpdateData();
_ConnectionPtr pConnection = NULL;
_CommandPtr pCmd = NULL;
_RecordsetPtr pRs = NULL;
_ParameterPtr pParam = NULL;
_ParameterPtr retParam = NULL;
_ParameterPtr outParam1 = NULL;
HRESULT hr;
_variant_t varFld;
// Execute函数的参数
_variant_t vNULL;
vNULL.vt = VT_ERROR;
vNULL.scode = DISP_E_PARAMNOTFOUND;
_bstr_t strCnn(SQLCONSTR);
try
{
UpdateData(TRUE);
// 定义ADO变量
pConnection.CreateInstance(__uuidof(Connection));
hr = pConnection->Open(strCnn,"","",NULL);
pCmd.CreateInstance(__uuidof(Command));
pCmd->ActiveConnection = pConnection;
//
retParam.CreateInstance(__uuidof(Parameter));
retParam=pCmd->CreateParameter(_bstr_t("Return"),adInteger,adParamReturnValue,(0));
pCmd->Parameters->Append(retParam);
// 指定存储过程Book_Borrow
CString SqlStr;
SqlStr.Format("Book_Borrow");
pCmd->CommandText = (_bstr_t)SqlStr;
pCmd->CommandType = adCmdStoredProc;
pParam = pCmd->CreateParameter("@in_ReaderID",adVarChar,adParamInput,8);
pParam->Value = _variant_t(m_ReaJSZH); //借书证号参数值
pCmd->Parameters->Append(pParam);
pParam = pCmd->CreateParameter("@in_ISBN",adVarChar,adParamInput,18);
pParam->Value = _variant_t(m_TsISBN); //ISBN参数值
pCmd->Parameters->Append(pParam);
pParam = pCmd->CreateParameter("@in_BookID",adVarChar,adParamInput,10);
pParam->Value = _variant_t(m_TsID);
pCmd->Parameters->Append(pParam);
outParam1=pCmd->CreateParameter(_bstr_t("Out_str"),adVarChar,adParamOutput, (20));
pCmd->Parameters->Append(outParam1);
// 执行存储过程,结果记录集保存到pRs中
pRs = pCmd->Execute(&vNULL,&vNULL,adCmdStoredProc);
_variant_t VretVal ;
VretVal = retParam->Value;
AfxMessageBox(VretVal);
我想输出存储过程输出参数的值,但是最后几行代码出错,不知道怎么回事,希望各位哥哥姐姐帮帮忙,小妹在这谢谢大家了