正文

baidu记录VC访问ACCESS2007-08-27 10:40:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/sword2008/28876.html

分享到:

VC调用ACCESS数据库,高分求助 悬赏分:100 - 解决时间:2006-12-16 13:55 刚开始学习VC,学编程刚入门,很多都不懂,就下载了一个源代码来修改,源代码经简单调试后可以运行,可以调用ACCESS数据库,但是数据库是97版的。我想把数据库的字段增多,改为我希望的样子,也就是添加了10个名目。只好转换为2003后修改再改回97保存。VC的程序里面,所有原来涉及的字段我都修改了,并在对话框里也加了TEXT,命名为IDC-TEL、IDC-FAX等,现在调试完成后,可执行文件也生成了,主程序有时候又可以运行,但是读取MDB就弹出严重错误,然后只能关闭。有时候又不能运行,出错“DEBUG ASSERTION FAILED!”和终止忽略调试,我该怎么办呢? 有高手愿意指导,或者帮我调就感谢了 提问者: 诸葛亮弹钢琴 - 见习魔法师 二级 最佳答案 1:针对问题解决问题。 将库从XP转到2003,是没有问题的,在转回去也可以。但是从97转到2003就有问题了,起初我也遇到类似的问题。你说的是出错现象,我们无法猜想出你的程序 哪里有问题,出现bug。建议你在对数据库操作的时候都加上断言(assert), 参考资料 http://msdn.microsoft.com/library/chs/default.asp?url=/library/CHS/cpguide/html/cpconassert.asp 或者在对数据库操作的时候都加上错误处理(try{...}catch(...){...}),这样就可以知道错误出现在哪里,例如: BOOL CODBCHandle::SetConnection(CString strDSN, CString strUID, CString strPWD) { CString str; str.Format("DSN=%s;UID=%s;PWD=%s", strDSN, strUID, strPWD); BOOL bStatus = FALSE; //数据库是否成功打开 m_database.SetLoginTimeout(3); //连接超时属性 try { if(!m_database.IsOpen()) { bStatus = m_database.OpenEx(str, CDatabase::openReadOnly | CDatabase::noOdbcDialog); if(bStatus) AfxMessageBox("连接成功."); } } catch(CMemoryException *pEx) //处理内存异常 { pEx->ReportError(); return FALSE; } catch(CDBException *pDBEx) //处理数据库异常 { pDBEx->ReportError(); TRACE("RetCode:%d strError:[%s] strState:[%s]\n", pDBEx->m_nRetCode, pDBEx->m_strError, pDBEx->m_strStateNativeOrigin); return FALSE; } return TRUE; } try{...}catch(...){...}参考资料 http://msdn.microsoft.com/library/chs/default.asp?url=/library/CHS/csref/html/vclrfthetrycatchstatement.asp 以上是追踪错误处理。但是不知道你的程序是什么样的,所以不知道怎么处理。 2:方法 用vc访问Access数据库,就向上面朋友说的那样就可以。操作Access可以不通过数据源,直接对其访问。 访问数据库的模型一般为ODBC,DAO,ADO等。上面的朋友就用的是ADO,你可以看看,他在开始时,在程序里引进了msado15.dll 动态库。这里面封装了ADO的对象、 方法和属性等等。然后初始化COM库,再用_ConnectionPtr对象(它就是ADO的3个对象之一)进行连接数据库,_RecordsetPtr对象是记录集对象,我们对库的操作 大多就是对它的操作,它里面有好多函数,你可以查MSDN。 我上面的代码是用ODBC方式连接,ODBC方式是最地层的,也是通用的模式。可以说他支持任何库。关于ODBC,微软提供了CDatabase类和CRecordset类,使用方法 和以上差不多。有什么问题再聊。 建议以后把问题说的清楚一些,要不我们帮不上你什么忙了。 回答者:VC程序员 - 试用期 一级 11-2 13:51 对最佳答案的评论 在VC中利用ADO技术连接数据库时,想从一条记录中读取个字段的值,我只知道读取字段类型为文本时是这样的, _variant_t var; CString bl; var=m_Rct->GetCollect("字段名"); if(var.vt!=VT_NULL) bl=(LPCSTR)_bstr_t(var); 那么,如果字段类型为整形或着float型,或者是日期性等其他类型时,怎样用这种方法读取?希望哪位高手能指点一下,本人将不胜感激! 评论者: xyzdhl - 试用期 一级 其他回答 共 1 条 1.建立基于对话框的工程test 2.在stdafx.h中导入msado15.dll #import "C:\Program Files\Common Files\System\ado\msado15.dll" no_namespace rename("EOF", "adoEOF") #endif // _AFX_NO_AFXCMN_SUPPORT 可以换成另一种方式调用: #include <comdef.h> #include "msado15.tlh" 要在工程目录下面加上msado15.tlh,msado15.tli 3.初始话COM,在test.cpp文件中 BOOL CTestApp::InitInstance() { AfxOleInit();//初始话 AfxEnableControlContainer(); 4.进入按钮事件. void CTestDlg::OnButton4() { // TODO: Add your control notification handler code here _ConnectionPtr connection; _RecordsetPtr recordset; connection.CreateInstance( __uuidof(Connection)); recordset.CreateInstance(__uuidof(Recordset)); int ID = 0; connection->Open("Provider=Microsoft.JET.OLEDB.4.0;Data Source=dictionary.mdb","","",adModeUnknown); //.mdb文件放到当前执行路径下(和DEBUG文件夹同目录) recordset->Open("SELECT * FROM word",_variant_t((IDispatch *)connection,true),adOpenStatic,adLockOptimistic,adCmdText); //选择WORD表中的所有记录,黑体字的如果有问题可以改这个试试SELECT * FROM [word while (!(recordset->adoEOF)) { int id = recordset->GetCollect("ID").intVal;//文件中存在的ID字段 if ( id > ID) ID = id; recordset->MoveNext(); } recordset->Close(); connection->Close(); }

阅读(4459) | 评论(0)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

暂无评论
您需要登录后才能评论,请 登录 或者 注册