软件的要求就是动态读取一个ACCESS数据库中的各个表,让用户来选择所需要连接的表单,连接后,根据需要进行Sort排序(就是设置sort属性的关键词)。问题是: 如果不调用排序的操作,用户动态切换数据表的连接,一切正常;可是如果调用了排序操作之后,在进行切换表单的连接,就会产生错误,错误就处在 m_pRecordset ->open(),这一句上,究竟为什么呢?????我的设计思路以及部分代码如下:统一创建对象实例
BOOL CRecorderDBDlg::createParam(void)
{       HRESULT hr;
       try   
   {   
hr=m_pConnection.CreateInstance(__uuidof(Connection));
hr=m_pRecordset.CreateInstance(__uuidof(Recordset));
return 1;
   }
   catch(_com_error e)
   {
   return 0;
   }  
}//动态连接数据表单
BOOL CRecorderDBDlg::connectTable(CString strTableName)
{   
HRESULT hr;   try
   {
       
   //以下可以确保如果数据集连接为空,以便重新获取数据;
  
   if(m_pRecordset->State)
   {
            m_pRecordset->Close();
   }
   
   
   m_pRecordset->CursorLocation=adUseClient;     //这句话能够保证程序可以通过设置数据库的sort属性对数据记录进行排序    hr=m_pRecordset->Open( _variant_t("select * from "+strTableName),
                   _variant_t((IDispatch *) m_pConnection),
   adOpenDynamic,
   adLockOptimistic,
   adCmdText);
   return 1;
   }然后在进行排序操作
   m_pRecordset->Sort=colName;
请问高手,错误在那里:??已经困扰了2个星期了。救救我把。。

解决方案 »

  1.   

    //////////////////////////////////////////////////////////
    //        SortX Function                                //
    //////////////////////////////////////////////////////////
    void SortX(void) 
    {
        HRESULT  hr = S_OK;    // Initialize pointers on define.
        // These are in the ADODB::  namespace.
        _ConnectionPtr  pConnection      = NULL;
        _RecordsetPtr  pRstAuthors    = NULL;    // Define string variables.
        _bstr_t strCnn("Provider='sqloledb';Data Source='MySqlServer';"
                "Initial Catalog='pubs';Integrated Security='SSPI';");    try
        {
            TESTHR(pConnection.CreateInstance(__uuidof(Connection)));        TESTHR(pRstAuthors.CreateInstance(__uuidof(Recordset)));        pRstAuthors->CursorLocation = adUseClient;
            pConnection->Open (strCnn, "", "", adConnectUnspecified);
            pRstAuthors->Open("SELECT * FROM authors",
                _variant_t((IDispatch *) pConnection),
                 adOpenStatic, adLockReadOnly, adCmdText);        SortXprint("    Initial Order    ", pRstAuthors);        //Clear the screen for the next display.
            printf("\nPress any key to continue...");
            getch();
            system("cls");
            pRstAuthors->Sort = "au_lname ASC, au_fname ASC";
            SortXprint("Last Name Ascending", pRstAuthors);
            //Clear the screen for the next display.
            printf("\nPress any key to continue...");
            getch();
            system("cls");        pRstAuthors->Sort = "au_lname DESC, au_fname ASC";
            SortXprint("Last Name Descending", pRstAuthors);
        }
        catch(_com_error &e)
        {
            PrintProviderError(pConnection);
            PrintComError(e);
        }    // Clean up objects before exit.
        if (pRstAuthors)
            if (pRstAuthors->State == adStateOpen)
                pRstAuthors->Close();
        if (pConnection)
            if (pConnection->State == adStateOpen)
                pConnection->Close();
    }http://msdn.microsoft.com/library/default.asp?url=/library/en-us/ado270/htm/mdprosortxvc.asp
      

  2.   

    你改成下面这样看看
    CString sql;
    sql.Format(("select * from '%S'",strTableName);  hr=m_pRecordset->Open( _variant_t(sql),
                       _variant_t((IDispatch *) m_pConnection),
       adOpenDynamic,
       adLockOptimistic,
       adCmdText);
    SQL语句最好在外面完成
      

  3.   

    你的排序可以在SQL語句中進行啊!另外你要每次動態打開時重新設置 SORT 看!
      

  4.   


     xindao_wang(小日本都是猪) :
    产生的错误是:(编译室没有错误,在运行时出错)
    RecorderDB.exe 中的 0x7c81eb33 处未处理的异常:Microsoft C++ exception: _com_error @ 0x0012e988 。 laiyiling(【陌生人 V2.0】):
       你给的代码的排序方法基本上和我的思路是一致的。差别就是你重新产生的connectioin 和recordset的实例对象(CreateInstance()),而我的程序中,是紧紧在窗体初始化的时候产生一次,其他地方紧紧是变换一下连接,难道错误就出现在这里?!!!yeedward(无知者无畏,无知者无罪。) :
    你的“sql.Format(("select * from '%S'",strTableName);”,这句话无法得到正确的sql语句
    这样产生的sql语句是:select * from ,strTableName没有加入进来。laker_tmj(laker):
    我的软件是将数据动态的加载到listCtrl中,当用户点击列头自动在数据库中进行排序,然后重新加载到listCtrl中。你说的“你的排序可以在SQL語句中進行啊!”当然也可一,可是现在是遇到了这样一个问题,出错总归有原因,所以我想找出这个错误的原因,可以帮助更好的理解这一块亚。
      

  5.   

    sort 只能在數據記錄集打開前設定啊,你打開後就不能設定了,你可以看幫助中的列了
      

  6.   

    不好意思說錯了 例子中是這樣用的conn.Open "DSN=pubs;uid=sa;pwd=;database=pubs"
    ' Step 2
    Set cmd.ActiveConnection = conn
    cmd.CommandText = "SELECT * from authors"
    ' Step 3
    rs.CursorLocation = adUseClient
    rs.Open cmd, , adOpenStatic, adLockBatchOptimistic
    ' Step 4
    rs("au_lname").Properties("Optimize") = True
    rs.Sort = "au_lname"
    rs.Filter = "phone LIKE '415 5*'"
    rs.MoveFirst
    Do While Not rs.EOF
        Debug.Print "Name: " & rs("au_fname") & " "; rs("au_lname") & _
            "Phone: "; rs("phone") & vbCr
        rs("phone") = "777" & Mid(rs("phone"), 5, 11)
        rs.MoveNext
    Loop
      

  7.   

    pRs->Fields->GetItem("au_lname")->Properties->GetItem("Optimize")->Value = true;
            pRs->Sort = "au_lname ASC";
            pRs->Filter = "phone LIKE '415 5*'";        pRs->MoveFirst();
            while (VARIANT_FALSE == pRs->EndOfFile)
                {
                printf("\a\tName: %s\t %s\tPhone: %s\n", 
                    (rs.lau_fnameStatus == adFldOK ? rs.m_szau_fname : ""), 
                    (rs.lau_lnameStatus == adFldOK ? rs.m_szau_lname : ""),
                    (rs.lphoneStatus == adFldOK ? rs.m_szphone   : ""));            if (rs.lphoneStatus == adFldOK)
                    memcpy(rs.m_szphone, "777", 3);
                    
                if (FAILED(hr = picRs->Update(&rs)))
                    _com_issue_error(hr);        // Change the current row of the Recordset. 
            // Recordset data for the new current row will automatically be 
            // extracted and placed in the CCustomRs C++ instance variables.
        
                pRs->MoveNext();
                }
            pRs->Filter = (long) adFilterNone;