在存储过程中产生一CREATE RULE 引起的数据库错误,且有返回值.我在SQL QUERY ANALYSER 能正确得到该结果,但在程序一执行就引发_COM_ERROR错误,且不能得到返回值,请问如何解决?先谢谢了^_^

解决方案 »

  1.   

    我的程序代碼:
    _CommandPtr     pCmd  = NULL;
    _ParameterPtr    pPrm  = NULL;
    try
    {
    TESTHR(pCmd.CreateInstance(__uuidof(Command)));
    TESTHR(pPrm.CreateInstance(__uuidof(Parameter)));

    pPrm = pCmd->CreateParameter(_bstr_t("Return"),
    adInteger,
    adParamReturnValue,
    sizeof(int)); 
    pCmd->Parameters->Append(pPrm); 
    pPrm = pCmd->CreateParameter(_bstr_t("@p_acct"),
    adChar,
    adParamInput,
    sizeof(ModifyCreditCardStruct.acAccount),
    _variant_t(ModifyCreditCardStruct.acAccount));
    pCmd->Parameters->Append(pPrm);
    pPrm = pCmd->CreateParameter(_bstr_t("@p_devid"),
    adChar,
    adParamInput,
    sizeof(m_Param.szProxyID),
    _variant_t(m_Param.szProxyID));
    pCmd->Parameters->Append(pPrm);
    pPrm = pCmd->CreateParameter(_bstr_t("@p_password"),
    adChar,
    adParamInput,
    sizeof(ModifyCreditCardStruct.acAccountPassword),
    _variant_t(ModifyCreditCardStruct.acAccountPassword));
    pCmd->Parameters->Append(pPrm);
    pPrm = pCmd->CreateParameter(_bstr_t("@p_cardno_1"),
    adChar,
    adParamInput,
    sizeof(ModifyCreditCardStruct.sCardStruct[0].CreditCardNo),
    _variant_t(ModifyCreditCardStruct.sCardStruct[0].CreditCardNo));
    pCmd->Parameters->Append(pPrm);
    pPrm = pCmd->CreateParameter(_bstr_t("@p_expire_1"),
    adChar,
    adParamInput,
    sizeof(ModifyCreditCardStruct.sCardStruct[0].cExpiredDate),
    _variant_t(ModifyCreditCardStruct.sCardStruct[0].cExpiredDate));
    pCmd->Parameters->Append(pPrm);
    pPrm = pCmd->CreateParameter(_bstr_t("@p_cardbank_1"),
    adWChar,
    adParamInput,
    sizeof(ModifyCreditCardStruct.sCardStruct[0].cBankName),
    _variant_t(ModifyCreditCardStruct.sCardStruct[0].cBankName));
    pCmd->Parameters->Append(pPrm);
    pPrm = pCmd->CreateParameter(_bstr_t("@p_cardno_2"),
    adChar,
    adParamInput,
    sizeof(ModifyCreditCardStruct.sCardStruct[1].CreditCardNo),
    _variant_t(ModifyCreditCardStruct.sCardStruct[1].CreditCardNo));
    pCmd->Parameters->Append(pPrm);
    pPrm = pCmd->CreateParameter(_bstr_t("@p_expire_2"),
    adChar,
    adParamInput,
    sizeof(ModifyCreditCardStruct.sCardStruct[1].cExpiredDate),
    _variant_t(ModifyCreditCardStruct.sCardStruct[1].cExpiredDate));
    pCmd->Parameters->Append(pPrm);
    pPrm = pCmd->CreateParameter(_bstr_t("@p_cardbank_2"),
    adWChar,
    adParamInput,
    sizeof(ModifyCreditCardStruct.sCardStruct[1].cBankName),
    _variant_t(ModifyCreditCardStruct.sCardStruct[1].cBankName));
    pCmd->Parameters->Append(pPrm);
    pPrm = pCmd->CreateParameter(_bstr_t("@p_cardno_3"),
    adChar,
    adParamInput,
    sizeof(ModifyCreditCardStruct.sCardStruct[2].CreditCardNo),
    _variant_t(ModifyCreditCardStruct.sCardStruct[2].CreditCardNo));
    pCmd->Parameters->Append(pPrm);
    pPrm = pCmd->CreateParameter(_bstr_t("@p_expire_3"),
    adChar,
    adParamInput,
    sizeof(ModifyCreditCardStruct.sCardStruct[2].cExpiredDate),
    _variant_t(ModifyCreditCardStruct.sCardStruct[2].cExpiredDate));
    pCmd->Parameters->Append(pPrm);
    pPrm = pCmd->CreateParameter(_bstr_t("@p_cardbank_3"),
    adWChar,
    adParamInput,
    sizeof(ModifyCreditCardStruct.sCardStruct[2].cBankName),
    _variant_t(ModifyCreditCardStruct.sCardStruct[2].cBankName));
    pCmd->Parameters->Append(pPrm); pCmd->CommandText =_bstr_t("dbo.ACCOUNT_CHANGE_CREDITCARDINFO");
    pCmd->ActiveConnection = m_pConnection;
    pCmd->CommandType = adCmdStoredProc;
    pCmd->Execute(NULL,NULL,adCmdStoredProc);
    long retvalue = (pCmd->Parameters->GetItem("Return")->GetValue());
    if ( retvalue == 0 ) 
    {
    return E_SUCCESS;
    }
    else 
    {
    return ConvertReturnStatus((DBINT)retvalue);
    }
    }
    catch(_com_error &error)
    {
    _bstr_t bstrSource(error.Source());
    _bstr_t bstrDescription(error.Description());
    TRACE2("\nCOM error occurred, Source : %s \n Description : %s \n",(LPCSTR)bstrSource,(LPCSTR)bstrDescription);
    PrintProviderError();
    return E_DB_ERROR;
    }
      

  2.   

    UP一次,谁能帮帮我,先谢谢了。 
    如果存储过程执行正确,上述程序能正确的执行,但如果存储过程中INSERT 表时引发RULE不符合时候,程序会抛出_com_error异常。
      

  3.   

    看看是不是存储过程有错了!
    例如:insert了一个没有的字段。
      

  4.   

    存储过程执行如下操作:INSERT某个表,某个字段不符合某RULE规则,因此存储过程将返回某个值。但是,我在程序里还是会抛出_COM_ERROR- 异常, 谁碰过类似的问题?