1. 程式人生 > >VC6.0 通過ado連線access資料庫

VC6.0 通過ado連線access資料庫

  我們可以使用AfxOleInit()來初始化COM庫,這項工作通常在CWinApp::InitInstance()的過載函式中完成,請看如下程式碼::
public:
_ConnectionPtr m_pConnection;
BOOL CAdoTestApp::InitInstance()
{
// 初始化COM,建立ADO連線等操作
AfxOleInit();

//建立連結
m_pConnection.CreateInstance(__uuidof(Connection));
try
{
// 開啟本地Access庫Demo.mdb
m_pConnection->Open(“Provider=Microsoft.Jet.OLEDB.4.0;Data Source=telbook.mdb”,”“,”“,adModeUnknown);
}
catch(_com_error e)
{
AfxMessageBox(“資料庫連線失敗,確認資料庫telbook.mdb是否在當前路徑下!”);
return FALSE;
}
return TRUE;
}

2、用#import指令引入ADO型別庫

  為了引入ADO型別庫,需要在專案的stdafx.h檔案中加入如下語句:
、#import “c:\program files\common files\system\ado\msado15.dll” \
no_namespace \rename (“EOF”, “adoEOF”)
這一語句有何作用呢?其最終作用同我們已經十分熟悉的#include類似,編譯的時候系統會為我們生成msado15.tlh,ado15.tli兩個C++標頭檔案來定義ADO庫。
  需要讀者朋友注意的是:您的開發環境中msado15.dll不一定在這個目錄下,請按實際情況修改;在編譯的時候可能會出現如下警告,對此微軟在MSDN中作了說明,並建議我們不要理會這個警告:msado15.tlh(405) : warning C4146: unary minus operator applied to unsigned type, result still unsigned。
3、建立Connection物件並連線資料庫
第1部中的AfxOleInit();以後的程式碼為建立連結程式碼。

 4、執行SQL命令並取得結果記錄集
4、執行SQL命令並取得結果記錄集

  為了取得結果記錄集,我們定義一個指向Recordset物件的指標:_RecordsetPtr m_pRecordset;

  併為其建立Recordset物件的例項: m_pRecordset.CreateInstance(“ADODB.Recordset”),SQL命令的執行可以採用多種形式,下面我們一一進行闡述。

  (1)利用Connection物件的Execute方法執行SQL命令

  Execute()方法的原型如下所示:
_RecordsetPtr Connection15::Execute ( _bstr_t CommandText, VARIANT * RecordsAffected, long Options )

  其中CommandText是命令字串,通常是SQL命令。引數RecordsAffected是操作完成後所影響的行數, 引數Options表示CommandText中內容的型別,Options可以取如下值之一:adCmdText表明CommandText是文字命令;adCmdTable表明CommandText是一個表名;adCmdProc表明CommandText是一個儲存過程;adCmdUnknown表明CommandText內容未知。Execute()函式執行完後返回一個指向記錄集的指標,下面我們給出具體程式碼並作說明:
_variant_t RecordsAffected;
///執行SQL命令:CREATE TABLE建立表格users,users包含四個欄位:整形ID,字串username,整形old,日期型birthday
m_pConnection->Execute(“CREATE TABLE users(ID INTEGER,username
TEXT,old INTEGER,birthday DATETIME)”,&RecordsAffected,adCmdText);
///往表格裡面新增記錄
m_pConnection->Execute(“INSERT INTO users(ID,username,old,birthday)
VALUES (1, ‘Washington’,25,’1970/1/1’)”,&RecordsAffected,adCmdText);
///將所有記錄old欄位的值加一
m_pConnection->Execute(“UPDATE users SET old = old+1”,&RecordsAffected,adCmdText);
///執行SQL統計命令得到包含記錄條數的記錄集
m_pRecordset = m_pConnection->Execute(“SELECT COUNT(*) FROM
users”,&RecordsAffected,adCmdText);
_variant_t vIndex = (long)0;
_variant_t vCount = m_pRecordset->GetCollect(vIndex);///取得第一個欄位的值放入vCount變數
m_pRecordset->Close();///關閉記錄集
CString message;
message.Format(“共有%d條記錄”,vCount.lVal);
AfxMessageBox(message);///顯示當前記錄條數

  (2)利用Command物件來執行SQL命令
_CommandPtr m_pCommand;
m_pCommand.CreateInstance(“ADODB.Command”);
_variant_t vNULL;
vNULL.vt = VT_ERROR;
vNULL.scode = DISP_E_PARAMNOTFOUND;///定義為無引數
m_pCommand->ActiveConnection = m_pConnection;///非常關鍵的一句,將建立的連線賦值給它
m_pCommand->CommandText = “SELECT * FROM users”;///命令字串
m_pRecordset = m_pCommand->Execute(&vNULL,&vNULL,adCmdText);
//執行命令取得記錄集

  在這段程式碼中我們只是用Command物件來執行了SELECT查詢語句,Command物件在進行儲存過程的呼叫中能真正體現它的作用。下次我們將詳細介紹。

  (3)直接用Recordset物件進行查詢取得記錄集,例如:
m_pRecordset->Open(“SELECT * FROM users”,_variant_t((IDispatch *)m_pConnection,true),
adOpenStatic,adLockOptimistic,adCmdText);

  Open()方法的原型如下:
HRESULT Recordset15::Open ( const _variant_t & Source, const _variant_t & ActiveConnection, enum CursorTypeEnum CursorType, enum LockTypeEnum LockType, long Options )

  上述函式中引數Source是資料查詢字串;引數ActiveConnection是已經建立好的連線(我們需要用Connection物件指標來構造一個_variant_t物件);引數CursorType游標型別,它可以是以下值之一;請看這個列舉結構:
enum CursorTypeEnum
{
 adOpenUnspecified = -1,///不作特別指定
 adOpenForwardOnly = 0,///前滾靜態游標。這種游標只能向前瀏覽記錄集,比如用MoveNext向前滾動,這種方式可以提高瀏覽速度。但諸如BookMark,RecordCount,AbsolutePosition,AbsolutePage都不能使用
 adOpenKeyset = 1,///採用這種游標的記錄集看不到其它使用者的新增、刪除操作,但對於更新原有記錄的操作對你是可見的。
 adOpenDynamic = 2,///動態游標。所有資料庫的操作都會立即在各使用者記錄集上反應出來。
 adOpenStatic = 3///靜態游標。它為你的記錄集產生一個靜態備份,但其它使用者的新增、刪除、更新操作對你的記錄集來說是不可見的。
};

  引數LockType表示資料庫的鎖定型別,它可以是以下值之一,請看如下列舉結構:
enum LockTypeEnum
{
 adLockUnspecified = -1,///未指定
 adLockReadOnly = 1,///只讀記錄集
 adLockPessimistic = 2,悲觀鎖定方式。資料在更新時鎖定其它所有動作,這是最安全的鎖定機制
 adLockOptimistic = 3,樂觀鎖定方式。只有在你呼叫Update方法時才鎖定記錄。在此之前仍然可以做資料的更新、插入、刪除等動作
 adLockBatchOptimistic = 4,樂觀分批更新。編輯時記錄不會鎖定,更改、插入及刪除是在批處理模式下完成。
};

  引數Options的含義請參考本文中對Connection物件的Execute()方法的介紹。

5、記錄集的遍歷、更新

  根據我們剛才通過執行SQL命令建立好的users表,它包含四個欄位:ID,username,old,birthday
以下的程式碼實現:開啟記錄集,遍歷所有記錄,刪除第一條記錄,新增三條記錄,移動游標到第二條記錄,更改其年齡資料,儲存到資料庫。
_variant_t vUsername,vBirthday,vID,vOld;
_RecordsetPtr m_pRecordset;
m_pRecordset.CreateInstance(“ADODB.Recordset”);
m_pRecordset->Open(“SELECT * FROM users”,_variant_t((IDispatch*)m_pConnection,true),
adOpenStatic,adLockOptimistic,adCmdText);
while(!m_pRecordset->adoEOF)
///這裡為什麼是adoEOF而不是EOF呢?還記得rename(“EOF”,”adoEOF”)這一句嗎?
{
 vID = m_pRecordset->GetCollect(_variant_t((long)0));///取得第1列的值,從0開始計數,你也可以直接給出列的名稱;
 vUsername = m_pRecordset->GetCollect(“username”);///取得username欄位的值
 vOld = m_pRecordset->GetCollect(“old”);
 vBirthday = m_pRecordset->GetCollect(“birthday”);
 ///在DEBUG方式下的OUTPUT視窗輸出記錄集中的記錄
 if(vID.vt != VT_NULL && vUsername.vt != VT_NULL && vOld.vt != VT_NULL &&
 vBirthday.vt != VT_NULL)
 TRACE(“id:%d,姓名:%s,年齡:%d,生日:%s\r\n”,vID.lVal,(LPCTSTR)(_bstr_t)vUsername,vOld.lVal,(LPCTSTR)(_bstr_t)vBirthday);
 m_pRecordset->MoveNext();///移到下一條記錄
}
m_pRecordset->MoveFirst();///移到首條記錄
m_pRecordset->Delete(adAffectCurrent);///刪除當前記錄
///新增三條新記錄並賦值
for(int i=0;i<3;i++)
{
 m_pRecordset->AddNew();///新增新記錄
 m_pRecordset->PutCollect(“ID”,_variant_t((long)(i+10)));
 m_pRecordset->PutCollect(“username”,_variant_t(“葉利欽”));
 m_pRecordset->PutCollect(“old”,_variant_t((long)71));
 m_pRecordset->PutCollect(“birthday”,_variant_t(“1930-3-15”));
}
m_pRecordset->Move(1,_variant_t((long)adBookmarkFirst));///從第一條記錄往下移動一條記錄,即移動到第二條記錄處
m_pRecordset->PutCollect(_variant_t(“old”),_variant_t((long)45));///修改其年齡
m_pRecordset->Update();///儲存到庫中
讀取資料到listbox:
void CDog::OnReadaccess()
{
_variant_t var;
CString strName,strAge,strPhone;
// 清空列表框
m_ListBox.ResetContent();
strName=strAge= strPhone =”“;
// 在ADO操作中建議語句中要常用try…catch()來捕獲錯誤資訊,
// 因為它有時會經常出現一些想不到的錯誤。jingzhou xu
try
{
if(!m_pRecordset->BOF)
m_pRecordset->MoveFirst();
else
{
AfxMessageBox(“表內資料為空”);
return;
}

    // 讀入庫中各欄位並加入列表框中
    while(!m_pRecordset->adoEOF)
    {
        var = m_pRecordset->GetCollect("name");
        if(var.vt != VT_NULL)
            strName = (LPCSTR)_bstr_t(var);
        var = m_pRecordset->GetCollect("sex");
        if(var.vt != VT_NULL)
            strAge = (LPCSTR)_bstr_t(var);
        var=m_pRecordset->GetCollect("telphone");
        if(var.vt!=VT_NULL)
            strPhone=(LPCSTR)_bstr_t(var);

        m_ListBox.AddString( strName + " --> "+strAge +"-->"+strPhone );

        m_pRecordset->MoveNext();
    }

    // 預設列表指向第一項,同時移動記錄指標並顯示
    m_ListBox.SetCurSel(0);
    OnSelchangeListaccess();
}
catch(_com_error *e)
{
    AfxMessageBox(e->ErrorMessage());
}

}
6、關閉記錄集與連線
int CAdoTestApp::ExitInstance()
{
// TODO: Add your specialized code here and/or call the base class
if(m_pConnection->State)
m_pConnection->Close();
m_pConnection= NULL;
return CWinApp::ExitInstance();
}

相關推薦

VC6.0 通過ado連線access資料庫

  我們可以使用AfxOleInit()來初始化COM庫,這項工作通常在CWinApp::InitInstance()的過載函式中完成,請看如下程式碼:: public: _ConnectionPtr m_pConnection

VC++ ado連線資料庫(可以在VC6.0使用,以access資料庫為例項)(1)

很多新手對資料庫連線迷茫了,怎麼我寫的就連線不上資料庫呢?或者有些功能就實現不了(感覺這太奇葩了吧),下面就怎麼連線資料庫進行說明。 看以下程式碼和解說步驟:(後面附帶一個完整的類給大家進行下載,便於直接進行呼叫) 1.首先新建一個類,方便下次使用,編寫了一次就不用再編寫。

如何通過ADO獲得Access資料庫中的所有使用者表和表資訊

本文介紹一種通過ADO列舉Access檔案中所用使用者表和表資訊的方法,僅供參考,原始碼在VC6.0 +XP環境通過測試。 首先,需要引入msado15.dll檔案,在stdafx.h中新增: #import "c:/program files/common files/s

VC6.0通過ADO呼叫SQL Server 2000的儲存過程出現引數過多的問題

今天在做畢業設計的時候遇到一個很奇怪的問題,我以前通過傳遞三個引數的儲存過程呼叫都還是很成功的,為什麼今天就不行了呢?程式碼如下: HRESULT hr; if (m_pCmd == NULL) { hr = m_pCmd.Creat

詳細配置C++藉助ADO連線Access資料庫

這是寫給你的。----2016-7-18 (本篇不會介紹連線原理,只介紹操作步驟入門)   1.     環境配置(Win8-Win10,64位) 2.     連線與測試程式碼 3.     意外情況解決方案   環境配置: 1.     先安裝你的Access資料庫(微

VC6.0利用ado元件 向oracle資料庫插入圖片

oracle 資料庫中用Bolb儲存圖片 一、資料庫表設定 1、建立表 create table epoliceadmin.ep_image(image_id number(10) not null primary key, image blob); 2、建立序列 crea

VS2013 MFC連線Access資料庫ADO)詳細版例項操作(含Combo Box讀取資料庫內容,附原始碼)

話不多說,先上圖,如果你需要的是這樣的程式,那麼可以下載下來看一看,帖子裡也會附上比較具體的操作步驟:先附上下載地址:程式下載地址 程式已經經過VS 2013+Windows 7+Access 2003的測試(執行出現其他問題應該多為環境問題,解決辦法各位可以自行百度)具體的

第一次在VS2010下MFC採用ADO方式連線ACCESS資料庫(詳細過程)

第一步:首先建立基於對話方塊的MFC應用程式Library,然後新增一個使用者登入介面如圖: 並建立此對話方塊的類LoginDlg ,在類中新建兩個變數CString m_strName; CString m_strPassword;並完善相應的建構函式和DoDataEx

VC連線ADO方式ACCESS資料庫在WIN7下編譯到XP下不能執行解決方法

以下為轉載: 不知道大家有沒有遇見這種情況,在WINDOWS7下編寫的ADO連線資料庫的程式,放在WIN XP下就會發現連線失敗的現象,在網上找了一些資料也沒找著,回頭看程式碼,其中有一句是載入ADO驅動,就是import C:\Program Files\Common

VS C# ADO.NET程式碼連線Access資料庫

在Visual Studio2013 C#中以程式設計方式操作Access資料庫,一般使用OleDb進行連線: 1.首先新增兩個引用(使用using): using System.Data.Ole

VC++ 通過ADO連線資料庫查詢時返回空值報錯的解決方案

當資料庫的欄位值允許為空時, 而且此時內容也為空時,則執行查詢會出錯,例如 CString str = pRecordset->GetFields()->GetItem((long)0)->GetValue(); 或者 str= pRecordset-&

nodejs連線Access資料庫,出現Error: Spawn C:\WINDOWS\SysWOW64\cscript.exe error Java專案生成可執行jar包、exe檔案以及在Windows下的安裝檔案

因為集成了第三方的資料庫,所以需要獲取資料庫的資料 使用 var connection = ADODB.open('Provider=Microsoft.Jet.OLEDB.4.0;Data Source='+config.id_path+';');  

連線Access資料庫連線字串

來自森大科技官方部落格 http://www.cnsendblog.com/index.php/?p=92連線Access資料庫的連線字串 把資料庫檔案放在App_Data資料夾中,Web.Config檔案中的連線字串如下所示:<connectionStrings><add name

利用python的pyodbc連線access 資料庫 & pyodbc的基本用法

一、安裝第三方庫 pyodbc Pip install pyodbc 二、檢驗是否可以正常連線資料庫 檢查是否有一個Microsoft Access ODBC驅動程式可用於你的Python環境(在Windows上)的方法: >>> import pyodb

Navicat通過IP連線XAMPP資料庫

前提條件: 安裝好XAMPP(Windows系統下) 安裝好Navicat(Windows系統下)    Navicat下載,提取碼:q4b6   操作步驟: 開啟Xampp Apache和MySQL服務,如下圖:為Port(s)下有埠號已

JDK1.8 連線Access資料庫

JDBC (JavaDB Connection)—Java資料庫連線 JDK1.8增加了很多新特性,但不再包含access橋接驅動,因此在連線Access資料庫時有所變化[和JDK1.6相比].  一、 設定資料來源(ODBC)  步驟:控制面板->系統安全->

如何快速通過 VS2017連線Oracle12c 資料庫

“一篇VS2017連線Oracle12c心得,最近折騰了一下oracle,寫篇小心得,最近課上用Visual Studio2017連線Oracle12c資料庫,碰到一個問題,後來發現需要一個第三方開發者工具。” Visual Studio 20

Android通過jdbc連線mySQL資料庫時,資料庫拒絕連線

原因: mysql伺服器出於安全考慮,預設只允許本機使用者通過命令列登入。 解決方案: 先通過localhost登入mysql伺服器 將mysql伺服器的mysql資料庫的user表中root使用者的Host欄位改為"%"。 操作如下: window+r 輸

驗證myeclipse通過jsp連線mysql資料庫是否成功

首先,我們需要建立一個數據庫和表 比如我們create database a 然後我們可以建立表 這樣我們就建立了一個數據庫和一張表,然後我們需要實現子jsp中判斷是否連線進入資料庫 程式碼: <%@ page language="java" impo

Java/kotlin如何連線access資料庫

Java/kotlin如何連線access資料庫 最近在工作中使用遇到了奇葩的需求,需要把Access的資料匯入到mysql的資料庫,而且兩個資料庫的表結構還是不一樣的。最初的方案是把Access的資料庫匯出到文字檔案,之後用java解析生成sql插入至Mysql資料庫。但是他們資料