亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? 用visual c++開發數據庫應用程序.txt

?? 用Visual C++開發數據庫應用程序包括源程序和注釋
?? TXT
?? 第 1 頁 / 共 4 頁
字號:
 

1、 概述

1、1 Visual C++開發數據庫技術的特點

Visual C++提供了多種多樣的數據庫訪問技術——ODBC API、MFC ODBC、DAO、OLE DB、ADO等。這些技術各有自己的特點,它們提供了簡單、靈活、訪問速度快、可擴展性好的開發技術。


簡單性 

Visual C++中提供了MFC類庫、ATL模板類以及AppWizard、ClassWizard等一系列的Wizard工具用于幫助用戶快速的建立自己的應用程序,大大簡化了應用程序的設計。使用這些技術,可以使開發者編寫很少的代碼或不需編寫代碼就可以開發一個數據庫應用程序。


靈活性 

Visual C++提供的開發環境可以使開發者根據自己的需要設計應用程序的界面和功能,而且,Visual C++提供了豐富的類庫和方法,可以使開發者根據自己的應用特點進行選擇。


訪問速度快 

為了解決ODBC開發的數據庫應用程序訪問數據庫的速度慢的問題,Visual C++提供了新的訪問技術——OLE DB和ADO,OLE DB和ADO都是基于COM接口的技術,使用這種技術可以直接對數據庫的驅動程序進行訪問,這大大提供了訪問速度。


可擴展性 

Visual C++提供了OLE技術和ActiveX技術,這種技術可以增強應用程序的能力。使用OLE技術和ActiveX技術可以使開發者利用Visual C++中提供的各種組件、控件以及第三方開發者提供的組件來創建自己的程序,從而實現應用程序的組件化。使用這種技術可以使應用程序具有良好的可擴展性。


訪問不同種類數據源 

傳統的ODBC技術只能訪問關系型數據庫,在Visual C++中,提供了OLE DB訪問技術,不僅可以訪問關系型數據庫,還可以訪問非關系型數據庫。

1、2 Visual C++開發數據庫技術

Visual C++提供了多種訪問數據庫的技術,如下所示:


ODBC(Open DataBase Connectivity) 


MFC ODBC(Microsoft Foundation Classes ODBC) 


DAO (Data Access Object) 


OLE DB(Object Link and Embedding DataBase) 


ADO(ActiveX Data Object) 

這些技術各有自己的特點,總結如下:


ODBC 

ODBC是客戶應用程序訪問關系數據庫時提供的一個統一的接口,對于不同的數據庫,ODBC提供了一套統一的API,使應用程序可以應用所提供的API來訪問任何提供了ODBC驅動程序的數據庫。而且,ODBC已經成為一種標準,所以,目前所有的關系數據庫都提供了ODBC驅動程序,這使ODBC的應用非常廣泛,基本上可用于所有的關系數據庫。

但由于ODBC只能用于關系數據庫,使得利用ODBC很難訪問對象數據庫及其它非關系數據庫。

由于ODBC是一種底層的訪問技術,因些,ODBC API可以使客戶應用程序能夠從底層設置和控制數據庫,完成一些高層數據庫技術無法完成的功能。


MFC ODBC 

由于直接使用ODBC API編寫應用程序要編制大量代碼,在Visual C++中提供了MFC ODBC類,封裝了ODBC API,這使得利用MFC來創建ODBC的應用程序非常簡便。


DAO 

DAO提供了一種通過程序代碼創建和操縱數據庫的機制。多個DAO構成一個體系結構,在這個結構中,各個DAO對象協同工作。MFC DAO是微軟提供的用于訪問Microsoft Jet數據庫文件(*.mdb)的強有力的數據庫開發工具,它通過DAO的封裝,向程序員提供了DAO豐富的操作數據庫手段。


OLE DB 

OLE DB是Visual C++開發數據庫應用中提供的新技術,它基于COM接口。因此,OLE DB對所有的文件系統包括關系數據庫和非關系數據庫都提供了統一的接口。這些特性使得OLE DB技術比傳統的數據庫訪問技術更加優越。

與ODBC技術相似,OLE DB屬于數據庫訪問技術中的底層接口。

直接使用OLE DB來設計數據庫應用程序需要大量的代碼。在VC中提供了ATL模板,用于設計OLE DB數據應用程序和數據提供程序。


ADO 

ADO技術是基于OLE DB的訪問接口,它繼承了OLE DB技術的優點,并且,ADO對OLE DB的接口作了封裝,定義了ADO對象,使程序開發得到簡化,ADO技術屬于數據庫訪問的高層接口。 

 



--------------------------------------------------------------------------------
2、 使用ODBC API

Microsoft 開放數據庫互連(ODBC,Open DataBase Connectivity)是Microsoft Windows 開放服務體系(WOSA)的一部分,是一個數據庫訪問的標準接口。使用這一標準接口,我們可以不關心具體的數據庫管理系統(DBMS)的細節,而只要有相應類型數據庫的ODBC驅動程序,就可以實現對數據庫的訪問。

ODBC編程接口為我們提供了極大的靈活性,我們可以通過這一個接口訪問不同種類的數據庫。而且,通過相應的ODBC驅動程序,我們可以方便地實現不同數據類型之間的轉換。

2.1 ODBC API 概述

ODBC是一個應用廣泛的數據庫訪問應用編程接口(API),使用標準的SQL(結構化查詢語言)作為其數據庫訪問語言。

2.11體系結構

ODBC的結構是建立在客戶機/服務器體系結構之上,它包含如下四個部分:

應用程序(Application ):

應用程序即用戶的應用,它負責用戶與用戶接口之間的交互操作,以及調用ODBC函數以給出SQL請求并提取結果以及進行錯誤處理。

ODBC驅動程序管理器(Driver Manager):

ODBC驅動程序管理器為應用程序加載和調用驅動程序,它可以同時管理多個應用程序和多個驅動程序。它的功能是通過間接調用函數和使用動態鏈接庫(DLL)來實現的,因此它一般包含在擴展名為”DLL”的文件中。

ODBC驅動程序(Driver)

ODBC 驅動程序執行ODBC函數調用,呈送 SQL 請求給指定的數據源,并將結果返回給應用程序。驅動程序也負責與任何訪問數據源的必要軟件層進行交互作用,這種層包括與底層網絡或文件系統接口的軟件。

數據源

數據源由數據集和與其相關聯的環境組成,包括操作系統、DBMS 和網絡(如果存在的話)。ODBC 通過引入“數據源”的概念解決了網絡拓撲結構和主機的大范圍差異問題,這樣,用戶看到的是數據源的名稱而不必關心其它東西。


 





2.12數據類型

ODBC使用兩類數據類型:SQL數據類型和C數據類型。SQL數據類型用于數據源,C數據類型用于應用程序代碼中。

2.13句柄

ODBC API 實現數據庫操作的手段是語句,這是一個強有力的手段。ODBC語句除了能執行SQL語句和完成查詢操作之外,還能實現大多數數據庫操作。

在ODBC中,使用不同的句柄(HANDLE)來標志環境(ENVIRONMENT)、連接(CONNECTION)、語句(STATEMENT)、描述器(DESCRIPTOR)等。

句柄就是一個應用程序變量,系統用它來存儲關于應用程序的上下文信息和應用程序所用到的一些對象。它和 Windows 編程中的概念類似,不過ODBC 更加完善了句柄的作用。

1、 環境句柄是 ODBC 中整個上下文的句柄,使用 ODBC 的每個程序從創建環境句柄開始,以釋放環境句柄結束。所有其它的句柄(這一應用程序所有的聯接句柄和語句句柄)都由環境句柄中的上下文來管理。環境句柄在每個應用程序中只能創建一個。

2、聯接句柄管理有關聯接的所有信息。聯接句柄可以分配多個,這不僅合法而且很有用;但不要生成不必要的句柄以免資源的浪費。但是,不同的驅動程序支持的聯接情況有所不同,有的驅動程序在一個應用程序中僅支持一個聯接句柄,有的驅動程序僅支持一個語句句柄。在應用程序中,可以在任何適當的時候聯接或脫離數據源,但不要輕易地建立或脫離聯接。

3、語句句柄是 ODBC API 真正發揮重要作用的,它被用來處理 SQL 語句及目錄函數,每個語句句柄只與一個聯接有關。當驅動程序接收一個來自應用程序的函數調用指令而該指令包含一個語句句柄時,驅動程序管理器將使用存儲在語句句柄中的聯接句柄來將這一函數調用發送給合適的驅動程序。

4、描述器句柄是元數據的集合,這些元數據描述了SQL語句的參數、記錄集的列等信息。當有語句被分配內存之后,描述器自動生成,稱為自動分配描述器。在程序中,應用程序也可調用SQLAllocHandle分配描述器。

當應用程序調用API函數SQLAllocHandle時,驅動管理器或者ODBC驅動程序將為所聲明的句柄類型分配內部結構,返回句柄值。

2.14異常處理

為了在程序開發過程中調試程序,發現程序錯誤,ODBC API通過兩種方式返回有關ODBC API函數執行的的信息:返回碼和診斷記錄。返回碼返回函數執行的返回值,說明函數執行成功與否。診斷記錄說明函數執行的詳細信息。


返回碼(Return Code) 

每一個ODBC API函數都返回一個代碼——返回碼,指示函數執行的成功與否。如果函數調用成功,返回碼為SQL_SUCCESS或SQL_SUCCESS_WITH_INFO。SQL_SUCCESS指示可通過診斷記錄獲取有關操作的詳細信息,SQL_SUCCESS_WITH_INFO指示應用程序執行結果帶有警告信息,可通過診斷記錄獲取詳細的信息。如果函數調用失敗,返回碼為SQL_ERROR。

下面的一段代碼根據函數SQLFetch()執行的返回碼,判斷函數執行的成功與否,從而據此進行相應的處理。

  

SQLRETURN rtcode;

SQLHSTMT hstmt;

While(rtcode=SQLFetch(hstmt)!=SQL_NO_DATA)

{

if(rtcode==SQL_SUCCESS_WITH_INFO)

{

//顯示警告信息

}

else

{

//顯示出錯信息

break;

}

//函數調用成功,進行處理

}

如果程序執行錯誤,返回碼為SQL_INVALID_HANDLE,程序無法執行,而其它的返回碼都帶有程序執行的信息。


診斷記錄(Diagnostic Records) 

每個ODBC API函數都能夠產生一系列的反映操作信息的診斷記錄。這些診斷記錄放在相關連的ODBC句柄中,直到下一個使用同一個句柄的函數調用,該診斷記錄一直存在。診斷記錄的大小沒有限制。

診斷記錄有兩類:頭記錄(Head Record)和狀態記錄(Status Record)。頭記錄是第一版權法記錄(Record 0),后面的記錄為狀態記錄。診斷記錄有許多的域組成,這些域在頭記錄和狀態記錄中是不同的。

可以用SQLGetDiagField函數獲取診斷記錄中的特定的域,另外,可以使用SQLGetDiagRec()獲取診斷記錄中一些常用的域,如SQLSTATE、原始錯誤號等。


頭記錄 

頭記錄的各個域中包含了一個函數執行的通用信息,無論函數執行成功與否,只要不返回SQL_INVALID_HANDLE,都會生成頭記錄。


狀態記錄 

狀態記錄中的每個域包含了驅動管理器、ODBC驅動程序或數據源返回的特定的錯誤或警告信息,包括SQLSTATE、原始錯誤碼、診斷信息、列號和行號等。只有函數執行返回SQL_ERROR,SQL_STILL_EXEUTING、SQL_SUCCESS_WITH_INFO、SQL_NEED_DATA或SQL_NO_DATA時,才會生成診斷記錄。


使用SQLGetDiagRec和SQLGetDiagField 

應用程序可以調用函數SQLGetDiagRec或SQLGetDiagField獲取診斷信息。對于給定的句柄,這兩個函數返回最近使用該句柄的函數的診斷信息。當有使用該句柄的函數執行時,句柄記錄所記錄的原有的診斷信息被覆蓋。如果函數執行后產生多個狀態記錄,程序必須多次調用這兩個函數以獲取信息。

 

  


--------------------------------------------------------------------------------



2.2 應用ODBC API建立應用程序

雖然直接應用ODBC API編制應用程序相對來說較為繁瑣,但是,由于直接使用ODBC API編寫的程序相對要簡潔、高效。所以,我們有必要學習直接使用ODBC API編程。

一般地,編寫ODBC程序主要有以下幾個步驟:


分配ODBC環境 


分配連接句柄 


連接數據源 


構造和執行SQL語句 


取得執行結果 


斷開同數據源的連接 


釋放ODBC環境 

2.21 分配ODBC環境

對于任何ODBC應用程序來說,第一步的工作是裝載驅動程序管理器,然后初始化ODBC環境,分配環境句柄。

首先,程序中聲明一個SQLHENV類型的變量,然后調用函數SQLAllocHandle,向其中傳遞分配的上述SQLHENV類型的變量地址和SQL_HANDLE_ENV選項。如下代碼所示:

SQLHENV henv;

SQLAllocHandle(SQL_HANDLE_ENV,SQL_NULL_HANDLE,&henv);

執行該調用語句后,驅動程序分配一個結構,該結構中存放環境信息,然后返回對應于該環境的環境句柄。

2.22分配連接句柄

分配環境句柄后,在建立至數據源的連接之前,我們必須分配一個連接句柄,每一個到數據源的連接對應于一個連接句柄。

首先,程序定義了一個SQLHDBC類型的變量,用于存放連接句柄,然后調用SQLAllocHandle函數分配句柄。如下代碼所示:

SQLHDBC hdbc;

SQLAllocHandle(SQL_HANDLE_DBC,henv,&hdbc);

henv為環境句柄。

 





2.23 連接數據源

當連接句柄分配完成后,我們可以設置連接屬性,所有的連接屬性都有缺省值,但是我們可以通過調用函數SQLSetConnectAttr()來設置連接屬性。用函數SQLGetConnectAttr()獲取這些連接屬性。

函數格式如下:

SQLRETURN SQLSetConnectAttr(SQLHDBC ConnectionHandle,SQLINTEGER Attribute,SQLPOINTER ValuePtr,SQLINTEGER StringLength);

SQLRETURN SQLGetConnectAttr(SQLHDBC ConnectionHandle,SQLINTEGER Attribute,SQLPOINTER ValuePtr,SQLINTEGER StringLength);


應用程序可以根據自己的需要設置不同的連接屬性。

完成對連接屬性的設置之后,就可以建立到數據源的連接了。對于不同的程序和用戶接口,可以用不同的函數建立連接:SQLConnect、SQLDriverConnect、SQLBrowseConnect。

SQLConnect

該函數提供了最為直接的程序控制方式,我們只要提供數據源名稱、用戶ID和口令,就可以進行連接了。

函數格式:

SQLRETURN SQLConnect(SQLHDBC ConnectionHandle,SQLCHAR ServerName,SQLSMALLINT NameLength1,SQLCHAR UserName,SQLSMALLINT NameLength2,SQLCHAR *Authentication,SQLSMALLINT NameLength3); 

參數:

ConnectionHandle 連接句柄

ServerName 數據源名稱

NameLength1 數據源名稱長度

UserName 用戶ID

NameLength2 用戶ID長度

Authentication 用戶口令

NameLength3 用戶口令長度

返回值:

SQL_SUCCESS, SQL_SUCCESS_WITH_INFO, SQL_ERROR, or SQL_INVALID_HANDLE. 

成功返回SQL_SUCCESS,如果返回值為SQL_ERROR或SQL_SUCCESS_WITH_INFO,可以用函數SQLGetDiagRec獲取相應SQLSTATE的值。 

下面的代碼演示了如何使用ODBC API的SQLConnect函數建立同數據源SQLServer的連接。 

#include “sqlext.h”

SQLHENV henv;;

SQLHDBC hdbc;

SQLHSTMT hstmt;

SQLRETURN retcode;

/*Allocate environment handle */

retcode = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &henv); 

if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) {

/* Set the ODBC version environment attribute */

retcode = SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, (void*)SQL_OV_ODBC3, 0); 

if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) {

/* Allocate connection handle */

retcode = SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc); 

if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) {

/* Set login timeout to 5 seconds. */

SQLSetConnectAttr(hdbc, (void*)SQL_LOGIN_TIMEOUT, 5, 0);

/* Connect to data source */

retcode = SQLConnect(hdbc, (SQLCHAR*) "Sales", SQL_NTS,

(SQLCHAR*) "JohnS", SQL_NTS,

(SQLCHAR*) "Sesame", SQL_NTS);

if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO){

/* Allocate statement handle */

retcode = SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt); 

if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) {

/* Process data */;

SQLFreeHandle(SQL_HANDLE_STMT, hstmt);

}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
成人禁用看黄a在线| 久久99九九99精品| 色欧美片视频在线观看在线视频| 久久久久久一二三区| 国产一区二区三区av电影| 精品剧情在线观看| 国产精品一级二级三级| 中文字幕电影一区| 91麻豆福利精品推荐| 亚洲最大的成人av| 日韩午夜激情视频| 国产不卡在线视频| 亚洲另类在线制服丝袜| 欧美在线短视频| 另类小说色综合网站| 久久精品人人爽人人爽| 一本久道久久综合中文字幕| 亚洲chinese男男1069| 欧美一级片免费看| 成人小视频在线| 亚洲一区二区精品3399| 欧美va在线播放| 顶级嫩模精品视频在线看| 亚洲一二三四区不卡| 欧美不卡在线视频| 色偷偷久久一区二区三区| 奇米一区二区三区av| 国产精品区一区二区三区| 在线观看免费成人| 国产精品原创巨作av| 一区二区在线看| 日韩精品一区二区在线| 91免费国产视频网站| 秋霞午夜av一区二区三区 | 欧美日本在线观看| 国产精品影视在线观看| 午夜国产精品影院在线观看| 国产网站一区二区| 337p亚洲精品色噜噜狠狠| av亚洲精华国产精华| 久久国产乱子精品免费女| 亚洲免费观看在线视频| 久久嫩草精品久久久精品一| 欧美日韩另类一区| 91偷拍与自偷拍精品| 精品一区二区免费视频| 一区二区三区影院| 日本一区二区三级电影在线观看| 欧美日韩国产精品自在自线| 北条麻妃国产九九精品视频| 老司机精品视频导航| 午夜精品福利久久久| 一区二区三区久久久| 欧美国产精品一区| 亚洲精品在线免费观看视频| 欧洲国内综合视频| www.亚洲精品| 国产麻豆视频一区| 久久精品国产亚洲高清剧情介绍 | 91视视频在线观看入口直接观看www| 日本成人在线电影网| 亚洲国产综合视频在线观看| 国产精品久久久久久户外露出| 久久亚洲欧美国产精品乐播 | 麻豆91在线观看| 亚洲福利电影网| 一区二区三区在线免费| 中文字幕亚洲一区二区va在线| 久久久久99精品国产片| 欧美成人官网二区| 欧美xxxxxxxxx| 欧美一区二区三区在线看| 91精品国产色综合久久不卡电影 | 色综合天天综合给合国产| 北条麻妃一区二区三区| 成人国产一区二区三区精品| 国产一区二区毛片| 国产呦精品一区二区三区网站 | 国产99久久久国产精品潘金网站| 精品一区免费av| 久久精品久久综合| 国产精品996| 国产夫妻精品视频| 成人激情文学综合网| www.成人在线| 色偷偷成人一区二区三区91 | 免费的国产精品| 久久91精品国产91久久小草 | 白白色 亚洲乱淫| av男人天堂一区| 色欧美片视频在线观看| 欧美亚一区二区| 日韩精品中文字幕在线不卡尤物| 欧美成人激情免费网| 中文字幕的久久| 一区二区三区中文字幕| 日日摸夜夜添夜夜添国产精品| 卡一卡二国产精品| 国产成人在线观看免费网站| 成人动漫中文字幕| 欧洲一区二区三区在线| 91麻豆精品国产91久久久久 | 久久众筹精品私拍模特| 国产亚洲欧美日韩俺去了| 中文字幕一区二区在线播放| 亚洲激情五月婷婷| 日本亚洲电影天堂| 国产不卡在线一区| 色av成人天堂桃色av| 欧美伦理电影网| 久久亚洲欧美国产精品乐播| 亚洲色图在线视频| 蜜臀av一区二区| 99久久精品情趣| 欧美一区二区在线免费观看| 国产婷婷精品av在线| 尤物在线观看一区| 国产在线精品不卡| 在线观看成人小视频| 亚洲精品一线二线三线无人区| 欧美国产日韩亚洲一区| 三级亚洲高清视频| 99精品视频一区二区三区| 这里是久久伊人| 亚洲日穴在线视频| 极品少妇一区二区三区精品视频| 99免费精品在线| 精品国免费一区二区三区| 亚洲色图一区二区三区| 激情五月播播久久久精品| 91免费看`日韩一区二区| 2023国产精华国产精品| 亚洲一区视频在线观看视频| 国产一二精品视频| 91精品婷婷国产综合久久| 中文字幕av不卡| 伦理电影国产精品| 欧美三级在线播放| 久久激五月天综合精品| 欧美视频自拍偷拍| 国产精品第13页| 国产一区二区伦理片| 欧美精品丝袜中出| 一区二区不卡在线视频 午夜欧美不卡在 | 欧美日免费三级在线| 国产精品免费久久久久| 激情五月播播久久久精品| 制服丝袜在线91| 午夜精品一区二区三区电影天堂| 99精品视频一区二区| 国产亚洲视频系列| 国产一区二区福利视频| 日韩欧美在线观看一区二区三区| 亚洲一区视频在线观看视频| 91麻豆成人久久精品二区三区| 久久久久综合网| 国产综合久久久久久久久久久久| 91麻豆精品国产91久久久| 亚洲成人高清在线| 欧美三级日韩在线| 亚洲午夜电影网| 在线视频亚洲一区| 亚洲欧美国产77777| 成人免费毛片片v| 欧美极品少妇xxxxⅹ高跟鞋| 国产成人亚洲精品狼色在线| 欧美精品一区二区久久久| 久久99日本精品| 日韩欧美卡一卡二| 亚洲乱码国产乱码精品精小说| 成人精品免费视频| 中文字幕日韩av资源站| 成人免费av资源| 国产精品久久二区二区| 岛国一区二区三区| 中文字幕一区二区在线播放| 99精品视频一区二区三区| 亚洲另类春色国产| 欧美日韩国产区一| 久久国产夜色精品鲁鲁99| 2021中文字幕一区亚洲| 福利一区在线观看| 亚洲色图视频网| 欧美精品自拍偷拍| 美女在线视频一区| 久久久久9999亚洲精品| 成人av网站免费观看| 亚洲欧美精品午睡沙发| 欧美在线一区二区三区| 日韩国产一区二| 精品国产乱码久久久久久蜜臀 | 欧美日韩一级二级三级| 秋霞电影网一区二区| 精品国产免费人成电影在线观看四季 | 欧美大肚乱孕交hd孕妇| 国产成人精品1024| 亚洲激情欧美激情| 欧美成人一区二区三区片免费 | 91精品国产综合久久福利软件| 经典三级视频一区|