|
<script language="JavaScript" src="/ad/doc/ad_7.asp" type="text/javascript"></script> |
用Visual C++開(kāi)發(fā)數(shù)據(jù)庫(kù)應(yīng)用程序
EMAIL:zzh1415@21cn.com 1、概述 1、1Visual C++開(kāi)發(fā)數(shù)據(jù)庫(kù)技術(shù)的特點(diǎn) Visual C++提供了多種多樣的數(shù)據(jù)庫(kù)訪問(wèn)技術(shù)——ODBC API、MFC ODBC、DAO、OLE DB、ADO等。這些技術(shù)各有自己的特點(diǎn),它們提供了簡(jiǎn)單、靈活、訪問(wèn)速度快、可擴(kuò)展性好的開(kāi)發(fā)技術(shù)。 1、 簡(jiǎn)單性 Visual C++中提供了MFC類庫(kù)、ATL模板類以及AppWizard、ClassWizard等一系列的Wizard工具用于幫助用戶快速的建立自己的應(yīng)用程序,大大簡(jiǎn)化了應(yīng)用程序的設(shè)計(jì)。使用這些技術(shù),可以使開(kāi)發(fā)者編寫很少的代碼或不需編寫代碼就可以開(kāi)發(fā)一個(gè)數(shù)據(jù)庫(kù)應(yīng)用程序。 2、 靈活性 Visual C++提供的開(kāi)發(fā)環(huán)境可以使開(kāi)發(fā)者根據(jù)自己的需要設(shè)計(jì)應(yīng)用程序的界面和功能,而且,Visual C++提供了豐富的類庫(kù)和方法,可以使開(kāi)發(fā)者根據(jù)自己的應(yīng)用特點(diǎn)進(jìn)行選擇。 3、 訪問(wèn)速度快 為了解決ODBC開(kāi)發(fā)的數(shù)據(jù)庫(kù)應(yīng)用程序訪問(wèn)數(shù)據(jù)庫(kù)的速度慢的問(wèn)題,Visual C++提供了新的訪問(wèn)技術(shù)——OLE DB和ADO,OLE DB和ADO都是基于COM接口的技術(shù),使用這種技術(shù)可以直接對(duì)數(shù)據(jù)庫(kù)的驅(qū)動(dòng)程序進(jìn)行訪問(wèn),這大大提供了訪問(wèn)速度。 4、 可擴(kuò)展性 Visual C++提供了OLE技術(shù)和ActiveX技術(shù),這種技術(shù)可以增強(qiáng)應(yīng)用程序的能力。使用OLE技術(shù)和ActiveX技術(shù)可以使開(kāi)發(fā)者利用Visual C++中提供的各種組件、控件以及第三方開(kāi)發(fā)者提供的組件來(lái)創(chuàng)建自己的程序,從而實(shí)現(xiàn)應(yīng)用程序的組件化。使用這種技術(shù)可以使應(yīng)用程序具有良好的可擴(kuò)展性。 5、 訪問(wèn)不同種類數(shù)據(jù)源 傳統(tǒng)的ODBC技術(shù)只能訪問(wèn)關(guān)系型數(shù)據(jù)庫(kù),在Visual C++中,提供了OLE DB訪問(wèn)技術(shù),不僅可以訪問(wèn)關(guān)系型數(shù)據(jù)庫(kù),還可以訪問(wèn)非關(guān)系型數(shù)據(jù)庫(kù)。 1、2Visual C++開(kāi)發(fā)數(shù)據(jù)庫(kù)技術(shù) Visual C++提供了多種訪問(wèn)數(shù)據(jù)庫(kù)的技術(shù),如下所示: 1、 ODBC(Open DataBase Connectivity) 2、 MFC ODBC(Microsoft Foundation Classes ODBC) 3、 DAO (Data Access Object) 4、 OLE DB(Object Link and Embedding DataBase) 5、 ADO(ActiveX Data Object) 這些技術(shù)各有自己的特點(diǎn),總結(jié)如下: 1、 ODBC ODBC是客戶應(yīng)用程序訪問(wèn)關(guān)系數(shù)據(jù)庫(kù)時(shí)提供的一個(gè)統(tǒng)一的接口,對(duì)于不同的數(shù)據(jù)庫(kù),ODBC提供了一套統(tǒng)一的API,使應(yīng)用程序可以應(yīng)用所提供的API來(lái)訪問(wèn)任何提供了ODBC驅(qū)動(dòng)程序的數(shù)據(jù)庫(kù)。而且,ODBC已經(jīng)成為一種標(biāo)準(zhǔn),所以,目前所有的關(guān)系數(shù)據(jù)庫(kù)都提供了ODBC驅(qū)動(dòng)程序,這使ODBC的應(yīng)用非常廣泛,基本上可用于所有的關(guān)系數(shù)據(jù)庫(kù)。 但由于ODBC只能用于關(guān)系數(shù)據(jù)庫(kù),使得利用ODBC很難訪問(wèn)對(duì)象數(shù)據(jù)庫(kù)及其它非關(guān)系數(shù)據(jù)庫(kù)。 由于ODBC是一種底層的訪問(wèn)技術(shù),因些,ODBC API可以使客戶應(yīng)用程序能夠從底層設(shè)置和控制數(shù)據(jù)庫(kù),完成一些高層數(shù)據(jù)庫(kù)技術(shù)無(wú)法完成的功能。 2、 MFC ODBC 由于直接使用ODBC API編寫應(yīng)用程序要編制大量代碼,在Visual C++中提供了MFC ODBC類,封裝了ODBC API,這使得利用MFC來(lái)創(chuàng)建ODBC的應(yīng)用程序非常簡(jiǎn)便。 3、 DAO DAO提供了一種通過(guò)程序代碼創(chuàng)建和操縱數(shù)據(jù)庫(kù)的機(jī)制。多個(gè)DAO構(gòu)成一個(gè)體系結(jié)構(gòu),在這個(gè)結(jié)構(gòu)中,各個(gè)DAO對(duì)象協(xié)同工作。MFC DAO是微軟提供的用于訪問(wèn)Microsoft Jet數(shù)據(jù)庫(kù)文件(*.mdb)的強(qiáng)有力的數(shù)據(jù)庫(kù)開(kāi)發(fā)工具,它通過(guò)DAO的封裝,向程序員提供了DAO豐富的操作數(shù)據(jù)庫(kù)手段。 4、 OLE DB OLE DB是Visual C++開(kāi)發(fā)數(shù)據(jù)庫(kù)應(yīng)用中提供的新技術(shù),它基于COM接口。因此,OLE DB對(duì)所有的文件系統(tǒng)包括關(guān)系數(shù)據(jù)庫(kù)和非關(guān)系數(shù)據(jù)庫(kù)都提供了統(tǒng)一的接口。這些特性使得OLE DB技術(shù)比傳統(tǒng)的數(shù)據(jù)庫(kù)訪問(wèn)技術(shù)更加優(yōu)越。 與ODBC技術(shù)相似,OLE DB屬于數(shù)據(jù)庫(kù)訪問(wèn)技術(shù)中的底層接口。 直接使用OLE DB來(lái)設(shè)計(jì)數(shù)據(jù)庫(kù)應(yīng)用程序需要大量的代碼。在VC中提供了ATL模板,用于設(shè)計(jì)OLE DB數(shù)據(jù)應(yīng)用程序和數(shù)據(jù)提供程序。 5、 ADO ADO技術(shù)是基于OLE DB的訪問(wèn)接口,它繼承了OLE DB技術(shù)的優(yōu)點(diǎn),并且,ADO對(duì)OLE DB的接口作了封裝,定義了ADO對(duì)象,使程序開(kāi)發(fā)得到簡(jiǎn)化,ADO技術(shù)屬于數(shù)據(jù)庫(kù)訪問(wèn)的高層接口。 2、使用ODBC API Microsoft 開(kāi)放數(shù)據(jù)庫(kù)互連(ODBC,Open DataBase Connectivity)是Microsoft Windows 開(kāi)放服務(wù)體系(WOSA)的一部分,是一個(gè)數(shù)據(jù)庫(kù)訪問(wèn)的標(biāo)準(zhǔn)接口。使用這一標(biāo)準(zhǔn)接口,我們可以不關(guān)心具體的數(shù)據(jù)庫(kù)管理系統(tǒng)(DBMS)的細(xì)節(jié),而只要有相應(yīng)類型數(shù)據(jù)庫(kù)的ODBC驅(qū)動(dòng)程序,就可以實(shí)現(xiàn)對(duì)數(shù)據(jù)庫(kù)的訪問(wèn)。 ODBC編程接口為我們提供了極大的靈活性,我們可以通過(guò)這一個(gè)接口訪問(wèn)不同種類的數(shù)據(jù)庫(kù)。而且,通過(guò)相應(yīng)的ODBC驅(qū)動(dòng)程序,我們可以方便地實(shí)現(xiàn)不同數(shù)據(jù)類型之間的轉(zhuǎn)換。 2.1ODBC API 概述 ODBC是一個(gè)應(yīng)用廣泛的數(shù)據(jù)庫(kù)訪問(wèn)應(yīng)用編程接口(API),使用標(biāo)準(zhǔn)的SQL(結(jié)構(gòu)化查詢語(yǔ)言)作為其數(shù)據(jù)庫(kù)訪問(wèn)語(yǔ)言。 2.11體系結(jié)構(gòu) ODBC的結(jié)構(gòu)是建立在客戶機(jī)/服務(wù)器體系結(jié)構(gòu)之上,它包含如下四個(gè)部分: 應(yīng)用程序(Application ): 應(yīng)用程序即用戶的應(yīng)用,它負(fù)責(zé)用戶與用戶接口之間的交互操作,以及調(diào)用ODBC函數(shù)以給出SQL請(qǐng)求并提取結(jié)果以及進(jìn)行錯(cuò)誤處理。 ODBC驅(qū)動(dòng)程序管理器(Driver Manager): ODBC驅(qū)動(dòng)程序管理器為應(yīng)用程序加載和調(diào)用驅(qū)動(dòng)程序,它可以同時(shí)管理多個(gè)應(yīng)用程序和多個(gè)驅(qū)動(dòng)程序。它的功能是通過(guò)間接調(diào)用函數(shù)和使用動(dòng)態(tài)鏈接庫(kù)(DLL)來(lái)實(shí)現(xiàn)的,因此它一般包含在擴(kuò)展名為”DLL”的文件中。 ODBC驅(qū)動(dòng)程序(Driver) ODBC 驅(qū)動(dòng)程序執(zhí)行ODBC函數(shù)調(diào)用,呈送 SQL 請(qǐng)求給指定的數(shù)據(jù)源,并將結(jié)果返回給應(yīng)用程序。驅(qū)動(dòng)程序也負(fù)責(zé)與任何訪問(wèn)數(shù)據(jù)源的必要軟件層進(jìn)行交互作用,這種層包括與底層網(wǎng)絡(luò)或文件系統(tǒng)接口的軟件。 數(shù)據(jù)源 數(shù)據(jù)源由數(shù)據(jù)集和與其相關(guān)聯(lián)的環(huán)境組成,包括操作系統(tǒng)、DBMS 和網(wǎng)絡(luò)(如果存在的話)。ODBC 通過(guò)引入“數(shù)據(jù)源”的概念解決了網(wǎng)絡(luò)拓?fù)浣Y(jié)構(gòu)和主機(jī)的大范圍差異問(wèn)題,這樣,用戶看到的是數(shù)據(jù)源的名稱而不必關(guān)心其它東西。 2.12數(shù)據(jù)類型 ODBC使用兩類數(shù)據(jù)類型:SQL數(shù)據(jù)類型和C數(shù)據(jù)類型。SQL數(shù)據(jù)類型用于數(shù)據(jù)源,C數(shù)據(jù)類型用于應(yīng)用程序代碼中。 2.13句柄 ODBC API 實(shí)現(xiàn)數(shù)據(jù)庫(kù)操作的手段是語(yǔ)句,這是一個(gè)強(qiáng)有力的手段。ODBC語(yǔ)句除了能執(zhí)行SQL語(yǔ)句和完成查詢操作之外,還能實(shí)現(xiàn)大多數(shù)數(shù)據(jù)庫(kù)操作。 在ODBC中,使用不同的句柄(HANDLE)來(lái)標(biāo)志環(huán)境(ENVIRONMENT)、連接(CONNECTION)、語(yǔ)句(STATEMENT)、描述器(DESCRIPTOR)等。 句柄就是一個(gè)應(yīng)用程序變量,系統(tǒng)用它來(lái)存儲(chǔ)關(guān)于應(yīng)用程序的上下文信息和應(yīng)用程序所用到的一些對(duì)象。它和 Windows 編程中的概念類似,不過(guò)ODBC 更加完善了句柄的作用。 1、環(huán)境句柄是 ODBC 中整個(gè)上下文的句柄,使用 ODBC 的每個(gè)程序從創(chuàng)建環(huán)境句柄開(kāi)始,以釋放環(huán)境句柄結(jié)束。所有其它的句柄(這一應(yīng)用程序所有的聯(lián)接句柄和語(yǔ)句句柄)都由環(huán)境句柄中的上下文來(lái)管理。環(huán)境句柄在每個(gè)應(yīng)用程序中只能創(chuàng)建一個(gè)。 2、聯(lián)接句柄管理有關(guān)聯(lián)接的所有信息。聯(lián)接句柄可以分配多個(gè),這不僅合法而且很有用;但不要生成不必要的句柄以免資源的浪費(fèi)。但是,不同的驅(qū)動(dòng)程序支持的聯(lián)接情況有所不同,有的驅(qū)動(dòng)程序在一個(gè)應(yīng)用程序中僅支持一個(gè)聯(lián)接句柄,有的驅(qū)動(dòng)程序僅支持一個(gè)語(yǔ)句句柄。在應(yīng)用程序中,可以在任何適當(dāng)?shù)臅r(shí)候聯(lián)接或脫離數(shù)據(jù)源,但不要輕易地建立或脫離聯(lián)接。 3、語(yǔ)句句柄是 ODBC API 真正發(fā)揮重要作用的,它被用來(lái)處理 SQL 語(yǔ)句及目錄函數(shù),每個(gè)語(yǔ)句句柄只與一個(gè)聯(lián)接有關(guān)。當(dāng)驅(qū)動(dòng)程序接收一個(gè)來(lái)自應(yīng)用程序的函數(shù)調(diào)用指令而該指令包含一個(gè)語(yǔ)句句柄時(shí),驅(qū)動(dòng)程序管理器將使用存儲(chǔ)在語(yǔ)句句柄中的聯(lián)接句柄來(lái)將這一函數(shù)調(diào)用發(fā)送給合適的驅(qū)動(dòng)程序。 4、描述器句柄是元數(shù)據(jù)的集合,這些元數(shù)據(jù)描述了SQL語(yǔ)句的參數(shù)、記錄集的列等信息。當(dāng)有語(yǔ)句被分配內(nèi)存之后,描述器自動(dòng)生成,稱為自動(dòng)分配描述器。在程序中,應(yīng)用程序也可調(diào)用SQLAllocHandle分配描述器。 當(dāng)應(yīng)用程序調(diào)用API函數(shù)SQLAllocHandle時(shí),驅(qū)動(dòng)管理器或者ODBC驅(qū)動(dòng)程序?qū)樗暶鞯木浔愋头峙鋬?nèi)部結(jié)構(gòu),返回句柄值。 2.14異常處理 為了在程序開(kāi)發(fā)過(guò)程中調(diào)試程序,發(fā)現(xiàn)程序錯(cuò)誤,ODBC API通過(guò)兩種方式返回有關(guān)ODBC API函數(shù)執(zhí)行的的信息:返回碼和診斷記錄。返回碼返回函數(shù)執(zhí)行的返回值,說(shuō)明函數(shù)執(zhí)行成功與否。診斷記錄說(shuō)明函數(shù)執(zhí)行的詳細(xì)信息。 1、 返回碼(Return Code) 每一個(gè)ODBC API函數(shù)都返回一個(gè)代碼——返回碼,指示函數(shù)執(zhí)行的成功與否。如果函數(shù)調(diào)用成功,返回碼為SQL_SUCCESS或SQL_SUCCESS_WITH_INFO。SQL_SUCCESS指示可通過(guò)診斷記錄獲取有關(guān)操作的詳細(xì)信息,SQL_SUCCESS_WITH_INFO指示應(yīng)用程序執(zhí)行結(jié)果帶有警告信息,可通過(guò)診斷記錄獲取詳細(xì)的信息。如果函數(shù)調(diào)用失敗,返回碼為SQL_ERROR。 下面的一段代碼根據(jù)函數(shù)SQLFetch()執(zhí)行的返回碼,判斷函數(shù)執(zhí)行的成功與否,從而據(jù)此進(jìn)行相應(yīng)的處理。 SQLRETURN rtcode; SQLHSTMT hstmt; While(rtcode=SQLFetch(hstmt)!=SQL_NO_DATA) { if(rtcode==SQL_SUCCESS_WITH_INFO) { //顯示警告信息 } else { //顯示出錯(cuò)信息 break; } //函數(shù)調(diào)用成功,進(jìn)行處理 } 如果程序執(zhí)行錯(cuò)誤,返回碼為SQL_INVALID_HANDLE,程序無(wú)法執(zhí)行,而其它的返回碼都帶有程序執(zhí)行的信息。 2、 診斷記錄(Diagnostic Records) 每個(gè)ODBC API函數(shù)都能夠產(chǎn)生一系列的反映操作信息的診斷記錄。這些診斷記錄放在相關(guān)連的ODBC句柄中,直到下一個(gè)使用同一個(gè)句柄的函數(shù)調(diào)用,該診斷記錄一直存在。診斷記錄的大小沒(méi)有限制。 診斷記錄有兩類:頭記錄(Head Record)和狀態(tài)記錄(Status Record)。頭記錄是第一版權(quán)法記錄(Record 0),后面的記錄為狀態(tài)記錄。診斷記錄有許多的域組成,這些域在頭記錄和狀態(tài)記錄中是不同的。 可以用SQLGetDiagField函數(shù)獲取診斷記錄中的特定的域,另外,可以使用SQLGetDiagRec()獲取診斷記錄中一些常用的域,如SQLSTATE、原始錯(cuò)誤號(hào)等。 1、 頭記錄 頭記錄的各個(gè)域中包含了一個(gè)函數(shù)執(zhí)行的通用信息,無(wú)論函數(shù)執(zhí)行成功與否,只要不返回SQL_INVALID_HANDLE,都會(huì)生成頭記錄。 2、 狀態(tài)記錄 狀態(tài)記錄中的每個(gè)域包含了驅(qū)動(dòng)管理器、ODBC驅(qū)動(dòng)程序或數(shù)據(jù)源返回的特定的錯(cuò)誤或警告信息,包括SQLSTATE、原始錯(cuò)誤碼、診斷信息、列號(hào)和行號(hào)等。只有函數(shù)執(zhí)行返回SQL_ERROR,SQL_STILL_EXEUTING、SQL_SUCCESS_WITH_INFO、SQL_NEED_DATA或SQL_NO_DATA時(shí),才會(huì)生成診斷記錄。 3、 使用SQLGetDiagRec和SQLGetDiagField 應(yīng)用程序可以調(diào)用函數(shù)SQLGetDiagRec或SQLGetDiagField獲取診斷信息。對(duì)于給定的句柄,這兩個(gè)函數(shù)返回最近使用該句柄的函數(shù)的診斷信息。當(dāng)有使用該句柄的函數(shù)執(zhí)行時(shí),句柄記錄所記錄的原有的診斷信息被覆蓋。如果函數(shù)執(zhí)行后產(chǎn)生多個(gè)狀態(tài)記錄,程序必須多次調(diào)用這兩個(gè)函數(shù)以獲取信息。 2.2應(yīng)用ODBC API建立應(yīng)用程序 雖然直接應(yīng)用ODBC API編制應(yīng)用程序相對(duì)來(lái)說(shuō)較為繁瑣,但是,由于直接使用ODBC API編寫的程序相對(duì)要簡(jiǎn)潔、高效。所以,我們有必要學(xué)習(xí)直接使用ODBC API編程。 一般地,編寫ODBC程序主要有以下幾個(gè)步驟: 1、 分配ODBC環(huán)境 2、 分配連接句柄 3、 連接數(shù)據(jù)源 4、 構(gòu)造和執(zhí)行SQL語(yǔ)句 5、 取得執(zhí)行結(jié)果 6、 斷開(kāi)同數(shù)據(jù)源的連接 7、 釋放ODBC環(huán)境 2.21分配ODBC環(huán)境 對(duì)于任何ODBC應(yīng)用程序來(lái)說(shuō),第一步的工作是裝載驅(qū)動(dòng)程序管理器,然后初始化ODBC環(huán)境,分配環(huán)境句柄。 首先,程序中聲明一個(gè)SQLHENV類型的變量,然后調(diào)用函數(shù)SQLAllocHandle,向其中傳遞分配的上述SQLHENV類型的變量地址和SQL_HANDLE_ENV選項(xiàng)。如下代碼所示: SQLHENV henv; SQLAllocHandle(SQL_HANDLE_ENV,SQL_NULL_HANDLE,&henv); 執(zhí)行該調(diào)用語(yǔ)句后,驅(qū)動(dòng)程序分配一個(gè)結(jié)構(gòu),該結(jié)構(gòu)中存放環(huán)境信息,然后返回對(duì)應(yīng)于該環(huán)境的環(huán)境句柄。 2.22分配連接句柄 分配環(huán)境句柄后,在建立至數(shù)據(jù)源的連接之前,我們必須分配一個(gè)連接句柄,每一個(gè)到數(shù)據(jù)源的連接對(duì)應(yīng)于一個(gè)連接句柄。 首先,程序定義了一個(gè)SQLHDBC類型的變量,用于存放連接句柄,然后調(diào)用SQLAllocHandle函數(shù)分配句柄。如下代碼所示: SQLHDBC hdbc; SQLAllocHandle(SQL_HANDLE_DBC,henv,&hdbc); henv為環(huán)境句柄。 2.23連接數(shù)據(jù)源 當(dāng)連接句柄分配完成后,我們可以設(shè)置連接屬性,所有的連接屬性都有缺省值,但是我們可以通過(guò)調(diào)用函數(shù)SQLSetConnectAttr()來(lái)設(shè)置連接屬性。用函數(shù)SQLGetConnectAttr()獲取這些連接屬性。 函數(shù)格式如下: SQLRETURN SQLSetConnectAttr(SQLHDBC ConnectionHandle,SQLINTEGER Attribute,SQLPOINTER ValuePtr,SQLINTEGER StringLength); SQLRETURN SQLGetConnectAttr(SQLHDBC ConnectionHandle,SQLINTEGER Attribute,SQLPOINTER ValuePtr,SQLINTEGER StringLength); 應(yīng)用程序可以根據(jù)自己的需要設(shè)置不同的連接屬性。 完成對(duì)連接屬性的設(shè)置之后,就可以建立到數(shù)據(jù)源的連接了。對(duì)于不同的程序和用戶接口,可以用不同的函數(shù)建立連接:SQLConnect、SQLDriverConnect、SQLBrowseConnect。 SQLConnect 該函數(shù)提供了最為直接的程序控制方式,我們只要提供數(shù)據(jù)源名稱、用戶ID和口令,就可以進(jìn)行連接了。 函數(shù)格式: SQLRETURN SQLConnect(SQLHDBC ConnectionHandle,SQLCHAR ServerName,SQLSMALLINT NameLength1,SQLCHAR UserName,SQLSMALLINT NameLength2,SQLCHAR *Authentication,SQLSMALLINT NameLength3); 參數(shù): ConnectionHandle 連接句柄 ServerName 數(shù)據(jù)源名稱 NameLength1 數(shù)據(jù)源名稱長(zhǎng)度 UserName 用戶ID NameLength2 用戶ID長(zhǎng)度 Authentication 用戶口令 NameLength3 用戶口令長(zhǎng)度 返回值: SQL_SUCCESS, SQL_SUCCESS_WITH_INFO, SQL_ERROR, or SQL_INVALID_HANDLE. 成功返回SQL_SUCCESS,如果返回值為SQL_ERROR或SQL_SUCCESS_WITH_INFO,可以用函數(shù)SQLGetDiagRec獲取相應(yīng)SQLSTATE的值。 下面的代碼演示了如何使用ODBC API的SQLConnect函數(shù)建立同數(shù)據(jù)源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); } SQLDisconnect(hdbc); } SQLFreeHandle(SQL_HANDLE_DBC, hdbc); } } SQLFreeHandle(SQL_HANDLE_ENV, henv); SQLDriveConnect 函數(shù)SQLDriveConnect用一個(gè)連接字符串建立至數(shù)據(jù)源的連接。它可以提供比SQLConnect函數(shù)的三個(gè)參數(shù)更多的信息,可以讓用戶輸入必要的連接信息。 如果連接建立,該函數(shù)返回完整的字符串,應(yīng)用程序可使用該連接字符串建立另外的連接。 函數(shù)格式: SQLRETURN SQLDriverConnect(SQLHDBC ConnectionHandle,SQLHWND WindowHandle,SQLCHAR InConnectionString,SQLSMALLINT StringLength1,SQLCHAR OutConnetionString,SQLSMALLINT BufferLength,SQLSMALLINT *StringLength2Ptr,SQLSMALLINT DriverCompletion); 參數(shù): ConnectionHandle 連接句柄 WindowHandle 窗口句柄,應(yīng)用程序可以用父窗口的句柄,或用NULL指針 InConnectionString 連接字符串長(zhǎng)度 OutConnectionString 一個(gè)指向連接字符中的指針 BufferLength 存放連接字符串的緩沖區(qū)的長(zhǎng)度 StringLength2Ptr 返回的連接字符串中的字符數(shù) DriverCompletion 額外連接信息,可能取值有:SQL_DRIVER_PROMPT, SQL_DRIVER_COMPLETE, SQL_DRIVER_COMPLETE_REQUIRED, or SQL_DRIVER_NOPROMPT. 返回值: SQL_SUCCESS, SQL_SUCCESS_WITH_INFO, SQL_ERROR, or SQL_INVALID_HANDLE. 成功返回SQL_SUCCESS,如果返回值為SQL_ERROR或SQL_SUCCESS_WITH_INFO,可以用函數(shù)SQLGetDiagRec獲取相應(yīng)SQLSTATE的值。 SQLBrowseConnect 函數(shù)SQLBrowseConnect支持以一種迭代的方式獲取到數(shù)據(jù)源的連接,直到最后建立連接。它是基于客房機(jī)/服務(wù)器的體系結(jié)構(gòu),因此,本地?cái)?shù)據(jù)庫(kù)不支持該函數(shù)。 一般,我們提供部分連接信息,如果足以建立到數(shù)據(jù)源的連接,則成功建立連接,否則返回SQL__NEED__DATA,并在OutConnectionString參數(shù)中返回所需要的信息。 函數(shù)格式: SQLRETURN SQLBrowseConnect(SQLHDBC ConnectionHandle,SQLCHAR* InConnectionString,SQLSAMLLINT StringLength1,SQLCHAR* OutConnectionString,SQLSMALLINT BufferLength,SQLSMALLINT *StringLength2Ptr); 參數(shù): ConnectionHandle 連接句柄 InConnectionString 指向輸出字符串的指針 StringLength1 輸出字符串的指針長(zhǎng)度 OutConnectionString 指向輸出字符串的指針 BufferLength 用于存放輸出字符串的緩沖區(qū)的長(zhǎng)度 StringLength2Ptr 實(shí)際返回的字符串的長(zhǎng)度 返回值: SQL_SUCCESS, SQL_SUCCESS_WITH_INFO, SQL_ERROR, or SQL_INVALID_HANDLE. 成功返回SQL_SUCCESS,如果返回值為SQL_ERROR或SQL_SUCCESS_WITH_INFO,可以用函數(shù)SQLGetDiagRec獲取相應(yīng)SQLSTATE的值。 下面的代碼講述了如何使用ODBC API的SQLBrowseConnect函數(shù)建立同數(shù)據(jù)源的連接。 #define BRWS_LEN 100SQLHENV henv;SQLHDBC hdbc; SQLHSTMT hstmt; SQLRETURN retcode; SQLCHAR szConnStrIn[BRWS_LEN], szConnStrOut[BRWS_LEN]; SQLSMALLINT cbConnStrOut;/* Allocate the environment handle. */ retcode = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &henv); if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) { /* Set the version environment attribute. */ retcode = SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, SQL_OV_ODBC3, 0); if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) { /* Allocate the connection handle. */ retcode = SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc); if (retcode == SQL_SUCCESS |
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元
