ACCESS+ADO学习记录一点点
来源:互联网 发布:二手车 知乎 编辑:程序博客网 时间:2024/06/07 01:44
最近做了个关于access数据库的小东西,网上说用ADO操作比较好,通用性更好,所以就往这个方向查资料了,网上资料挺多大体操作如下:
1、在MFC工程里的StdAfx.h头文件中加入
//引入支持ADO组件类型库#import "c:\program files\common files\system\ado\msado15.dll" \no_namespace \rename ("EOF", "adoEOF") \rename ("BOF","adoBOF")
其中c:\program files\common files\system\ado\msado15.dll没有的话去下一个,放哪都行,相应路径该对就可以。
2、在入口APP类的InitInstance()中加入
/*初始化com库*/ ::AfxOleInit();
3、操作数据库
所需变量
_ConnectionPtr m_pConnection; //数据库连接指针 _CommandPtr m_pCommand;//命令指针 _RecordsetPtr m_pRecordset; //记录集指针 _bstr_t ConnectionString;//数据库连接信息 _variant_t RecordsAffected; //操作完成后所影响的行数 _bstr_t sql; //SQL语句
连接数据库
/**
* 功能:连接数据库
* 参数1:dbPath--数据库路径(必填)
* 参数2:dbPwd---数据库密码(有则填,没有则不填)
*/
bool connectDB(CString dbPath,CString dbPwd="")
{
if (dbPwd.IsEmpty())//如果没密码
{
this->ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source="+dbPath;
}
else
{
this->ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source="+dbPath
+";Persist Security Info=False;Jet OLEDB:Database Password="+dbPwd;
}
HRESULT hr;
try
{
hr = this->m_pConnection.CreateInstance("ADODB.Connection");//创建Connection对象
if(SUCCEEDED(hr))
{
hr = m_pConnection->Open(this->ConnectionString,"","",adModeUnknown);//连接数据库
}
return true;
}catch(_com_error e)
{
return false;
}
return false;
}
语句查询,可简单使用
this->sql = "SELECT *FROMtable; this->m_pRecordset = this->m_pConnection->Execute(this->sql,&this->RecordsAffected,adCmdText);遍历结果集
_variant_t var; CString str; if(!this->m_pRecordset->adoBOF) {this->m_pRecordset->MoveFirst();while(!this->m_pRecordset->adoEOF){var = this->m_pRecordset->GetCollect("字段名");if(var.vt != VT_NULL)str = (LPCSTR)_bstr_t(var);this->m_pRecordset->MoveNext();} }
实践过程问题解决:
1、操作不同的数据库使用不同的访问引擎,我们知道高版本的兼容低版本,所以高版本的访问引擎可以访问低版本的数据库,这是可以的。
ACCESS2007------Provider=Microsoft.ACE.OLEDB.12.0
ACCESS2000------Provider=Microsoft.Jet.OLEDB.4.0
ACCESS97---------Provider=Microsoft.Jet.OLEDB.3.51
2、连接字串中的数据源路径记得在转意符如:Source=E:\MFC\test.mdb这样是错的,应写成Source=E:\\MFC\\test.mdb。
3、异常捕捉中使用
AfxMessageBox(e.ErrorMessage());
AfxMessageBox(e.Description());//用这个更详细
4、将int型数据转换成CString:index = (CString)i这样是不行的,一个是简单的变量类型,一个是类,无法直接转换,只能将int值以文本形式传给CString的某个属性,如 index.Format("%d",i);
5、在使用另存为对话框时,造成当前路径发生改变,由于数据库路径采用的是相对路径以致数据库连接老发生错误。解法:一是数据库采用绝对路径,实践可行,但现实中更多的是使用相对路径,不建议。二是在使用另存为对话框生效之前保存当前路径,之后在连接数据库之前用保存的值设置当前路径,没时间成功。三是另存为之中就有相关设置,这个最简单好用,记录如下;
//打开另存为对话框 ,需要包含 #include <Afxdlgs.h> CFileDialog dlg( FALSE, "xls", fileName, //文件名 OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT|OFN_NOCHANGEDIR,//OFN_NOCHANGEDIR便是不改变当前路径的设置项 "Excel 文件(*.xls)|*.xls||"); dlg.m_ofn.lpstrTitle = "Excel文件另存为";6、程序写好后,没有安装access数据库的电脑是用不了的,实际上我们没必要去下载office(如果你不用的话),可以只下载数据库引擎就行了如Microsoft.ACE.OLEDB.12.0并安装,下载地址如下:http://download.microsoft.com/download/7/0/3/703ffbcb-dc0c-4e19-b0da-1463960fdcdb/AccessDatabaseEngine.exe
- ACCESS+ADO学习记录一点点
- 学习记录,每天进步一点点
- ADO.net学习记录
- ADO.NET学习记录
- 每天学习一点点,每天记录一点点,android之路越走越远
- Access 操作学习记录
- access 学习记录
- 一点点记录
- 记录一点点。。
- ADO.net学习记录 (一)
- ADO.net学习记录 (一)
- ADO.net学习记录 (一)
- 关于ADO连接access数据库修改数据库记录的问题
- Access数据库的学习记录
- 每天记录一点点,积少成多
- 记录一点点001
- 记录一点点002
- 每天记录一点点
- qt学习之键盘事件( keyPressEvent)
- 【ASP.NET】——AdRotator控件
- 机试算法讲解: 第42题 广度优先搜索之我该如何倒可乐
- 8/1
- Android 自定义底部导航栏&消息显示
- ACCESS+ADO学习记录一点点
- onvif学习1-框架介绍
- setsockopt的作用
- 机试算法讲解: 第43题 递归之汉诺塔问题
- Bootstrap组件之媒体对象
- 身份证号生成器,对于开发的小伙伴非常有用
- JavaWeb-Tomcat链接数据库
- Ant on a Chessboard
- 敏捷软件开发模型--SCRUM