_ConnectionPtr pConn;
pConn.CreateInstance(_T("ADODB.Connection"));
_CommandPtr pCmd;
pCmd.CreateInstance(_T("ADODB.Command"));
_ParameterPtr pParam;
pParam.CreateInstance(_T("ADODB.Parameter")); if(FAILED(pConn->Open(_bstr_t("......"),_T(""),_T(""),adConnectUnspecified)))
return FALSE; pCmd->ActiveConnection = pConn; pCmd->CommandText = _T("UPDATE WL_Bill SET nModifyNum = 4 WHERE ID = @id");
pCmd->CommandType = adCmdText;

_variant_t vValue;
         long nBillID = 1400000;
vValue.vt=VT_I4;
vValue.lVal = nBillID;
pParam = pCmd->CreateParameter(_T("@id"),adInteger, adParamInput,sizeof(long));
pParam->Value = vValue;
pCmd->Parameters->Append(pParam);
try
{
pCmd->Execute(NULL,NULL,adCmdText);
}
catch(_com_error &e)
{
pConn->Close();
pConn->Release();
TRACE("出现错误:%s",e.ErrorMessage());
}
pConn->Close();
pConn->Release();为什么执行到try里面会出错?

解决方案 »

  1.   

    跟了的,
    Execute返回这个东西
    DB_E_ERRORSINCOMMAND
      

  2.   

    不是这样用的,要
        pCmd->CommandText = _T("UPDATE WL_Bill SET nModifyNum = 4 WHERE ID = ?");
        pCmd->CommandType = adCmdText;
            
        _variant_t vValue;
             long nBillID = 1400000;
        vValue.vt=VT_I4;
        vValue.lVal = nBillID;
        pParam = pCmd->CreateParameter(_T("ID"),adInteger, adParamInput,sizeof(long));
        pParam->Value = vValue;
        pCmd->Parameters->Append(pParam);
      

  3.   

    带参?为什么不直接放进去sql语句里去,反正也是要确定?
      

  4.   

    pCmd->Execute(NULL,NULL,adCmdStoredProc);
    试试这个?
      

  5.   

    hr = DB_E_ERRORSINCOMMAND;
    错误依旧。
      

  6.   

    这是跟到Excute里面返回的结果
      

  7.   

    这个不行,这个是执行存储过程的!
    执行SQl 语句不能这么写!
      

  8.   

        if(FAILED(pConn->Open(_bstr_t("......"),_T(""),_T(""),adConnectUnspecified)))
            return FALSE;
    不是连接的问题。我判断过。
    我把带参的SQL换成普通的SQL语句就没问题了。
      

  9.   


    ///////////////////////////////////////////////
    //      PrintProviderError Function          //
    ///////////////////////////////////////////////void PrintProviderError(_ConnectionPtr pConnection)
    {
        // Print Provider Errors from Connection object.
        // pErr is a record object in the Connection's Error collection.
        ErrorPtr  pErr = NULL;    if( (pConnection->Errors->Count) > 0)
        {
            long nCount = pConnection->Errors->Count;
            // Collection ranges from 0 to nCount -1.
            for(long i = 0; i < nCount; i++)
            {
                pErr = pConnection->Errors->GetItem(i);
                TRACE(_T("\tError number: %x\t%s"), pErr->Number,
                    (LPCTSTR)pErr->Description);
            }
        }
    }//////////////////////////////////////
    //      PrintComError Function      //
    //////////////////////////////////////void PrintComError(_com_error &e)
    {
        _bstr_t bstrSource(e.Source());
        _bstr_t bstrDescription(e.Description());    // Print Com errors.
        TRACE(_T("Error\n"));
        TRACE(_T("\tCode = %08lx\n"), e.Error());
        TRACE(_T("\tErrorMessage = %s\n"), (LPCTSTR)e.ErrorMessage());
        TRACE(_T("\tSource = %s\n"), (LPCTSTR) bstrSource);
        TRACE(_T("\tDescription = %s\n"), (LPCTSTR) bstrDescription);
    }///////////////////////////////////////////////
    //      ExecuteSQL Function          //
    ///////////////////////////////////////////////
    void ExecuteSQL()
    {
        CoInitialize(NULL);
        HRESULT    hr = S_OK;    // Define string variables.      
        _bstr_t strCnn("Provider=SQLOLEDB.1;Password=;Persist Security Info=True;User ID=sa;Initial Catalog=Participants;Data Source=(local)");    // Define ADO object pointers.
        // Initialize pointers on define.
        _ConnectionPtr  pConnection = NULL;
        _CommandPtr     pCmd  = NULL;
        _RecordsetPtr   pRst  = NULL;
        _ParameterPtr   pParam = NULL;    try
        {
            // Open connection.
            pConnection.CreateInstance(__uuidof(Connection));
            pConnection->Open (strCnn, "", "", adConnectUnspecified);        // Please note that question , a question  represents a parameter
            _bstr_t strSQL("update p1 set phonenumber='3344' where id=?;");        // Create command object.
            pCmd.CreateInstance(__uuidof(Command));
            pCmd->ActiveConnection = pConnection;        
            pCmd->CommandText = strSQL;
            pCmd->CommandType = adCmdText;        // Append some parameters
            // According to statements to maintain the order and type parameters.
            // In this case, the parameter names can be customized.
            pCmd->Parameters->Append(pCmd->CreateParameter(_T("@id"),adVarChar, adParamInput,(long)10, _T("ID002")));        _variant_t vRecordAffected;
            vRecordAffected.vt = VT_I4;
            vRecordAffected.lVal = 0L;         pCmd->Execute(vRecordAffected.GetAddress(),NULL,adCmdText); 
            TRACE(_T("nRecordAffected=%d\r\n"),  vRecordAffected.lVal);        // Clean up objects before exit.
            
            pCmd.Release();        if (pRst)
            {
                if (pRst->State == adStateOpen)
                    pRst->Close();
                pRst.Release();
            }        if (pConnection)
            {
                if (pConnection->State == adStateOpen)
                    pConnection->Close();
                pConnection.Release();
            }
        }
        catch (_com_error &e)
        {
            PrintProviderError(pConnection);
            PrintComError(e);
        }
        ::CoUninitialize();
    }
    notes: 说明几点,在执行批SQL语句和单语句,传递参数使用问号,一个问号一个参数,在append时,要注意参数的类型和顺序,因为没有具体的参数名对应。为了可读性,才在append的时候传递参数名称。顺便提一下。楼主在答复问题时,能够尽可能的提供更多的调试过程和debug信息,这样更有助于得到解决和更积极的回复。这里只是个建议。上述代码在VS2008+SQL2005.中调试通过,部分代码参考ADO手册。
      

  10.   

    to:vieri_ch
    谢谢这位朋友的解答,问题解决了,而且你下面的话也很有用,受教了,结贴!
      

  11.   

    也谢谢dirdirdir3这位朋友,只是我一开始没看懂,以为你输入的问号是一个乱码,哈哈!晕。
      

  12.   

    换成ADOX怎么做啊?我按照微软提供的(我的电脑C:\Program Files\Common Files\Microsoft Shared\OFFICE12\2052目录下的ADO210.chm中ADOX API参考的一个例子)建一个简单的测试工程,可是总是有问题~请高手赐教!例子中的部分代码:
    #import "c:\Program Files\Common Files\system\ado\msadox.dll" \
        no_namespace
    #import "c:\Program Files\Common Files\system\ado\msado15.dll"