在一个对话框的初始化函数中可以打开一个记录集。如下代码[
code=C/C++]
m_pRecordset.CreateInstance("ADODB.Recordset");    
…………
…………
sCmd.Format("SELECT * FROM TAB_S WHERE USER_NAME= '%s' AND (S_INTIME BETWEEN #%s# AND #%s#) ",g_name,strstime,stretime);
[/code]然后我在该对话框类的另外一个函数中有如下代码:(错误提示是无效指针),在对话框的初始化函数中可以操纵记录集,为什么啊?
是不是一个m_pRecordset不能open两次啊?try
{
CString sCmd;
sCmd.Format("SELECT * FROM TAB_S WHERE S_NO='%d' ",m_listkey);
m_pRecordset->Open(_bstr_t(sCmd),_variant_t((IDispatch*)theApp.m_pConnection,true),adOpenStatic,adLockOptimistic,adCmdText);
}
catch(_com_error e)///捕捉异常
{
CString errstring;
errstring.Format("%s%s","打开结果集失败:",e.ErrorMessage());
AfxMessageBox(errstring);///显示错误信息
}

解决方案 »

  1.   

    是的,在下次Open之前请先Close()
      

  2.   

    我再open前close了,还是出现“无效指针”。
      

  3.   

    只是要执行SQL语句吗?m_pRecordset->Open(_bstr_t(strSQL), m_pConnection.GetInterfacePtr(),adOpenDynamic, adLockOptimistic, adCmdText);
      

  4.   

    睡不着,试试CSDN能用手机回贴吧。谢谢各位大侠了,虽然问题还没有解决。
      

  5.   

    两个地方的m_pRecordset究竟在哪定义的?
      

  6.   

    我又改了一下,原来的无效指针问题没有了,不过又出现了“idispach error #3097”的错误。
    我把整个程序和数据库放到下面的链接上,大侠帮帮们帮帮小弟,看看是哪里出了问题。
    Http://www.zhangxiuhua.cn/GetFile.asp?GetId=081111122509V7IhD
      

  7.   

    catch(_com_error e)///捕捉异常
    {
    AfxMessageBox(e.Description());
    }
      

  8.   

    公司机器不能上网,专门的上网机器考来你的程序看了看,感觉……
    先提个无关紧要的建议:
    [1]*****************************************if (name==m_username&&password==m_userpassword)
    {
    m_pMf->m_blogin=true;
    m_pMf->m_bSZ=true;
    m_pMf->GetMenu()->GetSubMenu(2)->EnableMenuItem(0,MF_ENABLED ); //�ı���֧ѡ����״̬
    // m_pRecordset->Close();
    g_name=m_username;

    MessageBox("��½�ɹ�");
    EndDialog(1);
    }

    m_pRecordset->MoveNext();
    return;
    ******************************************
    这个return 让我才知道原来的密码和帐号都是1……而且输错还没提示,改改去~!呵呵[2]你的m_pRecordset很多地方都用到,但是我建议你专门些个操作数据库的类~类的构造函数和析构函数这样写,如下。
    ******************************************
    CADOOper::CADOOper()
    {
    try
    {
    m_pConnection.CreateInstance(__uuidof(Connection));
    m_pConnection->Open(_bstr_t(Provider), "", "", adModeUnknown);
    }
    catch (_com_error e)
    {
    AfxMessageBox(e.Description(), MB_OK);
    exit(0);
    } c.CreateInstance(__uuidof(Recordset));
    m_CurrentRecord = -1;
    m_hDC = NULL;
    }CADOOper::~CADOOper()
    {
    m_pConnection->Close();
    }
    *************************************************这样你每次要操作数据库的时候就类似这样用就可以了~也不会出现那些错误提示……看眼睛@@
    比如你以后在CADOOper里些了执行SQL语句的函数,你就
    CADOOper ADOoper;
    ADOoper.Open("select * from where 1=1");
    这样去用就可以了,清晰明了~方便Debug~
      

  9.   

    Provider是个宏定义就是最难记的那串JET4。0什么XXX信息
    现在在上班偷偷给你回帖呢~呵呵
      

  10.   


    sCmd.Format("SELECT * FROM TAB_S WHERE S_NO='%d' ",m_listkey);仔细看看~是一个很低级的错误~数字在SQL语句中不加单引号~sCmd.Format("SELECT * FROM TAB_S WHERE S_NO = %d ",m_listkey);**************************************************************这个查询按钮的函数void CDlgSZ::OnButtonSearchbydate() 
    {
    ...
    CDlgResult dlgresult;
    UpdateData();
    dlgresult.m_stime=m_SSTime;
    dlgresult.m_etime=m_SETime;
    dlgresult.DoModal();
    ...
    }我建议~CDlgResult这个类定义成全局的好~不知道大家是不是都是这样的?*******************************************************
    附赠你一个操作数据库的类,里面带一个open功能的函数~CADOOper::CADOOper()     // 构造函数里面这样写
    {
    try
    {
    m_pConnection.CreateInstance(__uuidof(Connection));
    m_pConnection->Open(_bstr_t(Provider), "", "", adModeUnknown);
    }
    catch (_com_error e)
    {
    AfxMessageBox(e.Description(), MB_OK);
    exit(0);
    }c.CreateInstance(__uuidof(Recordset));
    m_CurrentRecord = -1;
    m_hDC = NULL;
    }CADOOper::~CADOOper()     // 析构函数里面这样写
    {
    m_pConnection->Close();
    } BOOL CADOOper::OpenRecord(CString strSQL)      // 这个类的成员函数,功能就是打开执行SQL语句。注意:有open就有close,close我没写,如果感兴趣你自己来吧~
    {
    ASSERT(!strSQL.IsEmpty());    // SQL���䲻��Ϊ��
    try
    {
    // ִ��SQL�õ���¼��
    m_pRecordset->Open(_bstr_t(strSQL), m_pConnection.GetInterfacePtr(),
    adOpenDynamic, adLockOptimistic, adCmdText);
    }
    catch (_com_error e)
    {
    ShowError(e.Description());
    return FALSE;
    } return TRUE;
    }最后例子:CADOOper ADOper;
    CString SQL;
    SQL.Format("select * from table where num = %d", m_MyNum);
    ADOper.OpenRecord(SQL);
    ADOper.CloseRecord();     // 这个函数你要自己写了~
    *********************************
    那个错误改成单引号就不提示那个错误了,但是再往后我就没断点看了……
      

  11.   

    …………………………
    …………………………
    大哥,我要是个女的我就嫁给你了。
    真的不知道该怎么感谢你,我把这个帖子追加了100分,算是一点小小的心意吧。
    当然我也知道大侠不是为了那点分数而帮助小弟,可是我觉得还是应该追加一下分数,要不我今天晚上肯定又要睡不着觉了,呵呵。
    打了二十几分中打了这点字,不知道说什么话感谢你,高中语文不咋好。
      qq是82853589,大侠留个联系方式吧,小弟很想和你交个朋友,o(∩_∩)o...