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


0 0
原创粉丝点击