ado.cppado::ado()
{
   AfxOleInit();//初始化com
   m_connection=NULL;
   strConnection = _T("Provider=SQLOLEDB.1;Data Source=MFC;Initial Catalog=mdb"); //数据连接字符串
   sqluid="sa";
   sqlpsw="123456";
   m_connection.CreateInstance(__uuidof(Connection)); //创建connection对象
   openConn();
}ado::~ado()
{
closeConn();
}_RecordsetPtr ado::getRecordset(_bstr_t sql)
{
    _ConnectionPtr conn=getConn();
_RecordsetPtr m_recordset;
m_recordset.CreateInstance("ADODB.Recordset");  //创建Recordset对象的实例
m_recordset->Open(sql,_variant_t((IDispatch*)conn,true),adOpenStatic,adLockOptimistic,adCmdText);
return m_recordset;
}_ConnectionPtr ado::getConn()
{
if(isOpen()==FALSE)
{
openConn();
}
return m_connection;
}
void ado::openConn()
{
try
{
   m_connection->Open(strConnection,sqluid,sqlpsw,adModeUnknown);
}
catch (_com_error &e)
{
   AfxMessageBox("数据库连接失败,请检查数据库设置");
   ExitProcess(0);
}
}BOOL ado::isOpen()
{
   if(m_connection->GetState())
   {
      return TRUE;
   }
   else
   {
  return FALSE;
   }
}void ado::closeConn()
{
    if(isOpen())
    m_connection->Close();
}BOOL ado::executeSql(LPCTSTR sql)
{
_variant_t RecordsAffected;
_ConnectionPtr conn=getConn();
ASSERT(conn != NULL);
ASSERT(strcmp(sql, _T("")) != 0);
try
{
conn->CursorLocation = adUseClient;
conn->Execute(sql,&RecordsAffected,adCmdText);
return TRUE;
}
catch (_com_error &e)
{
AfxMessageBox("执行失败");
return FALSE;
}}
adminlist.cpp中BOOL adminlist::OnInitDialog()        ---->这里执行正常
{
CDialog::OnInitDialog();
        sqlText="select * from admin"; show(sqlText);
return TRUE;
}void adminlist::OnChangeAdminNameSelect()     ---->这里执行错误了,并且还是那个运行时错误,兄弟们帮看看错在哪里
{
UpdateData(true);
CString SQL;
SQL.Format("select * from admin where adminname='%s'",m_select);
m_list1.DeleteAllItems();    //清空列表控件
// SQL="select * from admin where adminname='luocheng'";
AfxMessageBox(SQL);
show(_bstr_t(SQL));          //重新载入信息
}void adminlist::show(_bstr_t sql)
{//读取数据
    ado adoo;
m_recordset=adoo.getRecordset(sql);
int i;
i=0;
while(!m_recordset->adoEOF)
{
vid=m_recordset->GetCollect("id");
vUsername = m_recordset->GetCollect("adminname");            //用户名
vpsw = m_recordset->GetCollect("password");                  //密码
        vpower=m_recordset->GetCollect("power");                     //角色
vlastlogintime=m_recordset->GetCollect("lastlogintime");     //最后登录时间
        vlastloginIP=m_recordset->GetCollect("lastloginIP");         //最后登录ip
     m_list1.InsertItem(i,vid);       //插入第一个数据,即第0条数据。先插入,然后在修改其他的信息。
         m_list1.SetItemText(i,1,vUsername);     //修改第0条数据的其他信息。
         m_list1.SetItemText(i,2,vpsw);
         m_list1.SetItemText(i,3,vpower);
 m_list1.SetItemText(i,4,vlastlogintime);
 m_list1.SetItemText(i,5,vlastloginIP);
 i=i+1;
m_recordset->MoveNext();///移到下一条记录
}m_recordset->Close();  //关闭数据集
m_recordset=NULL;
}

解决方案 »

  1.   

    void adminlist::OnChangeAdminNameSelect()    ---->这里执行错误了,并且还是那个运行时错误,兄弟们帮看看错在哪里 
    ====
    运行错误提示是什么啊?
    这个函数你调试了吗?错误点在哪一句啊?
      

  2.   

    回复2楼的,OnChangeAdminNameSelect() 也没错,单独执行,可以运行的
      

  3.   

    就是说debug下调试时没有问题,直接运行就错误么?
    那在debug下直接运行的话,如果出现错误,会有界面弹出,选择“调试”看看断点在哪里
      

  4.   

    错误提示:MIcrosoft Visual C++ Debug Library
    dubug Assertion Faoled!
    program: .......code.exe终止  重试  忽略 
      

  5.   

    点击  重试
    然后在菜单那里 Debug -〉break。
    就可以看内部错之前都执行过什么东西。
      

  6.   

    组建时,是通过的,void adminlist::OnChangeAdminNameSelect()时出错了,估计99%出在ado.cpp里面,单独执行一个都是正常的,先执行一次show(_bstr_t sql)正常,再执行就错误了 
      

  7.   

    你可以在show函数中增加TRACE语句,就可以在debug窗口中看到具体执行到哪条语句。同时也可以在getRecordset函数中增加TRACE,就可以看到崩溃时具体的运行状况了。
      

  8.   

    getRecordset函数中增加try...catch...看看
      

  9.   

    报oleinit.cpp
    line 54错误
      

  10.   

    本帖最后由 happyparrot 于 2009-12-28 18:39:18 编辑
      

  11.   

    13楼的,就是这个问题,AfxOleInit不是能自动创建和释放的吗,晕啦,谢谢了