//程序按照ADO连接SQL标准编写,引用,声明无错.
class ConnDB
{
public:
_bstr_t connectionStringSQL;//定义数据库连接
_ConnectionPtr pConnectionSQL;
_variant_t RecordsAffected;

void ConnMod2();
};void ConnDB::ConnMod2()
{
//连接数据库代码
}//在OnInitDialog() 中执行下面2行代码,也无错.
ConnDB newClass;
newClass.ConnMod2();//但是,如果再执行此行代码,则出错.
newClass.pConnectionSQL->Execute("SELECT uid FROM usertab",&RecordsAffected,adCmdText);//错误
"abnormal program termination"请问,这是怎么回事?
如果把代码都放在OnInitDialog()里边写,则无错误.这是为什么?
请指教

解决方案 »

  1.   

    RecordsAffected是ConnDB类的成员吧,能这样写吗?另外,是否在ConnMod2函数中有局部变量的影响?
      

  2.   

    AfxOleInit();
    /********************连接数据库************************/
    HRESULT hr;
    _ConnectionPtr pConnectionSQL("ADODB.Connection");
    try
    {
    _bstr_t connectionStringSQL("Driver={SQL Server}; Server=192.168.1.10; Uid=client; Pwd=client; Database=gdzz");
    pConnectionSQL->ConnectionTimeout=3; //设置超时时间为3秒
    hr=pConnectionSQL->Open(connectionStringSQL,"","",NULL);
    }
    catch(_com_error e)///捕捉异常
    {
    CString errmsg;
    errmsg.Format("连接数据库失败!\r\n错误信息:%s",e.ErrorMessage());
    AfxMessageBox(errmsg);///显示错误信息 }
    这个是ConnMod2里边的代码,debug没错.
      

  3.   

    //在OnInitDialog() 中执行下面2行代码,也无错.
    ConnDB newClass;
    newClass.ConnMod2();//但是,如果再执行此行代码,则出错.
    newClass.pConnectionSQL->Execute("SELECT uid FROM usertab",&RecordsAffected,adCmdText);
    如果把代码都放在OnInitDialog()里边写,则无错误.这是为什么?
    你的newClass对象是在OnInitDialog定义的??
    不是类的成员变量??
      

  4.   

    嗯,newClass是在OnInitDialog定义的,pConnectionSQL是类的成员变量,都在类里边写了.应该怎样改写呢?希望各位星星指点.
      

  5.   

    实在是想不出有什么问题啊你是说,如果你在OnInitDialog这么调用AfxOleInit();
    /********************连接数据库************************/
    HRESULT hr;
    _ConnectionPtr pConnectionSQL("ADODB.Connection");
    try
    {
    _bstr_t connectionStringSQL("Driver={SQL Server}; Server=192.168.1.10; Uid=client; Pwd=client; Database=gdzz");
    pConnectionSQL->ConnectionTimeout=3; //设置超时时间为3秒
    hr=pConnectionSQL->Open(connectionStringSQL,"","",NULL);
    }
    catch(_com_error e)///捕捉异常
    {
    CString errmsg;
    errmsg.Format("连接数据库失败!\r\n错误信息:%s",e.ErrorMessage());
    AfxMessageBox(errmsg);///显示错误信息 }
    pConnectionSQL->Execute("SELECT uid FROM usertab",&RecordsAffected,adCmdText);就不会出错??噢,还有,最好把
    AfxOleInit();放到app的初试化里面
      

  6.   

    对的,如果把连接,查询都放在OnInitDialog中写,就没错.如果写成类的形式,就出错.
    郁闷~~`我也不知道该怎样了.
    handsomerun(毛毛),你能做个测试么?做一个同样的程序,封到类里边看看你那便有错么?顺便再问2个问题.
    程序里边没有提示了,就是".","::","->"的时候给的属性或者方法提示.不知道怎样重新让他自动提示.-----------------
    _variant_t uname;
    CString charname;
    charname=uname.bstrVal;
    m_nUuid.AddString(charname);
    另外程序将从数据库得到的结果转换成CString,本来想转换成char *,不知道怎样转,就转换成CString了.但是在combo box得到的数据后边有几个空格.如果想去掉,应该怎样去掉?
      

  7.   

    试了试,可以的哇app类中
    BOOL CAdoAccessApp::InitInstance()
    {
       …………
       AfxOleInit();
       …………
    }class ConnDB 中class ConnDB  
    {
    public:
    void ConnMod2();
    ConnDB();
    virtual ~ConnDB(); _ConnectionPtr pConnectionSQL;};void ConnDB::ConnMod2()
    {
    pConnectionSQL.CreateInstance(_uuidof(Connection));
         pConnectionSQL->Open("Provider=Microsoft.Jet.OLEDB.4.0; \
    Data Source=My.mdb","","",adModeUnknown);}dlg中BOOL CAdoAccessDlg::OnInitDialog()

        ……
             m_pRecordset.CreateInstance(_uuidof(Recordset));     ConnDB newClass;
    newClass.ConnMod2(); _variant_t RecordsAffected;
    m_pRecordset = newClass.pConnectionSQL ->Execute (_bstr_t("SELECT * FROM MyTable") , &RecordsAffected , adCmdUnknown);

        ……
    }