ADO方式访问数据库,一些注意事项

来源:互联网 发布:mac地址可以随便改吗 编辑:程序博客网 时间:2024/06/08 20:57
在这里需要注意两个问题:
1. 初始化完Command之后,如果立即调用get_Count函数去获得Command的参数个数,将会得到错误的结果,原因调查中,暂无结论。
2. 在需要多次调用存储过程的时候,要注意到_ConnectionPtr,_CommandPtr,_RecordsetPtr都是智能指针,最好作为局部变量来处理(如果作为局部变量来处理,release,close什么的都是浮云了)。
3. 不同的存储过程不能共享同一个Command, 必须一个有自己独占一个Command.


首先要链接数据库,示例代码如下:

/*----------------------------------------------------------------------------*/


//  Connection database::CoInitialize(NULL);//初始化线程  ADO方式调用存储过程使用到了COM库,需要调用CoInitialize初始化线程// 同时在结束时需要调用CoUninitialize释放资源try{    m_pConnection.CreateInstance("ADODB.Connection");     CString strConnect;    strConnect = _T("Provider=SQLOLEDB.1");    strConnect += _T(";Password=")+m_DbInfo.csPassward;    strConnect += _T(";Persist Security Info=True");    strConnect += _T(";User ID=")+m_DbInfo.csUSerName;    strConnect += _T(";Initial Catalog=")+m_DbInfo.csDBName;    strConnect += _T(";Data Source=")+m_DbInfo.csDataSource;    strConnect += _T("\n;");     m_pConnection->Open(strConnect.GetBuffer(strConnect.GetLength()+1),"","",adModeUnknown);    return TRUE;}catch (_com_error e){    CString str = e.Description();    errorMsg = &str;    AfxMessageBox(e.Description());         return FALSE;}/*----------------------------------------------------------------------------*/// Create command for stored processm_pADOComm.CreateInstance(__uuidof(Command));m_pADOComm->CommandType = adCmdStoredProc; // set command type to stored processm_pADOComm->ActiveConnection = m_pConnection;m_pConnection->CursorLocation = adUseClient; m_pADOComm->CommandText = commText; // the name of the stored process// Release the parameters of the commandm_pADOComm->Parameters->Delete("@source_language");m_pADOComm->Parameters->Delete("@desc_language");m_pADOComm->Parameters->Delete("@remap_flag_1");m_pADOComm->Parameters->Delete("@remap_flag_2");m_pADOComm->Parameters->Delete("@maker");/*----------------------------------------------------------------------------*/// init command parametersint lenth = 10;_bstr_t strParmVal;strParmVal = (_bstr_t)csSrcLang;// Set source language to the command of the ADOpParm = m_AdoConn->m_pADOComm->CreateParameter("@source_language",adVarChar,adParamInput,lenth,strParmVal);m_AdoConn->AddParamToCom(pParm); strParmVal = (_bstr_t)m_desLangArray[nDesLIndex].csLangCode;pParm = m_AdoConn->m_pADOComm->CreateParameter("@desc_language",adVarChar,adParamInput,lenth,strParmVal);m_AdoConn->AddParamToCom(pParm); remap_flag_1 = 1;remap_flag_2 = 4;// Set remap_flag range to the command of the ADOpParm = m_AdoConn->m_pADOComm->CreateParameter("@remap_flag_1",adInteger,adParamInput,sizeof(int),remap_flag_1);m_AdoConn->AddParamToCom(pParm); pParm = m_AdoConn->m_pADOComm->CreateParameter("@remap_flag_2",adInteger,adParamInput,sizeof(int),remap_flag_2);m_AdoConn->AddParamToCom(pParm); strMarker = "BANZ";pParm = m_AdoConn->m_pADOComm->CreateParameter("@maker",adVarChar,adParamInput,max_vehicle_str_len,strMarker);m_AdoConn->AddParamToCom(pParm);/*----------------------------------------------------------------------------*/// Excute stored process and get the recordif(m_pConnection==NULL)    OnInitADOConn(&errorMsg);m_pRecordset.CreateInstance(__uuidof(Recordset));m_pRecordset = m_pADOComm->Execute(NULL,NULL,adCmdStoredProc);/*----------------------------------------------------------------------------*/// Get the data from the recordfor (_pRecordset->MoveFirst(); !_pRecordset->adoEOF; _pRecordset->MoveNext()){    _variant_t vRet;    vRet = _pRecordset->GetCollect("EN");    if (VT_NULL == vRet.vt)    {csTempEn = _T("");    }    else    {csTempEn = (LPCTSTR)(_bstr_t)_pRecordset->GetCollect("EN");    }    ......}/*----------------------------------------------------------------------------*/// Exit connection try{    if (m_pRecordset != NULL && adStateOpen == m_pRecordset->GetState())m_pRecordset->Close();    m_pRecordset=NULL;    m_pConnection->Close();    m_pADOComm->Cancel();}catch(_com_error e){    return;}::CoUninitialize();



原创粉丝点击