VIsual C++ ODBC初探

來源:互聯網
上載者:User

ODBC 是一個調用級介面,它使得應用程式得以訪問任何具有 ODBC 驅動程式的資料庫中的資料。使用 ODBC 可以建立具有訪問任何資料庫(終端使用者具有該資料庫的 ODBC 驅動程式)的許可權的資料庫應用程式。ODBC 提供了使您的應用程式獨立於來源資料庫管理系統 (DBMS) 的 API。

ODBC 是 Microsoft Windows 開放式服務體繫結構 (WOSA) 中的資料庫部分。WOSA 是一種介面,允許基於 Windows 的傳統型應用程式串連到多種計算環境,而不用為每個平台重寫應用程式。

下面是 ODBC 的組件:
  • ODBC API

    函數調用庫、錯誤碼集和用於訪問 DBMS 上資料的標準結構化查詢語言 (SQL)的 (SQL) 文法。

  • ODBC 驅動程式管理器

    代表應用程式載入 ODBC 資料庫驅動程式的動態連結程式庫 (Odbc32.dll)。該 DLL 對您的應用程式是透明的。

  • ODBC 資料庫驅動程式

    處理特定 DBMS 的 ODBC 函數調用的一個或多個 DLL。

  • ODBC 遊標庫

    駐留在 ODBC 驅動程式管理器和該驅動程式之間並處理資料滾動的動態連結程式庫 (Odbccr32.dll)。

  • ODBC 管理器  odbcad32.exe

    用於配置 DBMS 使之可用作應用程式的資料來源的工具。

應用程式通過專為 DBMS 編寫的 ODBC 驅動程式而不是直接使用 DBMS 的工作方式獨立於 DBMS。驅動程式將這些調用轉換成 DBMS 可使用的命令,因而簡化了開發人員的工作,使得廣泛的資料來源都可以使用它。

資料庫類支援具有 ODBC 驅動程式的任何資料來源。例如,這可能包括關聯式資料庫、索引循序存取方法 (ISAM) 資料庫、Microsoft Excel 試算表或文字檔。ODBC 驅動程式管理到資料來源的串連,SQL 用於從資料庫中選擇記錄。

開放式資料庫連接 (ODBC) 技術為訪問不同種類的 SQL 資料庫提供了通用介面。ODBC 是基於結構查詢語言 (SQL) 的,以此作為訪問資料的標準。此介面提供了最大的互通性:一個應用程式可以通過一組公用代碼訪問不同的 SQL 資料庫管理系統 (DBMS)。這使得開發人員能夠在不以特定的 DBMS 為目標的情況下構建和分發一個用戶端/伺服器應用程式。然後,會添加資料庫驅動程式以將應用程式連結到使用者選擇的 DBMS。

以下特性說明了 ODBC 的靈活性:

•應用程式沒有綁定到專有供應商 API。

•SQL 陳述式可以明確地包括在原始碼中也可以在運行時即時構建。

•應用程式可以忽略基礎資料通訊協定。

•資料可以用方便於應用程式的格式進行發送和接收。

•ODBC 是隨新興的國際 ISO Call-Level Interface 標準一起設計的。

•目前提供了可用於 55 種最流行的資料庫的 ODBC 資料庫驅動程式。

Visual C++ 的大多數ODBC訪問是通過MFC來完成的。

Visual C++的MFC類庫定義了幾個資料庫類,在利用MFC編程時常常用到,它們是CDatabase(資料庫類)、CRecordSet(記錄集類)、和CRecordView(可視記錄集類)。
  對於MFC ODBC資料庫類來說,CDatabase類對象表示一個同資料來源的串連,通過它可以對資料來源進行操作。而CRecordSet對象代表從資料來源中選擇的一組記錄的集合,也就是通常所說的記錄集對象。
  CRecordSet對象通常用於兩種形式:動態集(dynasets)和快照集(snapshots)。動態集能與其他使用者所做的更改保持同步,快照集則是資料的一個靜態視圖。每一種形式在記錄被開啟時都提供一組記錄,區別在於,當使用者在一個動態集裡滾動到一條記錄時,有其他使用者或是應用程式中的其他記錄集所做的更改就會相應地顯示出來。CRecordView類對象能以控制的形式顯示資料庫記錄。這個視圖是直接連接到一個CRecordSet對象的表視圖。

可以使用MFC的模板類來添加資料庫的支援,如:

在CRecordSet類中實現了資料來源與記錄集之間的資料轉送(RFX)
void CdatatestSet::DoFieldExchange(CFieldExchange* pFX){pFX->SetFieldType(CFieldExchange::outputColumn);// Macros such as RFX_Text() and RFX_Int() are dependent on the// type of the member variable, not the type of the field in the database.// ODBC will try to automatically convert the column value to the requested typeRFX_Long(pFX, _T("[學號]"), m_stunum);RFX_Text(pFX, _T("[姓名]"), m_name );RFX_Text(pFX, _T("[性別]"), m_gender);RFX_Long(pFX, _T("[年齡]"), m_age);RFX_Long(pFX, _T("[班級編號]"), m_classnum);}
而在View類中的DoDataExchange中實現了控制項和資料庫欄位的串連:
void CdatatestView::DoDataExchange(CDataExchange* pDX){CRecordView::DoDataExchange(pDX);// 可以在此處插入DDX_Field* 函數以將控制項“串連”到資料庫欄位,例如// DDX_FieldText(pDX, IDC_MYEDITBOX, m_pSet->m_szColumn1, m_pSet);// DDX_FieldCheck(pDX, IDC_MYCHECKBOX, m_pSet->m_bColumn2, m_pSet);// 有關更多資訊,請參閱MSDN 和ODBC 樣本DDX_FieldText(pDX,IDC_EDIT1,m_pSet->m_stunum,m_pSet);DDX_FieldText(pDX,IDC_EDIT2,m_pSet->m_name,m_pSet);DDX_FieldText(pDX,IDC_EDIT3,m_pSet->m_gender,m_pSet);DDX_FieldText(pDX,IDC_EDIT4,m_pSet->m_age,m_pSet);DDX_FieldText(pDX,IDC_EDIT5,m_pSet->m_classnum,m_pSet);}
添加記錄的實現
void CdatatestView::OnAddData(){UpdateData(TRUE);// 檢查是否可添加if(!m_pSet->IsOpen()| !m_pSet->CanAppend()){return;}m_pSet->SetFieldNull(NULL);//清空所有欄位m_pSet->AddNew();//設定記錄為添加模式// 設定記錄新值 這兒本應該彈出新的對話方塊來設定新的記錄 但這裡直接添加給定的記錄m_pSet->m_stunum=20060003;m_pSet->m_name=L"張三";m_pSet->m_gender=L"男";m_pSet->m_classnum=3;m_pSet->m_age=10;//提交更新if(!m_pSet->Update()){AfxMessageBox(L"Error:記錄添加失敗");}//重建記錄集m_pSet->Requery();m_pSet->MoveLast();UpdateData(FALSE);}
修改記錄的簡單實現
void CdatatestView::OnEditData(){// 檢查是否可更新if(m_pSet->CanUpdate()){m_pSet->Edit();//設定記錄為編輯狀態if(!UpdateData())return;m_pSet->m_stunum=20070001;m_pSet->Update();UpdateData(FALSE);}}
刪除記錄的簡單實現
void CdatatestView::Ondelete(){// 檢查是否可更新if(m_pSet->CanUpdate()){m_pSet->Delete();// 標記為刪除m_pSet->Requery();// 重建記錄集m_pSet->MoveLast();// 移動到最後一條記錄UpdateData(FALSE);// 更新顯示}}
資料查詢

查詢記錄使用CRecordSet::Open()和 CRecordSet::Requery()成員函數。在使用CRecordSet類對象之前,必須使用 CRecordSet::Open()函數來獲得有效記錄集。一旦已經使用過CRecordSet::Open() 函數,重新查詢時就可以應用CRecordSet::Requery()函數。在調 用CRecordSet::Open()函數時,如果已經將一個已經開啟的CDatabase 對象指標傳給CRecordSet類對象的m_pDatabase成員變數,則使 用該資料庫物件建立ODBC串連;否則如果m_pDatabase為空白指 針,就建立一個CDatabase類對象並使其與預設的資料來源 相連,然後進行CRecordSet類對象的初始化。預設資料來源 由GetDefaultConnect()函數獲得。你也可以提供你所需要的SQL 陳述式,並以它來調用CRecordSet::Open()函數,例如:
m_Set.Open(AFX_DATABASE_USE_DEFAULT,strSQL);
如果沒有指定參數,程式則使 用預設的SQL語句,即對在GetDefaultSQL()函數中指定的SQL語 句進行操作: 
CString CTestRecordSet::GetDefaultSQL()
{return _T("[BasicData],[MainSize]");}
對於GetDefaultSQL()函數返回的表名, 對應的預設操作是SELECT語句,即:
SELECT * FROM BasicData,MainSize

查詢過程中也可以利用CRecordSet的 成員變數m_strFilter和m_strSort來執行條件查詢和結果排序。m_strFilter 為過濾字串,存放著SQL語句中WHERE後的條件串;m_strSort 為排序字串,存放著SQL語句中ORDERBY後的字串。 如:
m_Set.m_strFilter="TYPE='電動機'";
m_Set.m_strSort="VOLTAGE";
m_Set.Requery();
對應的SQL語句為:
SELECT * FROM BasicData,MainSize
WHERE TYPE='電動機'
ORDER BY VOLTAGE

參數化記錄集

使用參數化記錄集可以加快程式的執行速度,並可以實現動態功能。

利用參數化可以更直觀,更方便地 完成條件查詢任務。使用參數化的步驟如下: 
(1).聲明參變數: 
Cstring p1;
Float p2;
(2).在建構函式中初始化參變數
p1=_T("");
p2=0.0f;
m_nParams=2;
(3).將參變數與對應資料行繫結
pFX->SetFieldType(CFieldExchange::param)
RFX_Text(pFX,_T("P1"),p1);
RFX_Single(pFX,_T("P2"),p2);
完成以上步驟之後就可以利用參變數進行條件查詢了:
m_pSet->m_strFilter="TYPE=?ANDVOLTAGE=?";
m_pSet->p1="電動機";
m_pSet->p2=60.0;
m_pSet->Requery();
參變數的值按綁定的順序替換 查詢字串中的“?”適配符。
如果查詢的結果是多條記錄的 話,可以用CRecordSet類的函數Move(),MoveNext(),MovePrev(),MoveFirst() 和MoveLast()來移動游標。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.