我最近写语音的程序,要为每个语音通道分配两个m_pRecordset,来处理数据库,所以我定义了如下:m_pRecordset1 = new _RecordsetPtr[ TotalTrunk ] ;
m_pRecordset2 = new _RecordsetPtr[ TotalTrunk ] ;
for( i=0; i<TotalTrunk; i++ )
{
m_pRecordset1[i].CreateInstance("ADODB.Recordset
m_pRecordset2[i].CreateInstance("ADODB.Recordset");//创建纪录集对象实例
}然后写了一个函数,不知道如何传递m_pRecordset1[i]或m_pRecordset2[i]做为参数,请大虾帮帮小弟~下面是小弟写的,在调用时出错了,估计是参数问题
void ExecuteSQL(_ConnectionPtr m_pConnection, _RecordsetPtr m_pRecordset, CString strSQL)
{
BSTR bstrSQL=strSQL.AllocSysString();
try
{
if(m_pRecordset->State)
m_pRecordset->Close();
m_pRecordset->Open(bstrSQL,(IDispatch*)m_pConnection,
adOpenDynamic,adLockOptimistic,adCmdText);
}
catch(_com_error error)
{
CString errorMessage;
errorMessage.Format("%s",(LPTSTR)error.Description());
::AfxMessageBox(errorMessage);
}
}

解决方案 »

  1.   

    你试试用引用传递connect和recordset
    _ConnectionPtr & m_pConnection, _RecordsetPtr & m_pRecordset然后调用的时候,
    ExecuteSQL(m_pConnection, m_pRecordset2[1], "Select * …………")
      

  2.   

    if(m_pRecordset->State)
    这句有没有问题呀?是不是改为
    if(m_pRecordset->State())
      

  3.   

    To  handsomerun(毛毛) ( ) 信誉:115 
    我试过,编译没错误,警告如下:
    warning C4786: '__unwindfunclet$?ExecuteSQL@@YAXAAV?$_com_ptr_t@V?$_com_IIID@U_Connection@@$1?_GUID_00000550_0000_0010_8000_00aa006d2ea4@@3U__s_GUID@@A@@@@AAV?$_com_ptr_t@V?$_com_IIID@U_Recordse
    t@@$1?_GUID_00000556_0000_0010_8000_00aa006d2ea4@@3U__s_GUID@@A@@@@VCString@@@Z$7' : identifier was truncated to '255' characters in the debug information然后运行时调用函数出错.是参数问题,函数体是没有问题的!
      

  4.   

    m_pRecordset1 是什么类型
    应该是_RecordsetPtr * m_pRecordset1的哦还有,执行到哪出错了??
    跟踪到了吗??
      

  5.   

    to  handsomerun(毛毛) ( ) 信誉:115 我是这样定义的,在对话框类中
    _RecordsetPtr *m_pRecordset1;
    _RecordsetPtr *m_pRecordset2;ExecuteSQL是写在一个自定义单元中,但我这样声明了的:
    extern _RecordsetPtr *m_pRecordset1;
    extern _RecordsetPtr *m_pRecordset2;ExecuteSQL执行时出错,就算没有任何语句也会出错,(但是里面的代码绝对没有错的,因为我如果不用数组,就只定义_RecordsetPtr m_pRecordset变量是成功的!),所以我认为是参数有问题如果这样定义ExecuteSQL(_ConnectionPtr &m_pConnection, _RecordsetPtr &m_pRecordset, CString strSQL)
    那调用时如果函数体为空语句就不会出错,但如果执行无论哪一句(其实就是两句,一句是判断是否打开,一句是返回数据集)就会出错
      

  6.   

    写了一段代码测试了一下如下
    _RecordsetPtr * m_pRecordset1;BOOL CAdoAccessDlg::OnInitDialog()
    {
    m_pConnection.CreateInstance(_uuidof(Connection));    m_pConnection->Open(…………);
         m_pRecordset1 = new _RecordsetPtr[ 5 ] ; for(int  i=0; i<5; i++ )
    {
    m_pRecordset1[i].CreateInstance("ADODB.Recordset");
            }
    }
    void CAdoAccessDlg::ExecuteSQL(_ConnectionPtr &pConnection, _RecordsetPtr &pRecordset)
    {
    _variant_t RecordsAffected;          if(pRecordset->State)
             pRecordset->Close(); pRecordset = pConnection->Execute (_bstr_t("SELECT * FROM StudentInfo") , &RecordsAffected , adCmdUnknown);
    }void CAdoAccessDlg::OnButton1() 
    {
    ExecuteSQL(m_pConnection,m_pRecordset1[2]);
    DataView(m_pRecordset1[2]);}DataView(_RecordsetPtr pRecordset)
    dataview是用来显示纪录集中的数据的,呵呵void CAdoAccessDlg::OnDestroy() 
    {
    CDialog::OnDestroy();

    // TODO: Add your message handler code here

    if(m_pConnection->State)
    {
    m_pConnection->Close();

    } m_pConnection= NULL;   for(int  i=0; i<5; i++ )
    {
    if(m_pRecordset1[i]->State)
    {
    m_pRecordset1[i]->Close();

    } m_pRecordset1[i]= NULL;  
    }

    delete [] m_pRecordset1;
    }
      

  7.   

    还有一个要注意的,毛毛啊,你要把ExecuteSQL定义在一个单元中,不要写在同一单元,这样你会发现可能原来可以执行的就出现问题了~~~~~~~~麻烦毛毛兄了
      

  8.   

    用你的open也测试通过啦
    :)
    pRecordset->Open(_bstr_t("SELECT * FROM StudentInfo"),(IDispatch*)m_pConnection,
    adOpenDynamic,adLockOptimistic,adCmdText);再好好看看你的代码吧
    偶上班用qq不方便的,呵呵
      

  9.   

    ”你要把ExecuteSQL定义在一个单元中,不要写在同一单元”这句话看不懂
      

  10.   

    毛毛,我把操作数据库的函数封装在一个单元里的,叫DB.H中我早上找到一个资料,一个网友也遇到我这样的问题,不过他没有定义数组,可是,我不知道如何在DB.H中取得对话框类指针(这个程序是基本对话框的,没有主框架类和文档类)以下是高手给他的解答:在你的App类里面定义指针
    _ConnectionPtr m_pConnection;然后在其他了里面这样来获取该指针:
    CTestApp *pApp=(CTestApp *)AfxGetApp();
    _ConnectionPtr m_pConn;
    m_pConn=pApp->m_pConnection;
    然后你直接用m_pConn就可以了。
      

  11.   

    毛毛啊,帮帮我呀,好事做到底呀,你帮我试试,把ExecuteSQL放在DB.H中,也是像你后来改的那样,用数组传递,我不知道如何在DB.H中取得对话框类指针(这个程序是基本对话框的,没有主框架类和文档类),谢谢你啊:(
    其实对于你来说是个简单问题,我可搞了两天啦~~郁闷呀~
      

  12.   

    基对话框的??CTestDlg *p=(CTestDlg *)AfxGetMainWnd();
    获得主窗口的指针
      

  13.   

    那个DB.H只是一个集中函数的单元,并不是一个类呀~你有没有MSN呀,我把程序发给你啊~~~~~
      

  14.   

    别急
    你的ExecuteSQL是个全局函数??
    首先,全局函数的定义最好放在cpp里面然后,你在你的类里可以直接调用这个ExecuteSQL的啊
      

  15.   

    可是我想把这些全局函数分类,因为我是做语音方面的,要对语音卡操作,我定义了两个单元,一个是专对语音板卡函数封装,另一个是对数据库操作,如果放到CPP中,那不是很多程序了??所以我要分开放呀~
      

  16.   

    试了试,当然没问题DB.h中extern void ExecuteSQL(_ConnectionPtr &pConnection, _RecordsetPtr &pRecordset);#include "stdafx.h"
    #include "AdoAccess.h"void ExecuteSQL(_ConnectionPtr &pConnection, _RecordsetPtr &pRecordset)
    {
    _variant_t RecordsAffected;
    if(pRecordset->State)
    pRecordset->Close(); //pRecordset = pConnection->Execute (_bstr_t("SELECT * FROM StudentInfo") , &RecordsAffected , adCmdUnknown); pRecordset->Open(_bstr_t("SELECT * FROM StudentInfo"),(IDispatch*)pConnection,
    adOpenDynamic,adLockOptimistic,adCmdText);}然后
    void CAdoAccessDlg::OnButton1() 
    {
    ExecuteSQL(m_pConnection,m_pRecordset1[2]);
    DataView(m_pRecordset1[2]);
    }
    还是ok
    我把那个
     CAdoAccessDlg::ExecuteSQL删了
      

  17.   

    如果你还是有问题
    你学我那样,做个简单的基于对话框的工程,然后去做一下
    好好体会一下
    然后再改你现在用的那个工程一步一步来
    一下子上去改的话,可能会比较麻烦的
    你也可以建个db.h文件试试
      

  18.   

    如果像你这样,把函数放在CAdoAccessDlg中,我是可以做成功的,如果是放在DB.H中,对于_ConnectionPtr m_pConnection的变量,调用EXCUESESQL我也能够传递成功,可是改为数组就不行啦~~~~唉:(
      

  19.   

    你发给我的程序运行很好,连警告也没有,我按你的那样改也可以运行了,不过编译出现警告,提示是:warning C4786: '__unwindfunclet$?ExecuteSQL@@YAXAAV?$_com_ptr_t@V?$_com_IIID@U_Connection@@$1?_GUID_00000550_0000_0010_8000_00aa006d2ea4@@3U__s_GUID@@A@@@@AAV?$_com_ptr_t@V?$_com_IIID@U_Recordse
    t@@$1?_GUID_00000556_0000_0010_8000_00aa006d2ea4@@3U__s_GUID@@A@@@@VCString@@@Z$7' : identifier was truncated to '255' characters in the debug information
    还有,你可不可以把以下代码封装在DB.H中啊(名为openDatabase)?我不知道如何传递数组参数CString strConnection("driver={SQL Server};Server=QQ;database=ivr"); m_pConnection.CreateInstance("ADODB.Connection");
    m_pConnection->Open((_bstr_t)strConnection,"","",adModeUnknown);
    m_pRecordset1 = new _RecordsetPtr[ 60 ] ;
    m_pRecordset2 = new _RecordsetPtr[ 60 ] ;
    for( int i=0; i<60; i++ )
    {
    m_pRecordset1[i].CreateInstance("ADODB.Recordset");
    m_pRecordset2[i].CreateInstance("ADODB.Recordset");
    }
      

  20.   

    OpenDataBase(m_pConnection, m_pRecordset1,m_pRecordset2, strConnection,"","")第二三个不知道如何写参数类型啊,毛毛快救救我啊
      

  21.   

    那个连接数据库,就是m_pConnection->Open
    这一块可以放到db.h的某个函数中做法和你那个execsql什么的函数一样,用引用作为参数
    就是把app中的那个connct传递进来连接m_pRecordset1 = new _RecordsetPtr[ 5 ] ;这个建议在主程序里面开在db。h中开,不是很好,
    因为你到时候还要delete,你放在db中,就不好控制了
    而且传递指针比较麻烦的如果你一定要放在DB.H中
    那么写个函数
    里面是
    m_pRecordset1 = new _RecordsetPtr[ 5 ] ;for(int i=0; i<5; i++ )
    {
    m_pRecordset1[i].CreateInstance("ADODB.Recordset");//创建纪录集对象实例
    }
    然后return m_pRecordset1然后通过这个返回值操作那些纪录集
    不过要记得最后一定要delete,不然内存泄漏