visual c++筆記_第1頁
visual c++筆記_第2頁
visual c++筆記_第3頁
visual c++筆記_第4頁
visual c++筆記_第5頁
已閱讀5頁,還剩10頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、1.SQLConfigDataSource兩個需要注意的問題(1)當我們使用SQLConfigDataSource ODBC API函數時必須聲明包含系統的odbcinst.h頭文件,所以我們再選擇workspace窗口中FileView打開Header Files中Imageprocess.h,在其中加入#include“odbcinst.h”。(2)SQLConfigDataSource 這個API函數時候必須用到odbccp32.dll,它是Microsoft 提供的32 位ODBC安裝和管理的DLL,如果是16 位必須用到odbcinst.dll,odbccp32.dll 有一個imp

2、ort library,所以解決的辦法就是把這個odbccp32.lib加到我們的項目中,我們可以打開Project系統菜單項,選Add to Project子菜單,在其中選Files項,打開VC安裝目錄下的vclib目錄,文件類型選Library Files(.lib) , 選擇其中odbccp32.lib后按OK鍵。或者包含頭文件#include <afxdb.h>即可2.使用CRecordSet作為基類時,編譯時出現錯誤代碼如下:error C2504: 'CRecordset' : base class undefined解決方法:在工程的StdAfx.h頭

3、文件中添加:#include <afxdb.h>3. 初始化COM環境后,可以創建與數據庫的連接,進行連接的最佳方法是聲明一個Connection對象指針_ConnectionPtr,并把它用于和Connection對象進行的所以交互中。一旦聲明了一個Connection對象指針,可以通過創建一個Connection對象的實例(調用函數CreateInstance),并把Connection對象的UUID作為唯一的參數傳給它,從而初始化它,代碼如下: :CoInitialize(NULL); _ConnectionPtr pConn; pConn.CreateInstance(_u

4、uidof(Connection); 初始化以后,就可以用Open函數建立與數據庫的連接 pConn-> Open(L "Provider = MSDASQL.1; Data Source = TESTDB ", L " ", L " ", adOpenUnspecified);4.一、ADO簡介 ADO(ActiveX Data Object)是Microsoft數據庫應用程序開發的新接口,是建立在OLE DB之上的高層數據庫訪問技術,請不必為此擔心,即使你對OLE DB,COM不了解也能輕松對付ADO,因為它非常簡單易用,甚

5、至比你以往所接觸的ODBC API、DAO、RDO都要容易使用,并不失靈活性。本文將詳細地介紹在VC下如何使用ADO來進行數據庫應用程序開發,并給出示例代碼。 二、基本流程 萬事開頭難,任何一種新技術對于初學者來說最重要的還是“入門”,掌握其要點。讓我們來看看ADO數據庫開發的基本流程吧! (1)初始化COM庫,引入ADO庫定義文件 (2)用Connection對象連接數據庫 (3)利用建立好的連接,通過Connection、Command對象執行SQL命令,或利用Recordset對象取得結果記錄集進行查詢、處理。 (4)使用完畢后關閉連接釋放對象。 準備工作: 為了大家都能測試本文提供的例

6、子,我們采用Access數據庫,您也可以直接在我們提供的示例代碼中找到這個test.mdb。 下面我們將詳細介紹上述步驟并給出相關代碼。 【1】COM庫的初始化 我們可以使用AfxOleInit()來初始化COM庫,這項工作通常在CWinApp:InitInstance()的重載函數中完成,請看如下代碼: BOOL CADOTest1App:InitInstance() AfxOleInit(); . / “BOOL AFXAPI AfxOleInit( );#include <afxdisp.h>” 【2】用#import指令引入ADO類型庫 我們在stdafx.h中加入如下語句

7、:(stdafx.h這個文件哪里可以找到?你可以在FileView中的Header Files里找到) #import "c:program filescommon filessystemadomsado15.dll " no_namespace rename( "EOF ", "adoEOF ") 這一語句有何作用呢?其最終作用同我們熟悉的#include類似,編譯的時候系統會為我們生成msado15.tlh,ado15.tli兩個C+頭文件來定義ADO庫。 幾點說明: (1) 您的環境中msado15.dll不一定在這個目錄下,請

8、按實際情況修改 (2) 在編譯的時候肯能會出現如下警告,對此微軟在MSDN中作了說明,并建議我們不要理會這個警告。 msado15.tlh(405) : warning C4146: unary minus operator applied to unsigned type, result still unsigned - 【3】創建Connection對象并連接數據庫 首先我們需要添加一個指向Connection對象的指針: _ConnectionPtr m_pConnection; 下面的代碼演示了如何創建Connection對象實例及如何連接數據庫并進行異常捕捉。 BOOL CADOTe

9、st1Dlg:OnInitDialog() CDialog:OnInitDialog(); HRESULT hr; try hr = m_pConnection.CreateInstance( "ADODB.Connection ");/創建Connection對象 if(SUCCEEDED(hr) hr = m_pConnection-> Open( "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=test.mdb ", " ", " ",adModeUnknow

10、n); /連接數據庫 /上面一句中連接字串中的Provider是針對ACCESS2000環境的,對于ACCESS97,需要改為:Provider=Microsoft.Jet.OLEDB.3.51; catch(_com_error e)/捕捉異常 CString errormessage; errormessage.Format( "連接數據庫失敗!rn錯誤信息:%s ",e.ErrorMessage(); AfxMessageBox(errormessage);/顯示錯誤信息 . 在這段代碼中我們是通過Connection對象的Open方法來進行連接數據庫的,下面是該方法

11、的原型 HRESULT Connection15: Open(_bstr_t ConnectionString, _bstr_t UserID, _bstr_t Password, long Options ) ConnectionString為連接字串,UserID是用戶名, Password是登陸密碼,Options是連接選項,用于指定Connection對象對數據的更新許可權, Options可以是如下幾個常量: adModeUnknown:缺省。當前的許可權未設置 adModeRead:只讀 adModeWrite:只寫 adModeReadWrite:可以讀寫 adModeShare

12、DenyRead:阻止其它Connection對象以讀權限打開連接 adModeShareDenyWrite:阻止其它Connection對象以寫權限打開連接 adModeShareExclusive:阻止其它Connection對象打開連接 adModeShareDenyNone:允許其它程序或對象以任何權限建立連接 我們給出一些常用的連接方式供大家參考: (1)通過JET數據庫引擎對ACCESS2000數據庫的連接 m_pConnection-> Open( "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:test.mdb &

13、quot;, " ", " ",adModeUnknown); (2)通過DSN數據源對任何支持ODBC的數據庫進行連接: m_pConnection-> Open( "Data Source=adotest;UID=sa;PWD=; ", " ", " ",adModeUnknown); (3)不通過DSN對SQL SERVER數據庫進行連接: m_pConnection-> Open( "driver=SQLServer;Server=127.0.0.1;DATABAS

14、E=vckbase;UID=sa;PWD=139 ", " ", " ",adModeUnknown); 其中Server是SQL服務器的名稱,DATABASE是庫的名稱 Connection對象除Open方法外還有許多方法,我們先介紹Connection對象中兩個有用的屬性ConnectionTimeOut與State ConnectionTimeOut用來設置連接的超時時間,需要在Open之前調用,例如: m_pConnection-> ConnectionTimeout = 5;/設置超時時間為5秒 m_pConnection-&g

15、t; Open( "Data Source=adotest; ", " ", " ",adModeUnknown); State屬性指明當前Connection對象的狀態,0表示關閉,1表示已經打開,我們可以通過讀取這個屬性來作相應的處理,例如: if(m_pConnection-> State) m_pConnection-> Close(); /如果已經打開了連接則關閉它5. _variant_t目錄簡介 定義 案例 功能:編輯本段簡介_variant_t和_bstr_t這兩個類分別封裝并管理VARIANT和BSTR這

16、兩種數據類型, VARIANT和BSTR這兩種類型是COM中使用的數據類型。 為了C+中的變量應用到ADO編程中,只能進行數據類型的轉換。 通過_variant_t和_bstr_t這兩個類,就可以方便的把C+類型變量轉換成COM中的變量了。 編輯本段定義_variant_t的定義:COMUTIL.H class _variant_t : public :tagVARIANT public: / Constructors / _variant_t() throw(); _variant_t(const VARIANT& varSrc) throw(_com_error); _varian

17、t_t(const VARIANT* pSrc) throw(_com_error); _variant_t(const _variant_t& varSrc) throw(_com_error); _variant_t(VARIANT& varSrc, bool fCopy) throw(_com_error); / Attach VARIANT if !fCopy _variant_t(short sSrc, VARTYPE vtSrc = VT_I2) throw(_com_error); / Creates a VT_I2, or a VT_BOOL _variant_

18、t(long lSrc, VARTYPE vtSrc = VT_I4) throw(_com_error); / Creates a VT_I4, a VT_ERROR, or a VT_BOOL _variant_t(float fltSrc) throw(); / Creates a VT_R4 _variant_t(double dblSrc, VARTYPE vtSrc = VT_R8) throw(_com_error); / Creates a VT_R8, or a VT_DATE _variant_t(const CY& cySrc) throw(); / Create

19、s a VT_CY _variant_t(const _bstr_t& bstrSrc) throw(_com_error); / Creates a VT_BSTR _variant_t(const wchar_t *pSrc) throw(_com_error); / Creates a VT_BSTR _variant_t(const char* pSrc) throw(_com_error); / Creates a VT_BSTR _variant_t(IDispatch* pSrc, bool fAddRef = true) throw(); / Creates a VT_

20、DISPATCH _variant_t(bool bSrc) throw(); / Creates a VT_BOOL _variant_t(IUnknown* pSrc, bool fAddRef = true) throw(); / Creates a VT_UNKNOWN _variant_t(const DECIMAL& decSrc) throw(); / Creates a VT_DECIMAL _variant_t(BYTE bSrc) throw(); / Creates a VT_UI1 / Destructor / _variant_t() throw(_com_e

21、rror); / Extractors / operator short() const throw(_com_error); / Extracts a short from a VT_I2 operator long() const throw(_com_error); / Extracts a long from a VT_I4 operator float() const throw(_com_error); / Extracts a float from a VT_R4 operator double() const throw(_com_error); / Extracts a do

22、uble from a VT_R8 operator CY() const throw(_com_error); / Extracts a CY from a VT_CY operator _bstr_t() const throw(_com_error); / Extracts a _bstr_t from a VT_BSTR operator IDispatch*() const throw(_com_error); / Extracts a IDispatch* from a VT_DISPATCH operator bool() const throw(_com_error); / E

23、xtracts a bool from a VT_BOOL operator IUnknown*() const throw(_com_error); / Extracts a IUnknown* from a VT_UNKNOWN operator DECIMAL() const throw(_com_error); / Extracts a DECIMAL from a VT_DECIMAL operator BYTE() const throw(_com_error); / Extracts a BTYE (unsigned char) from a VT_UI1 / Assignmen

24、t operations / _variant_t& operator=(const VARIANT& varSrc) throw(_com_error); _variant_t& operator=(const VARIANT* pSrc) throw(_com_error); _variant_t& operator=(const _variant_t& varSrc) throw(_com_error); _variant_t& operator=(short sSrc) throw(_com_error); / Assign a VT_I

25、2, or a VT_BOOL _variant_t& operator=(long lSrc) throw(_com_error); / Assign a VT_I4, a VT_ERROR or a VT_BOOL _variant_t& operator=(float fltSrc) throw(_com_error); / Assign a VT_R4 _variant_t& operator=(double dblSrc) throw(_com_error); / Assign a VT_R8, or a VT_DATE _variant_t& ope

26、rator=(const CY& cySrc) throw(_com_error); / Assign a VT_CY _variant_t& operator=(const _bstr_t& bstrSrc) throw(_com_error); / Assign a VT_BSTR _variant_t& operator=(const wchar_t* pSrc) throw(_com_error); / Assign a VT_BSTR _variant_t& operator=(const char* pSrc) throw(_com_erro

27、r); / Assign a VT_BSTR _variant_t& operator=(IDispatch* pSrc) throw(_com_error); / Assign a VT_DISPATCH _variant_t& operator=(bool bSrc) throw(_com_error); / Assign a VT_BOOL _variant_t& operator=(IUnknown* pSrc) throw(_com_error); / Assign a VT_UNKNOWN _variant_t& operator=(const DE

28、CIMAL& decSrc) throw(_com_error); / Assign a VT_DECIMAL _variant_t& operator=(BYTE bSrc) throw(_com_error); / Assign a VT_UI1 / Comparison operations / bool operator=(const VARIANT& varSrc) const throw(_com_error); bool operator=(const VARIANT* pSrc) const throw(_com_error); bool operato

29、r!=(const VARIANT& varSrc) const throw(_com_error); bool operator!=(const VARIANT* pSrc) const throw(_com_error); / Low-level operations / void Clear() throw(_com_error); void Attach(VARIANT& varSrc) throw(_com_error); VARIANT Detach() throw(_com_error); void ChangeType(VARTYPE vartype, cons

30、t _variant_t* pSrc = NULL) throw(_com_error); void SetString(const char* pSrc) throw(_com_error); / used to set ANSI string ; 編輯本段案例我定義了一組函數可以方便的實現_variant_t類型轉換 /_variant_t轉WORD類型 BOOL AfxVariantConvert(WORD& val, const _variant_t& vt) if (vt.vt = VT_UI2) val = (WORD)vt.uiVal; return TRUE;

31、else val = 0; return FALSE; _variant_t轉DWORD類型 BOOL AfxVariantConvert(DWORD& val, const _variant_t& vt) if (vt.vt = VT_UI4 ) val = (DWORD)vt.ulVal; return TRUE; else val = 0; return FALSE; _variant_t轉DWORD64類型 BOOL AfxVariantConvert(DWORD64& val, const _variant_t& vt) if (vt.vt != VT

32、_UI8 ) val = (DWORD64)vt.ullVal; return TRUE; else val = 0; return FALSE; _variant_t轉CString類型 BOOL AfxVariantConvert(CString& val, const _variant_t& vt) if (vt.vt = VT_BSTR) val = (LPCTSTR)vt.bstrVal; return TRUE; else val = _T(""); return FALSE; _variant_t轉BOOL類型 BOOL AfxVariantConvert(BOOL& val, const _variant_t& vt) if (vt.vt = VT_BOOL) val = vt.boolVal; return TRUE; els

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論