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中利用ADO技术连接数据库时,想从一条记录中读取个字段的值,我只知道读取字段类型为文本时是这样的, _variant_t var; CString bl; var=m_Rct->GetCollect("字段名"); if(var.vt!=VT_NULL) bl=(LPCSTR)_bstr_t(var); 那么,如果字段类型为整形或着float型,或者是日期性等其他类型时,怎样用这种方法读取?希望哪位高手能指点一下,本人将不胜感激!
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();
}
阅读(4310) | 评论(0)
版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!
评论