这是别人给我的存储过程,ORACLE817的,WIN2K平台下
(
idname in varchar2,id out integer)
as
row_count integer;
begin
  lock table t_identity in row exclusive mode;
  update t_identity
      set maxno=maxno + 1
      where name=idname;
   select maxno into id from t_identity where name=idname;
  commit;
end;
这是我调用存储过程的函数,返回值是ID值,但是再*****那一行出错
int GetNewID(char *Inputstr)
{
int ret=-1; //调用带输入和输出参数的存储过程
_CommandPtr cmd;
cmd.CreateInstance("ADODB.Command");

//输入参数
_ParameterPtr pParamRk;
pParamRk.CreateInstance("ADODB.Parameter"); //pParamRk->Name="mo07"; //存储过程的参数1
pParamRk->Type=adChar; //字符串
pParamRk->Size=20;
pParamRk->Direction=adParamInput;//表明是输入参数
pParamRk->Value=_variant_t(Inputstr);//int->CString->_variant_t后赋值
//****************************************
cmd->Parameters->Append(pParamRk);//此句执行出错????????
//****************************************

//输出参数
_ParameterPtr pParamOk;
pParamOk.CreateInstance("ADODB.Parameter");
//pParamOk->Name="rowcount"; //参数2名称
pParamOk->Type=adInteger; //整型
pParamOk->Direction=adParamOutput; //声明是输出参数
cmd->Parameters->Append(pParamOk);

cmd->ActiveConnection = m_pConnection;
cmd->CommandText="ADE.PROC_ALLOC_ID"; //存储过程的名字
cmd->CommandType=adCmdStoredProc;//表示为存储过程adCmdStoredProc
 
//执行,获得结果
_RecordsetPtr m_pRecordset;
    m_pRecordset = cmd->Execute(NULL, NULL, adCmdStoredProc);
printf("storeproc id is:%s\n",(char*)_bstr_t(pParamOk->Value));
//AfxMessageBox((char*)_bstr_t(pParamRk->Value));
//AfxMessageBox((char*)_bstr_t(pParamOk->Value));
ret=atoi((char*)_bstr_t(pParamOk->Value)); return ret;
}出的错是系统错误Debug error!

解决方案 »

  1.   

    ADODB::_CommandPtr pCmd;
    ADODB::_ParameterPtr pParam1, pParam2;
    try
    {
    pCmd.CreateInstance("ADODB.Command");
    pCmd->ActiveConnection = m_pConnection;                   pCmd->CommandType = ADODB::adCmdStoredProc;
    pCmd->CommandText = "prcSaveCyClass";  //存储过程名

    pParam1 = pCmd->CreateParameter(_bstr_t("mo07"), ADODB::adVarChar, ADODB::adParamInput, 20, _variant_t(Inputstr));
    pCmd->Parameters->Append(pParam1);
    pParam2 = pCmd->CreateParameter(_bstr_t("rowcount"),ADODB::adInteger, ADODB::adParamOutput, 20);
    pCmd->Parameters->Append(pParam2);
    pCmd->Execute(NULL, NULL, ADODB::adCmdStoredProc);
    iRet = (pParam2->Value).intVal;
    }
    catch(_com_error e) // 捕捉异常
    {
    ....
    }
      

  2.   

    试试在创建连接之前调用一下AfxOleInit
      

  3.   

    _CommandPtr cmd;
    cmd.CreateInstance("ADODB.Command");

    try
    {
    //输入参数
    _ParameterPtr pParamRk;
    pParamRk.CreateInstance("ADODB.Parameter"); cmd->ActiveConnection = m_pConnection;
    cmd->CommandText="ADE.PROC_ALLOC_ID"; //存储过程的名字
    cmd->CommandType=adCmdStoredProc;//表示为存储过程adCmdStoredProc
     
    printf("building 11!\n");
    //pParamRk->Name="mo07"; //存储过程的参数1
    pParamRk->Type=adChar; //字符串

    printf("building 111!\n");
    pParamRk->Size=20;

    printf("building 1111!\n");
    pParamRk->Direction=adParamInput;//表明是输入参数 printf("building 11111!\n");
    pParamRk->Value=_variant_t(Inputstr);//int->CString->_variant_t后赋值 printf("building 111111!\n");
    cmd->Parameters->Append(pParamRk); printf("building 2!\n");
    //输出参数
    _ParameterPtr pParamOk;
    pParamOk.CreateInstance("ADODB.Parameter");
    //pParamOk->Name="rowcount"; //参数2名称
    pParamOk->Type=adInteger; //整型
    pParamOk->Direction=adParamOutput; //声明是输出参数
    cmd->Parameters->Append(pParamOk);
    printf("building 4!\n");
    //执行,获得结果
    _RecordsetPtr m_pRecordset;
    m_pRecordset = cmd->Execute(NULL, NULL, adCmdStoredProc);
    printf("storeproc id is:%s\n",(char*)_bstr_t(pParamOk->Value));
    //AfxMessageBox((char*)_bstr_t(pParamRk->Value));
    //AfxMessageBox((char*)_bstr_t(pParamOk->Value));
    ret=atoi((char*)_bstr_t(pParamOk->Value)); return ret;
    }
    catch(_com_error e) // 捕捉异常
    {
    _bstr_t bstrSource(e.Source());
            _bstr_t bs =  _bstr_t(" Error: ") + _bstr_t(e.Error()) + _bstr_t(" Msg: ") 
                + _bstr_t(e.ErrorMessage()) + _bstr_t(" Description: ") 
                + _bstr_t(e.Description());

    printf("%s\n",(char*)_bstr_t(bs));
    return -1;
    }catch显示无效指针,因为一些客观原因没法单步调试,只能将我的机器的程序编译好了多加个printf,郁闷透了.
      

  4.   

    试试在_CommandPtr cmd;
    cmd.CreateInstance("ADODB.Command");之前调用一下AfxOleInit()
      

  5.   

    我碰到过调用AfxOleInit()无效的情况,我只好试了一下CoInitialize(NULL),指针立马正常了
      

  6.   

    记得推出的时候用UNCOINITIALIZE
      

  7.   

    因为不能在服务器上调试,只能编译好了多打些打印信息找错误,执行到cmd->ActiveConnection = m_pConnection;跳出
    catch说是无效指针。但是,我编写的这个函数在我自己的机器上怎么运行都正常啊!!!感谢各位的帮助,如果各位给我提供的办法尝试成功,800分绝对少不了,再次谢谢各位!
      

  8.   

    可能是权限的问题
    首先调用AfxOleInit()或者CoInitialize()试一下。
    如果这两个都不成功,可能是权限不够,你在服务器上用Administrator登录之后再试试看行不行。