我在主对话框中添加了一个_ConnectionPtr的全局变量m_Conn,现在主对话框点击一个按钮弹出副对话框,然后在副对话框中执行数据库插入语句,也就是insert into。我想直接引用主对话框的m_Conn变量,用其Execute方法执行,代码如下:
((CADOTestDlg *)AfxGetApp())->m_Conn->Execute(_bstr_t(strsql),0,adCmdText);发现不行,然后
我在副话框中重新申明一个_ConnectionPtr类型的全局变量m_Conn2,初始化也不行。最后我尝试在主对话框单击那个按钮的消息中,我把主对话框的m_Conn变量赋给副对话框的m_Conn2也不行。注:副对话框是非模态对话框。

解决方案 »

  1.   

    你副对话框中加一指针变量m_pDlg,副对话框Create前把主对话框的this指针附给此变量,然后
    m_pDlg->m_Conn->Execute(_bstr_t(strsql),0,adCmdText);
      

  2.   

    副对话框用m_Conn这个之前,连接上DB了吗?
      

  3.   

    副对话框用m_Conn之前,m_Conn一直连着DB,没有释放,不过我试了,先把主对话框的m_Conn释放了,再初始化副对话框的m_Conn2,程序还是提示出错,真的不知道怎么回事。
      

  4.   

    对了,提示的错误信息是:IDispatch error  #3092。
      

  5.   

    你副对话框中加一指针变量m_pDlg,副对话框Create前把主对话框的this指针附给此变量,然后
    m_pDlg->m_Conn->Execute(_bstr_t(strsql),0,adCmdText);照这样做,程序提示无效指针,哪位朋友帮帮我啊!
      

  6.   

    _ConnectionPtr应该在app中定义并将它设为public,因为一般_ConnectionPtr对象对于整个程序都是通用的,要在任何的对话框中使用,那么直接调用theApp.m_conn就可以了,theApp才是真正的全局变量,程序结束的时候再一次释放就是了。
      

  7.   

    直接在app中定义也一样,我在InitInstance()函数中执行初始化如下:
    try
    {
    ::CoInitialize(NULL);
        m_Conn.CreateInstance(_uuidof(Connection));
    m_Conn->Open("Provider=SQLOLEDB;Server=HCN;uid=sa;pwd=;Database=finance","","",adConnectUnspecified);

    }
    catch(_com_error e)
    {
    AfxMessageBox(e.ErrorMessage()); }
    CADOTestDlg dlg;
    m_pMainWnd = &dlg;
    int nResponse = dlg.DoModal();然后在主对话框用:theApp.m_Conn->Execute(_bstr_t(strsql),0,adCmdText);执行时说theApp指针没定义,然后我换成:((CADOTestApp*)AfxGetApp())->m_Conn->Execute(_bstr_t(strsql),&ra,adCmdText);主对话框能用,不过副对话框还是提示:IDispatch error  #3092出错信息,真是奇怪,哪位高人帮帮我啊。
      

  8.   

    你两个对话框中strsql是不是一样的,3092错误有时候是因为查询语句语法不符合sql语法导致的
      

  9.   

    你用下面的这段代码,捕抓一下具体的出错提示吧,我觉得可能是sql语句的问题catch (_com_error e) //COM错误取得,当执行COM功能的时候,如果出错,可以捕捉到_com_error的异常
     {  
      CString strComError;
      strComError.Format("错误编号: %08lx\n错误信息: %s\n错误源: %s\n错误描述: %s",
           e.Error(),                  // 错误编号
           e.ErrorMessage(),           // 错误信息
           (LPCSTR) e.Source(),        // 错误源
           (LPCSTR) e.Description());  // 错误描述      
      
      ::MessageBox(NULL,strComError,"错误",MB_ICONEXCLAMATION);
     }这里也提到过
    http://community.csdn.net/Expert/topic/4868/4868644.xml?temp=.7508661
      

  10.   

    然后在主对话框用:theApp.m_Conn->Execute(_bstr_t(strsql),0,adCmdText);执行时说theApp指针没定义,
    ---------------
    extern CXXXXApp theApp;
      

  11.   

    感谢Ishddd,果然是SQL语句出错了,少了一个引号,其实用:((CADOTestApp*)AfxGetApp())->m_Conn->Execute就行。用theApp加extern CADOTestApp theApp也行。