使用ADO ActiveX控件 ADO Data control 访问Access数据库。

MFC_USER 2012-02-27 09:47:49
我在我的对话框里加了个ADO Data control,用来访问Access数据库。我的做法如下。


前期已在StdAfx.h中添加
#include "COMDEF.h"
#import "c:\program files\common files\system\ado\msado15.dll" no_namespace rename("EOF","adoEOF")

已经通过其属性对话框和数据库建立了连接,
1、从中选择Microsoft Jet 4.0 OLE DB Provider选项,然后单击“下一步”按钮,出现“测试连接”对话框,单击,选择数据库a1.mdb->打开单击“测试连接”按钮,出现对话框“测试连接成功”,
2、单击“确定”按钮退出。再右键单击Adodc1控件,选择Properties属性命令,见Use Connection String下的最终连接字符串为:Provider = Microsoft.Jet.OLEDB.4.0;Data Source = D:\Backup\我的文档\a1.mdb;Persist Security Info = False。
3、单击RecordSource选项卡,将Command Type选择为1-adCmdText。在Command Text(SQL)文本框中输入:select *from a1,然后关闭属性对话框。
并通过在其控件上右击->建立类向导,自动导入了 C_Recordset C_Recordset CFields CField CAdodc类。并申明了
CAdodc m_myadoc;
C_Recordset m_myrest;
CFields m_Fields;
CField m_Field;

在OnInitDialog()
中执行
m_myadoc.SetRecordSource("SELECT * FROM a1");
m_myadoc.Refresh();
m_myrest = m_myadoc.GetRecordset();
// 这一行以上的代码都没有问题。
m_myrest.MoveFirst();//正常运行时,程序自动结束。
//调试时显示Unhandled exception in a.exe (MFC042D.DLL):OxC000005: Access Violation
//只要是和m_myrest有关的任何操作都会导致上述的问题,包括m_myrest.GetRecordCount(),m_myrest.MoveNext()等。

//工程已经完成很多了,就差一点了,但是卡在这实在调试不出来,希望高手能人指点一二。


...全文
251 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
MFC_USER 2012-03-02
  • 打赏
  • 举报
回复
申明:我所提及的竹叶青就是zyq5945。
MFC_USER 2012-03-02
  • 打赏
  • 举报
回复
结贴啦,结贴拉。最后用竹叶青推荐的花旗公司老外写的类CADODatabase等解决了问题。很感谢竹叶青同志的热情回答。虽然最后还是没弄清C_Recordset怎么用,但是现在已经可以用ado访问数据库了,起始ado类中的command类挺好的,还能执行sql语句,我感觉我现在好强大啊。哈哈。貌似竹叶青的ado类不能访问unicod类型的excel。再次感谢竹叶青,比版主还版主。
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 mfc_user 的回复:]

引用 4 楼 zyq5945 的回复:
MoveFirst之前需要先判断EOF或者BOF,记录集中没有记录就调用MoveFirst会有异常的。

C/C++ code
if(!m_pRecordset->BOF)
m_pRecordset->MoveFirst();
else
{
AfxMessageBox("表内数据为空");
retu……


没用,C_Record类没有BOF属性。
[/Quote]
关于这个属性,在import的时候使用
#import "xxxx\\msado15.dll" no_namespace  rename("EOF","adoEOF") rename("BOF","adoBOF")

在使用的时候
if(!m_pRecordset->adoBOF)  
m_pRecordset->MoveFirst();
MFC_USER 2012-03-01
  • 打赏
  • 举报
回复
还是不对。m_myadoc.adoBOF就编译通不过。后来用竹叶青推荐的花旗公司老外写的类,直接通过ado类访问excel 也不对,提示什么isam未找到。。。
啊。。。折腾这么多天未果。。。郁闷。
zyq5945 2012-02-29
  • 打赏
  • 举报
回复
m_myrest是不是NULL值?
MFC_USER 2012-02-29
  • 打赏
  • 举报
回复
m_myrest是C_Recordset的对象,在使用前用
m_myadoc.SetRecordSource("SELECT * FROM a1");
m_myadoc.Refresh();
m_myrest = m_myadoc.GetRecordset();
获得指向标a1的数据集。
MFC_USER 2012-02-28
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 zyq5945 的回复:]
MoveFirst之前需要先判断EOF或者BOF,记录集中没有记录就调用MoveFirst会有异常的。

C/C++ code
if(!m_pRecordset->BOF)
m_pRecordset->MoveFirst();
else
{
AfxMessageBox("表内数据为空");
retu……
[/Quote]

没用,C_Record类没有BOF属性。只有getbof()方法。而且一旦m_myrest调用任何方法,程序马上出错,自动结束,调试就提示Unhandled exception in a.exe (MFC042D.DLL):OxC000005: Access Violation。
这个C_Record类到底怎么用啊。有这方面资料的高手请指点一二。急死我啦。。。。
FKunLam 2012-02-27
  • 打赏
  • 举报
回复
工程已经完成很多了,就差一点了,但是卡在这实在调试不出来
zyq5945 2012-02-27
  • 打赏
  • 举报
回复
MoveFirst之前需要先判断EOF或者BOF,记录集中没有记录就调用MoveFirst会有异常的。
if(!m_pRecordset->BOF)  
m_pRecordset->MoveFirst();
else
{
AfxMessageBox("表内数据为空");
return;
}
MFC_USER 2012-02-27
  • 打赏
  • 举报
回复
而且异常处理也没有被出发。没有MessageBox被抛出来。
MFC_USER 2012-02-27
  • 打赏
  • 举报
回复
我加过,现象是一样的。
m_myadoc.SetRecordSource("SELECT * FROM a1");
m_myadoc.Refresh();
m_myrest = m_myadoc.GetRecordset();
try
{

// 这一行以上的代码都没有问题。
m_myrest.MoveFirst();}
catch (_com_error& e)
{
CString strMsg;
strMsg.Format(_T("错误描述:%s\n错误消息%s",
(LPCTSTR)e.Description(),
(LPCTSTR)e.ErrorMessage());
AfxMessageBox(strMsg);
}

现象还是一样的。
zyq5945 2012-02-27
  • 打赏
  • 举报
回复
加异常捕获看是什么错误
try
{
//你的ADO代码
}
catch (_com_error& e)
{
CString strMsg;
strMsg.Format(_T("错误描述:%s\n错误消息%s",
(LPCTSTR)e.Description(),
(LPCTSTR)e.ErrorMessage());
AfxMessageBox(strMsg);
}

4,011

社区成员

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

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