使用VC連接Access數據庫的兩種方法

 以前的時候用VC寫了兩種連接Access數據庫的方法,爲了方便以後查找把這兩種方法做一下簡單的介紹。Windows平臺的數據接口標準有ODBC、OLE DB、ADO和Borland的BDE接口,ODBC(Open DataBase Connectivity)只能用於訪問關係型數據庫,爲了訪問非關係型數據微軟設計了OLE DB接口並在此基礎上推出了ADO(ActiveX Data Objects)。本文介紹的方法是ODBC和ADO。

一、使用ODBC接口,在這裏我們使用MFC的CDatabase類,該類是對SQLConnect等ODBC的API的封裝。需要包含afxdb.h

BOOL ODBCConnect(CString strDBFile)
{
    CString strConnect;
    strConnect.Format(_T("ODBC;DRIVER={MICROSOFT ACCESS DRIVER (*.mdb)};UID=sa;PWD=;DBQ=%s"), strDBFile);

    CDatabase db;
    if(db.Open(NULL, FALSE, FALSE, strConnect))
    {
        //連接數據庫成功
        CRecordset rs(&db);
        CString strSql;
        strSql = _T("select * from info");                                //SQL語句
        rs.Open(AFX_DB_USE_DEFAULT_TYPE, strSql);                        //執行Sql語句(可添加 刪除 查詢等)
        if(rs.IsOpen())
        {
            CDBVariant variant;
            rs.MoveFirst();
            while(!rs.IsEOF())
            {
                //讀取記錄
                rs.GetFieldValue(_T("姓名"), variant);

                rs.MoveNext();
            }
        }

        db.Close();
        return TRUE;
    }

    return FALSE;
}


 

二、使用ADO連接數據庫,因爲要使用COM,需要初始化(CoInitialize).然後就可以生成接口的對象操作,代碼如下:

#import "C:Program Files/Common Files/System/ado/msado15.dll" rename("EOF", "adoEOF")    //生成C++類,改變EOF函數的名稱
using namespace ADODB;

BOOL ADOConnect(CString strDBFile)
{
    _ConnectionPtr pConnection;
    if(pConnection.CreateInstance(__uuidof(Connection)) != S_OK)
    {
        return FALSE;
    }

    CString strConnect;
    strConnect.Format(_T("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=%s"), strDBFile);
    if(pConnection->Open(_bstr_t(strConnect), "", "", adModeUnknown) == S_OK)
    {
        //連接數據庫成功
        _RecordsetPtr pRecordset;
        if(pRecordset.CreateInstance(__uuidof(Recordset)) != S_OK)
        {
            pConnection->Close();
            return FALSE;
        }

        CString strSql;
        strSql = _T("select * from info");
        HRESULT hr = pRecordset->Open(_bstr_t(strSql), _variant_t((IDispatch*)pConnection, TRUE), adOpenUnspecified, adLockUnspecified, adCmdUnknown);
        if(hr != S_OK)
        {
            pConnection->Close();
            return FALSE;
        }
        _variant_t vt;

        pRecordset->MoveFirst();
        while(!pRecordset->adoEOF)
        {
            vt = pRecordset->Fields->GetItem("姓名")->Value;

            pRecordset->MoveNext();
        }

        pConnection->Close();
        return TRUE;
    }

    return FALSE;
}


 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章