How to call an Oracle Stored Procedure that returns one or more REF CURSORS, using ADO from C++ http://www.codeproject.com/database/Oracle_RefCursor_ADO_C__.asp
你的存储过程没有执行成功,有错误SELECT PassWord INTO v_Pwd FROM charge_Admin_Info WHERE UserName = p_UserName; 如果表里没有查到你所需的纪录,你要有判断v_Pwd 是否确定被赋值了
SELECT PassWord INTO v_Pwd FROM charge_Admin_Info WHERE UserName = p_UserName; EXCEPTION WHEN NO_DATA_FOUND THEN p_Result := 6; RETURN; END; IF v_Pwd != p_OldPwd THEN p_Result := 6; RETURN; END IF;
http://support.microsoft.com/kb/176086
http://www.codeproject.com/database/Oracle_RefCursor_ADO_C__.asp
CREATE OR REPLACE PROCEDURE "SP_ADMINPWD_MODIFY"
(p_Result OUT NUMBER, p_UserName IN VARCHAR2, p_OldPwd IN VARCHAR2, p_NewPwd IN VARCHAR2)
IS
v_Pwd VARCHAR2(20);
BEGIN
p_Result := 0; --先把返回值置0,表示无错误 BEGIN --先验证旧密码是否正确
SELECT PassWord INTO v_Pwd FROM charge_Admin_Info WHERE UserName = p_UserName;
IF v_Pwd != p_OldPwd THEN
p_Result := 6;
RETURN;
END IF;
END; BEGIN --旧密码验证通过,修改密码
UPDATE charge_Admin_Info SET PassWord = p_NewPwd WHERE UserName = p_UserName;
EXCEPTION
WHEN OTHERS THEN
ROLLBACK;
p_Result := 8;
RETURN;
END;
COMMIT;end ;
调试正确,实现管理员修改密码功能.
调用存储过程如下:
try
{
_CommandPtr m_pCommand;
m_pCommand.CreateInstance(__uuidof(Command));
m_pCommand->ActiveConnection = cnn;
m_pCommand->CommandText = "SP_AdminPwd_Modify";
m_pCommand->CommandType = adCmdStoredProc; _ParameterPtr mp_var1;
mp_var1.CreateInstance(__uuidof(Parameter));
_ParameterPtr mp_var2;
mp_var2.CreateInstance(__uuidof(Parameter));
_ParameterPtr mp_var3;
mp_var3.CreateInstance(__uuidof(Parameter)); _ParameterPtr outParam = NULL;
outParam.CreateInstance(__uuidof(Parameter)); mp_var1 = m_pCommand->CreateParameter(_bstr_t("p_UserName"),adVarChar,adParamInput,20,
_variant_t(UserName));
m_pCommand->Parameters->Append(mp_var1); CString strOldPass;
m_OldPass.GetWindowText(strOldPass);
mp_var2 = m_pCommand->CreateParameter(_bstr_t("p_OldPwd"),adVarChar,adParamInput,200,
_variant_t(strOldPass));
m_pCommand->Parameters->Append(mp_var2); mp_var3 = m_pCommand->CreateParameter(_bstr_t("p_NewPwd"),adVarChar,adParamInput,200,
_variant_t(m_PassNew));
m_pCommand->Parameters->Append(mp_var3); outParam = m_pCommand->CreateParameter(_bstr_t("p_Result"),adInteger,adParamOutput,3);
m_pCommand->Parameters->Append(outParam);
m_pCommand->Execute(NULL,NULL,adCmdStoredProc);
} catch(_com_error e)
{
AfxMessageBox(e.ErrorMessage());
}运行后出现IDispatch error #3092,小弟找了好久都没搞定,急,请个位帮个忙,先谢了!
我改了,还是一样的错误啊
param = m_pCommand->CreateParameter (_bstr_t("p_Result"),adNumeric,adParamInput,3,_variant_t(f));
param->NumericScale=long(3);
param->Precision=long(0);
m_pCommand->->Parameters->Append(param);你用adNumeric代替adInteger试一下
TRACE("Error info: %s \n", (pCome.ErrorMessage()));
把所有的错误信息都抛出来看看
ORA-01403: 未找到数据
ORA-06512: 在"CHARGE.SP_ADMINPWD_MODIFY", line9
ORA-06512 在line 1
如果表里没有查到你所需的纪录,你要有判断v_Pwd 是否确定被赋值了
EXCEPTION
WHEN NO_DATA_FOUND THEN
p_Result := 6;
RETURN;
END;
IF v_Pwd != p_OldPwd THEN
p_Result := 6;
RETURN;
END IF;
try
{
cmmd->ActiveConnection = m_pConnection;
cmmd->CommandText=_bstr_t("SP_ADMINPWD_MODIFY");
cmmd->CommandType=adCmdStoredProc; _ParameterPtr param=NULL;
param.CreateInstance(__uuidof(Parameter)); param = cmmd->CreateParameter("p_Result",adNumeric, adParamOutput,2);
cmmd->Parameters->Append(param); param = cmmd->CreateParameter("p_UserName",adVarChar, adParamInput, 20, _variant_t("eee"));
cmmd->Parameters->Append(param); param = cmmd->CreateParameter("p_OldPwd",adVarChar, adParamInput, 20, _variant_t("a"));
cmmd->Parameters->Append(param); param = cmmd->CreateParameter("p_NewPwd",adVarChar, adParamInput, 20, _variant_t("tanyi"));
cmmd->Parameters->Append(param); cmmd->Execute(NULL,NULL,adCmdStoredProc); //cmmd->Parameters->Refresh();
// _variant_t vft=cmmd->Parameters->Item["p_Result"]->Value;
m_nNewResult=(long)cmmd->Parameters->GetItem("p_Result")->GetValue();//
CString S;
S.Format("%d",m_nNewResult);
AfxMessageBox(S);
// TRACE("result:%d\n",lft);
}
catch(_com_error e)
{
AfxMessageBox((LPCTSTR)(_bstr_t)(e.Description()));
}