MFC下用ADO链接Access添加变量运行有一定情况出错

非权威装家 2013-08-24 01:28:56
本人使用ADO连接access在list上显示出来,由于只用到读这一功能,所添加的也比较简单
自己写了一个OnInitADOConn()和ExitConnect()函数
然后在按钮函数中进行初始化(因为要实现切换数据库)
运行正常。
可是经常会出现在对话框类中添加变量,比如double asd;那么运行就会报错,而有时候又不会出错,而有时候呢是运行不出错,退出程序的时候会出错。
我的代码如下
::CoInitialize(NULL);//这个是在App的InitInstance()中添加
_ConnectionPtr m_pConnection;//定义在对话框类中
_RecordsetPtr m_pRecordset;
void CXXXDlg::ExitConnect()
{
if(m_pRecordset!=NULL)
m_pRecordset->Close();
m_pConnection->Close();
}
void CParkDlg::OnInitADOConn()
{
try
{
//创建连接对象实例
m_pConnection.CreateInstance("ADODB.Connection");
//设置连接字符串
CString strConnect="DRIVER={Microsoft Access Driver (*.mdb)};\
uid=;pwd=;DBQ=test.mdb;";
//使用Open方法连接数据库
m_pConnection->Open((_bstr_t)strConnect,"","",adModeUnknown);
}
catch(_com_error e)
{
AfxMessageBox("连接数据失败,请检查数据库路径是否正确!");
}
}
//函数初始化是这样初始化的
m_Grid.SetExtendedStyle(LVS_EX_FLATSB
|LVS_EX_FULLROWSELECT
|LVS_EX_HEADERDRAGDROP
|LVS_EX_ONECLICKACTIVATE
|LVS_EX_GRIDLINES);
m_Grid.InsertColumn(0,"员工编号",LVCFMT_LEFT,80,0);
m_Grid.InsertColumn(1,"员工姓名",LVCFMT_LEFT,80,1);
m_Grid.InsertColumn(2,"所属部门",LVCFMT_LEFT,80,2);
m_Grid.InsertColumn(3,"基本工资",LVCFMT_LEFT,80,3);
//我把以上的添加到了初始化对话框函数中,以下的添加到了按钮函数中,利用组合框生成bstrSQL的语句实现动态切换数据库,在切换之前运行m_Grid.DeleteAllItems();这个函数,使得list清空。
//连接数据库
OnInitADOConn();
//设置查询字符串
_bstr_t bstrSQL = "select * from employees order by 员工编号 desc";
//创建记录集指针对象实例
m_pRecordset.CreateInstance(__uuidof(Recordset));//该句也可以使用
// m_pRecordset.CreateInstance(“ADODB.Recordset”);代替
//打开记录集
m_pRecordset->Open(bstrSQL,m_pConnection.GetInterfacePtr(),adOpenDynamic,
adLockOptimistic,adCmdText);
while(!m_pRecordset->adoEOF)
{
m_Grid.InsertItem(0,"");
m_Grid.SetItemText(0,0,(char*)(_bstr_t)m_pRecordset->GetCollect("员工编号"));
m_Grid.SetItemText(0,1,(char*)(_bstr_t)m_pRecordset->GetCollect("员工姓名"));
m_Grid.SetItemText(0,2,(char*)(_bstr_t)m_pRecordset->GetCollect("所属部门"));
m_Grid.SetItemText(0,3,(char*)(_bstr_t)m_pRecordset->GetCollect("基本工资"));
//将记录集指针移动到下一条记录
m_pRecordset->MoveNext();
}
//断开数据库连接
ExitConnect();


现在我只要一添加一个变量,无论是什么类型的还是控件类型的变量,退出就会报错,运行开始也有可能报错。
基础类应用程序已停止工作 添加变量
请问我该如何解决?
...全文
79 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
worldy 2013-08-24
  • 打赏
  • 举报
回复
CoInitilize/CoUninitialize不需要在函数出入里加,只要程序启动和结束的时候加就可以
非权威装家 2013-08-24
  • 打赏
  • 举报
回复
引用 1 楼 worldy 的回复:
::CoInitialize(NULL);//这个是在App的InitInstance()中添加 _ConnectionPtr m_pConnection;//定义在对话框类中 _RecordsetPtr m_pRecordset; void CXXXDlg::ExitConnect() { if(m_pRecordset!=NULL) m_pRecordset->Close(); m_pConnection->Close(); }//这个有问题,在close后,应设置m_pRecordset=NULL,m_pConnection=NULLvoid CParkDlg::OnInitADOConn() { try { //创建连接对象实例 m_pConnection.CreateInstance("ADODB.Connection"); //设置连接字符串 CString strConnect="DRIVER={Microsoft Access Driver (*.mdb)};\ uid=;pwd=;DBQ=test.mdb;"; //使用Open方法连接数据库 m_pConnection->Open((_bstr_t)strConnect,"","",adModeUnknown); } catch(_com_error e) { AfxMessageBox("连接数据失败,请检查数据库路径是否正确!"); } } //函数初始化是这样初始化的 m_Grid.SetExtendedStyle(LVS_EX_FLATSB |LVS_EX_FULLROWSELECT |LVS_EX_HEADERDRAGDROP |LVS_EX_ONECLICKACTIVATE |LVS_EX_GRIDLINES); m_Grid.InsertColumn(0,"员工编号",LVCFMT_LEFT,80,0); m_Grid.InsertColumn(1,"员工姓名",LVCFMT_LEFT,80,1); m_Grid.InsertColumn(2,"所属部门",LVCFMT_LEFT,80,2); m_Grid.InsertColumn(3,"基本工资",LVCFMT_LEFT,80,3); //我把以上的添加到了初始化对话框函数中,以下的添加到了按钮函数中,利用组合框生成bstrSQL的语句实现动态切换数据库,在切换之前运行m_Grid.DeleteAllItems();这个函数,使得list清空。 //连接数据库 OnInitADOConn(); //设置查询字符串 _bstr_t bstrSQL = "select * from employees order by 员工编号 desc"; //创建记录集指针对象实例 m_pRecordset.CreateInstance(__uuidof(Recordset));//该句也可以使用 // m_pRecordset.CreateInstance(“ADODB.Recordset”);代替 //打开记录集 m_pRecordset->Open(bstrSQL,m_pConnection.GetInterfacePtr(),adOpenDynamic, adLockOptimistic,adCmdText); while(!m_pRecordset->adoEOF) { m_Grid.InsertItem(0,""); m_Grid.SetItemText(0,0,(char*)(_bstr_t)m_pRecordset->GetCollect("员工编号")); m_Grid.SetItemText(0,1,(char*)(_bstr_t)m_pRecordset->GetCollect("员工姓名")); m_Grid.SetItemText(0,2,(char*)(_bstr_t)m_pRecordset->GetCollect("所属部门")); m_Grid.SetItemText(0,3,(char*)(_bstr_t)m_pRecordset->GetCollect("基本工资")); //将记录集指针移动到下一条记录 m_pRecordset->MoveNext(); } //断开数据库连接 ExitConnect();
其实我已经解决了,原因是在return之前忘记释放了,要添加::CoUninitialize(); 至于你的方法,我也要加入,使程序更加稳定。
worldy 2013-08-24
  • 打赏
  • 举报
回复
::CoInitialize(NULL);//这个是在App的InitInstance()中添加 _ConnectionPtr m_pConnection;//定义在对话框类中 _RecordsetPtr m_pRecordset; void CXXXDlg::ExitConnect() { if(m_pRecordset!=NULL) m_pRecordset->Close(); m_pConnection->Close(); }//这个有问题,在close后,应设置m_pRecordset=NULL,m_pConnection=NULLvoid CParkDlg::OnInitADOConn() { try { //创建连接对象实例 m_pConnection.CreateInstance("ADODB.Connection"); //设置连接字符串 CString strConnect="DRIVER={Microsoft Access Driver (*.mdb)};\ uid=;pwd=;DBQ=test.mdb;"; //使用Open方法连接数据库 m_pConnection->Open((_bstr_t)strConnect,"","",adModeUnknown); } catch(_com_error e) { AfxMessageBox("连接数据失败,请检查数据库路径是否正确!"); } } //函数初始化是这样初始化的 m_Grid.SetExtendedStyle(LVS_EX_FLATSB |LVS_EX_FULLROWSELECT |LVS_EX_HEADERDRAGDROP |LVS_EX_ONECLICKACTIVATE |LVS_EX_GRIDLINES); m_Grid.InsertColumn(0,"员工编号",LVCFMT_LEFT,80,0); m_Grid.InsertColumn(1,"员工姓名",LVCFMT_LEFT,80,1); m_Grid.InsertColumn(2,"所属部门",LVCFMT_LEFT,80,2); m_Grid.InsertColumn(3,"基本工资",LVCFMT_LEFT,80,3); //我把以上的添加到了初始化对话框函数中,以下的添加到了按钮函数中,利用组合框生成bstrSQL的语句实现动态切换数据库,在切换之前运行m_Grid.DeleteAllItems();这个函数,使得list清空。 //连接数据库 OnInitADOConn(); //设置查询字符串 _bstr_t bstrSQL = "select * from employees order by 员工编号 desc"; //创建记录集指针对象实例 m_pRecordset.CreateInstance(__uuidof(Recordset));//该句也可以使用 // m_pRecordset.CreateInstance(“ADODB.Recordset”);代替 //打开记录集 m_pRecordset->Open(bstrSQL,m_pConnection.GetInterfacePtr(),adOpenDynamic, adLockOptimistic,adCmdText); while(!m_pRecordset->adoEOF) { m_Grid.InsertItem(0,""); m_Grid.SetItemText(0,0,(char*)(_bstr_t)m_pRecordset->GetCollect("员工编号")); m_Grid.SetItemText(0,1,(char*)(_bstr_t)m_pRecordset->GetCollect("员工姓名")); m_Grid.SetItemText(0,2,(char*)(_bstr_t)m_pRecordset->GetCollect("所属部门")); m_Grid.SetItemText(0,3,(char*)(_bstr_t)m_pRecordset->GetCollect("基本工资")); //将记录集指针移动到下一条记录 m_pRecordset->MoveNext(); } //断开数据库连接 ExitConnect();

4,011

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 数据库
社区管理员
  • 数据库
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧