接口开发#5:使用ADO连接Access数据库

八 使用ADO连接数据库

分为四步梳理,本项目使用的是Access 2003数据库(.mde),其他数据库使用方式相仿不再列举:

  1. 导入msado15.dll,一般位于C:\Program Files\Common Files\system\ado,使用时可以选择不使用命名空间,建议重命名EOF和BOF防止ADO库与项目发生冲突,此外,使用高版本的msado15.dll可能会导致应用程序在低版本的环境中无法正常连接数据库,因此我直接拷了xp的msado15.dll过来导入编译的;
#import "msado15.dll" no_namespace rename("EOF","adoEOF")
  1. 因ADO属于COM组件,注意使用前初始化COM环境,使用后释放;
CoInitialize(NULL);
// ...
CoUninitialize(); 
  1. 创建一个连接对象(_ConnectionPtr),然后调用其Open方法打开数据库,主要代码如下;
_ConnectionPtr ConnAccess = NULL;
// ...
HRESULT hr = ConnAccess.CreateInstance(_uuidof(Connection));
// ...
sprintf(chFileName,g_chRunPath);// 软件运行路径
strcat(chFileName,"\\此处为Access2003数据库文件名.mde");
sprintf(chConnStr,"Provider=Microsoft.Jet.OLEDB.4.0;Jet OLEDB:Database Password=%s;Data Source=%s","xxx",chFileName);
HRESULT hr = ConnAccess->Open(chConnStr,L"",L"",-1);    
  1. 使用连接对象的Execute方法执行SQL语句,使用记录集对象(_RecordsetPtr)存储执行结果信息;
_RecordsetPtr   rstmp = NULL;
// ...
// 以下为ADO查询接口函数部分代码
        try
        {
            if (pOutArr)// 此处为接口函数输入参数,空类型指针,存储执行结果或为NULL
            {
                rstmp = ConnAccess->Execute((_bstr_t)strSQL,NULL,0);
                *(_RecordsetPtr*)pOutArr = rstmp;   
            }
            else
            {
                ConnAccess->Execute((_bstr_t)strSQL,NULL,0);
            }
        }
        catch (...)
        {
            CString StrTemp = "";
            StrTemp.Format("错误SQL语句:%s",strSQL);
            // 打印日志
        }   
  1. 关于读取记录集对象内容的方法,对于COM提供了类型转换的变量类型可以直接使用,但其他变量类型就需要用到_variant_t来自行转换了,可以参照以下方式读取对应列的值。
while (!pRecord->adoEOF)
{
    // 常见变量类型(此处为long)
    nFID = pRecord->Fields->GetItem(L"编号")->Value;
    // 需自行转换类型(此处为CString)
    varfield = pRecord->Fields->GetItem(L"说明")->Value;// varfield为_variant_t类型
    if (varfield.vt != VT_NULL)
    {   
        tmpStr  = varfield.bstrVal;// 例如CString类型tmpStr
        // ... 
    }
    // 其他的不再赘述
    pRecord->MoveNext();// 下一条记录
}

你可能感兴趣的:(接口开发#5:使用ADO连接Access数据库)