hr = m_pRecordset->Open(_variant_t("photo"), (IDispatch*)m_pConn, adOpenDynamic, adLockOptimistic, adCmdTable);1、请问上面的代码执行后,会查询数据库中的photo表吗?如果会查询,那么当photo表记录很多时这会不会太低效了?
2、通过这种方式(打开一个表,而不是执行select返回得到)建立的记录集,初始大小是什么呢?
3、它与通过执行select语句而得到的记录集又有何不同呢?希望您不吝赐教。谢谢。

解决方案 »

  1.   

    我的目的是用m_pRecordSet插入数据。已知m_pConn是已经开启的连接。
      

  2.   

    这是代码片段,可以执行的。我不需要返回记录,我的目的就是将记录集与表关联,然后用记录集更新表(向表中插入数据)。
    代码是没问题的,我的疑问是:这样的操作会不会查询表呢?
    完整代码:
    void CTestOCRDlg::OnBnClickedButton4()//写入一张图片
    {
    // TODO: 在此添加控件通知处理程序代码
    ::CoInitialize(NULL); //初始化OLE/COM库环境
    _ConnectionPtr m_pConn;
    try
    {
    HRESULT hr = m_pConn.CreateInstance("ADODB.Connection");
    if(FAILED(hr))
    {
    //cout<<"Create ADO Connection failed"<<endl;
    exit(0);
    } CString oracleConnectionString, oracleUserID, oraclePassword;
    oracleConnectionString = "Provider=OraOLEDB.Oracle;Data Source=orcl;";
    oracleUserID = "scott";
    oraclePassword = "1234"; hr = m_pConn->Open((_bstr_t)oracleConnectionString, (_bstr_t)oracleUserID, (_bstr_t)oraclePassword, adModeUnknown);
    if (FAILED(hr))
    {
    //cout<<"Can not connect to database"<<endl;
    exit(0);
    }
    else
    {
    //cout<<"Connect to database successfully!"<<endl;
    }
    }
    catch(_com_error e)
    {
    CString errMsg = e.ErrorMessage();
    //cout<<errMsg<<endl;
    exit(0);
    } _RecordsetPtr m_pRecordset;
    try
    { HRESULT hr = m_pRecordset.CreateInstance("ADODB.Recordset");
    if (FAILED(hr))
    {
    //cout<<"Create ADO Recordset failed"<<endl;
    exit(0);
    } // stuinfotable表中有一个blob类型字段stupic存储照片
    hr = m_pRecordset->Open(_variant_t("photo"), _variant_t((IDispatch *)m_pConn,true), 
    adOpenUnspecified, adLockOptimistic, adCmdTable);
    if (FAILED(hr))
    {
    //cout<<"Open ADO Recordset failed"<<endl;
    exit(0);
    }
    m_pRecordset->AddNew(); //写入图片blob
    CFile file(TEXT("C:\\to_recognize.jpg"),
    CFile::modeRead | CFile::shareDenyNone);
    long resultByteLen=file.GetLength();
    BYTE* resultImgBuffer=new BYTE[resultByteLen];
    file.Read(resultImgBuffer,resultByteLen);
    BYTE* pBuf=resultImgBuffer;
    SAFEARRAY* psa;
    SAFEARRAYBOUND rgsabound[1];
    rgsabound[0].lLbound=0;
    rgsabound[0].cElements=resultByteLen;
    psa=SafeArrayCreate(VT_UI1,1,rgsabound);
    for(long i=0;i<resultByteLen;i++)
    SafeArrayPutElement(psa,&i,pBuf++);
    VARIANT varBLOB;
    varBLOB.vt=VT_ARRAY|VT_UI1;
    varBLOB.parray=psa;
    m_pRecordset->GetFields()->GetItem(_variant_t("img"))->AppendChunk(varBLOB);
    //写入图片name(以当前时间命名)
    COleDateTime time=COleDateTime::GetCurrentTime();
    CString str=time.Format(TEXT("%H%M%S"));
    m_pRecordset->PutCollect(_variant_t("name"),_variant_t(str)); m_pRecordset->Update(); }
    catch(_com_error e)
    {
    CString errMsg = e.ErrorMessage();
    MessageBox(errMsg+TEXT("\n")+(LPCSTR)e.Description());
    exit(0);
    }
    // 断开ADO连接
    if (m_pConn != NULL)
    {
    m_pConn->Close();
    m_pConn = NULL;
    //cout<<"ADO connection closed successfully"<<endl;
    } ::CoUninitialize();//释放程序占用的COM 资源
    }
      

  3.   

    完整代码(代码可以执行)是向数据库中插入图片,photo表由name和img(blob)两字段构成。void CTestOCRDlg::OnBnClickedButton4()//写入一张图片
    {
    // TODO: 在此添加控件通知处理程序代码
    ::CoInitialize(NULL); //初始化OLE/COM库环境
    _ConnectionPtr m_pConn;
    try
    {
    HRESULT hr = m_pConn.CreateInstance("ADODB.Connection");
    if(FAILED(hr))
    {
    //cout<<"Create ADO Connection failed"<<endl;
    exit(0);
    } CString oracleConnectionString, oracleUserID, oraclePassword;
    oracleConnectionString = "Provider=OraOLEDB.Oracle;Data Source=orcl;";
    oracleUserID = "scott";
    oraclePassword = "1234"; hr = m_pConn->Open((_bstr_t)oracleConnectionString, (_bstr_t)oracleUserID, (_bstr_t)oraclePassword, adModeUnknown);
    if (FAILED(hr))
    {
    //cout<<"Can not connect to database"<<endl;
    exit(0);
    }
    else
    {
    //cout<<"Connect to database successfully!"<<endl;
    }
    }
    catch(_com_error e)
    {
    CString errMsg = e.ErrorMessage();
    //cout<<errMsg<<endl;
    exit(0);
    } _RecordsetPtr m_pRecordset;
    try
    { HRESULT hr = m_pRecordset.CreateInstance("ADODB.Recordset");
    if (FAILED(hr))
    {
    //cout<<"Create ADO Recordset failed"<<endl;
    exit(0);
    } // stuinfotable表中有一个blob类型字段stupic存储照片
    hr = m_pRecordset->Open(_variant_t("photo"), _variant_t((IDispatch *)m_pConn,true), 
    adOpenUnspecified, adLockOptimistic, adCmdTable);
    if (FAILED(hr))
    {
    //cout<<"Open ADO Recordset failed"<<endl;
    exit(0);
    }
    m_pRecordset->AddNew(); //写入图片blob
    CFile file(TEXT("C:\\to_recognize.jpg"),
    CFile::modeRead | CFile::shareDenyNone);
    long resultByteLen=file.GetLength();
    BYTE* resultImgBuffer=new BYTE[resultByteLen];
    file.Read(resultImgBuffer,resultByteLen);
    BYTE* pBuf=resultImgBuffer;
    SAFEARRAY* psa;
    SAFEARRAYBOUND rgsabound[1];
    rgsabound[0].lLbound=0;
    rgsabound[0].cElements=resultByteLen;
    psa=SafeArrayCreate(VT_UI1,1,rgsabound);
    for(long i=0;i<resultByteLen;i++)
    SafeArrayPutElement(psa,&i,pBuf++);
    VARIANT varBLOB;
    varBLOB.vt=VT_ARRAY|VT_UI1;
    varBLOB.parray=psa;
    m_pRecordset->GetFields()->GetItem(_variant_t("img"))->AppendChunk(varBLOB);
    //写入图片name(以当前时间命名)
    COleDateTime time=COleDateTime::GetCurrentTime();
    CString str=time.Format(TEXT("%H%M%S"));
    m_pRecordset->PutCollect(_variant_t("name"),_variant_t(str)); m_pRecordset->Update(); }
    catch(_com_error e)
    {
    CString errMsg = e.ErrorMessage();
    MessageBox(errMsg+TEXT("\n")+(LPCSTR)e.Description());
    exit(0);
    }
    // 断开ADO连接
    if (m_pConn != NULL)
    {
    m_pConn->Close();
    m_pConn = NULL;
    //cout<<"ADO connection closed successfully"<<endl;
    } ::CoUninitialize();//释放程序占用的COM 资源
    }
      

  4.   

    用_ConnectionPtr的Execute来执行SQL语句就能返回数据集了
      

  5.   

    我觉得可以先用m_pConnection->Excute("INSERT INTO...",adcmdtext)
    appendchunk时要获取recordset,这时用m_pRecordset->Open("SELECT * FROM TABLENAME WHERE FLDNAME='FLDVAL'",.....)这样会快吧;或者连接数据库时用服务器游标pConnection->Open(DS, strUser.c_str(), strPassword.c_str(), adConnectUnspecified);if (adStateOpen & pConnection->GetState())
    pConnection->put_CursorLocation (adUseServer);
      

  6.   


    微软的各种db访问 我都比较蛋疼.
    我游戏用过ado, odbc类 但始终偶尔有问题.不知是否他的bug.
    有时 简单的查询,我干脆做成web 页去请求.
      

  7.   

    您好,我的目的并不是想返回数据集,我的目的是用数据集来向表中插入数据。
    只是,我的这个数据集的获得,不是通过sql语句执行返回得来的,而通过打开表(sql语句是表名,open最后参数设置的是adCmdTable)的方式,我想问的是:这样来获取数据集,背后不会查数据库吧?它和通过selec*语句获取的数据集有什么不同呢?
      

  8.   


    您好,你通过Select *的方式返回数据集,这会查询表吧,万一表有很多数据,会不会很耗时,返回的数据集会不会很大,如此,会不会暴内存?求解。
      

  9.   

    您好,我的目的并不是想返回数据集,我的目的是用数据集来向表中插入数据。
    只是,我的这个数据集的获得,不是通过sql语句执行返回得来的,而通过打开表(sql语句是表名,open最后参数设置的是adCmdTable)的方式,我想问的是:这样来获取数据集,背后不会查数据库吧?它和通过selec*语句获取的数据集有什么不同呢?
    我只用过sql语句的方式,因为这个方式是跨平台的,要不然以后你的程序移植到非windows环境下你咋办?
      

  10.   

    SELECT * FROM TABLENAME WHERE FLDNAME='FLDVAL'
    这样的意思是返回某条记录的所有字段