?? 309.htm
字號(hào):
'>
用Visual C++開發(fā)數(shù)據(jù)庫應(yīng)用程序
</a>
</TD></tr></table>
<TABLE align=center bgColor=#eeeecc border=1 cellPadding=1 cellSpacing=0 width=770>
<TBODY>
<TR>
<TD align=left width=300>
<B>關(guān)鍵字:</B><BR>
用Visual C++開發(fā)數(shù)據(jù)庫應(yīng)用程序
</TD>
<TD align=middle width=120>
<B>貼文時(shí)間</B><br>
2000-8-9 17:04:35
</TD>
<TD align=middle width=80>
<B>文章類型: </B><BR>
原作
</TD>
<TD align=middle width=100>
<B>給貼子投票 </B>
<BR><a href='/develop/addscore.asp?id=
309
'>投票</a>
</TD></TR>
<TR>
<TD >
zzh
原作
</TD>
<TD colSpan=3 vAlign=top>
<B>出處: </B><A href='
'>
</A></TD></TR>
<TR><TD colSpan=5 bgcolor=#cccc99> </TD></TR>
</TD></TR></TBODY></TABLE>
<div align=center><div class=fst align=left><div class=fstdiv3 id=print2>
<br><br>用visual c++開發(fā)數(shù)據(jù)庫應(yīng)用程序<br><br>email:zzh1415@21cn.com<br><br>1、 概述<br><br>1、1 visual c++開發(fā)數(shù)據(jù)庫技術(shù)的特點(diǎn)<br><br>visual c++提供了多種多樣的數(shù)據(jù)庫訪問技術(shù)——odbc api、mfc odbc、dao、ole db、ado等。這些技術(shù)各有自己的特點(diǎn),它們提供了簡單、靈活、訪問速度快、可擴(kuò)展性好的開發(fā)技術(shù)。<br><br><br>簡單性<br><br>visual c++中提供了mfc類庫、atl模板類以及appwizard、classwizard等一系列的wizard工具用于幫助用戶快速的建立自己的應(yīng)用程序,大大簡化了應(yīng)用程序的設(shè)計(jì)。使用這些技術(shù),可以使開發(fā)者編寫很少的代碼或不需編寫代碼就可以開發(fā)一個(gè)數(shù)據(jù)庫應(yīng)用程序。<br><br><br>靈活性<br><br>visual c++提供的開發(fā)環(huán)境可以使開發(fā)者根據(jù)自己的需要設(shè)計(jì)應(yīng)用程序的界面和功能,而且,visual c++提供了豐富的類庫和方法,可以使開發(fā)者根據(jù)自己的應(yīng)用特點(diǎn)進(jìn)行選擇。<br><br><br>訪問速度快<br><br>為了解決odbc開發(fā)的數(shù)據(jù)庫應(yīng)用程序訪問數(shù)據(jù)庫的速度慢的問題,visual c++提供了新的訪問技術(shù)——ole db和ado,ole db和ado都是基于com接口的技術(shù),使用這種技術(shù)可以直接對(duì)數(shù)據(jù)庫的驅(qū)動(dòng)程序進(jìn)行訪問,這大大提供了訪問速度。<br><br><br>可擴(kuò)展性<br><br>visual c++提供了ole技術(shù)和activex技術(shù),這種技術(shù)可以增強(qiáng)應(yīng)用程序的能力。使用ole技術(shù)和activex技術(shù)可以使開發(fā)者利用visual c++中提供的各種組件、控件以及第三方開發(fā)者提供的組件來創(chuàng)建自己的程序,從而實(shí)現(xiàn)應(yīng)用程序的組件化。使用這種技術(shù)可以使應(yīng)用程序具有良好的可擴(kuò)展性。<br><br><br>訪問不同種類數(shù)據(jù)源<br><br>傳統(tǒng)的odbc技術(shù)只能訪問關(guān)系型數(shù)據(jù)庫,在visual c++中,提供了ole db訪問技術(shù),不僅可以訪問關(guān)系型數(shù)據(jù)庫,還可以訪問非關(guān)系型數(shù)據(jù)庫。<br><br>1、2 visual c++開發(fā)數(shù)據(jù)庫技術(shù)<br><br>visual c++提供了多種訪問數(shù)據(jù)庫的技術(shù),如下所示:<br><br><br>odbc(open database connectivity)<br><br><br>mfc odbc(microsoft foundation classes odbc)<br><br><br>dao (data access object)<br><br><br>ole db(object link and embedding database)<br><br><br>ado(activex data object)<br><br>這些技術(shù)各有自己的特點(diǎn),總結(jié)如下:<br><br><br>odbc<br><br>odbc是客戶應(yīng)用程序訪問關(guān)系數(shù)據(jù)庫時(shí)提供的一個(gè)統(tǒng)一的接口,對(duì)于不同的數(shù)據(jù)庫,odbc提供了一套統(tǒng)一的api,使應(yīng)用程序可以應(yīng)用所提供的api來訪問任何提供了odbc驅(qū)動(dòng)程序的數(shù)據(jù)庫。而且,odbc已經(jīng)成為一種標(biāo)準(zhǔn),所以,目前所有的關(guān)系數(shù)據(jù)庫都提供了odbc驅(qū)動(dòng)程序,這使odbc的應(yīng)用非常廣泛,基本上可用于所有的關(guān)系數(shù)據(jù)庫。<br><br>但由于odbc只能用于關(guān)系數(shù)據(jù)庫,使得利用odbc很難訪問對(duì)象數(shù)據(jù)庫及其它非關(guān)系數(shù)據(jù)庫。<br><br>由于odbc是一種底層的訪問技術(shù),因些,odbc api可以使客戶應(yīng)用程序能夠從底層設(shè)置和控制數(shù)據(jù)庫,完成一些高層數(shù)據(jù)庫技術(shù)無法完成的功能。<br><br><br>mfc odbc<br><br>由于直接使用odbcapi編寫應(yīng)用程序要編制大量代碼,在visual c++中提供了mfc odbc類,封裝了odbc api,這使得利用mfc來創(chuàng)建odbc的應(yīng)用程序非常簡便。<br><br><br>dao<br><br>dao提供了一種通過程序代碼創(chuàng)建和操縱數(shù)據(jù)庫的機(jī)制。多個(gè)dao構(gòu)成一個(gè)體系結(jié)構(gòu),在這個(gè)結(jié)構(gòu)中,各個(gè)dao對(duì)象協(xié)同工作。mfc dao是微軟提供的用于訪問microsoft jet數(shù)據(jù)庫文件(*.mdb)的強(qiáng)有力的數(shù)據(jù)庫開發(fā)工具,它通過dao的封裝,向程序員提供了dao豐富的操作數(shù)據(jù)庫手段。<br><br><br>ole db<br><br>ole db是visual c++開發(fā)數(shù)據(jù)庫應(yīng)用中提供的新技術(shù),它基于com接口。因此,ole db對(duì)所有的文件系統(tǒng)包括關(guān)系數(shù)據(jù)庫和非關(guān)系數(shù)據(jù)庫都提供了統(tǒng)一的接口。這些特性使得ole db技術(shù)比傳統(tǒng)的數(shù)據(jù)庫訪問技術(shù)更加優(yōu)越。<br><br>與odbc技術(shù)相似,ole db屬于數(shù)據(jù)庫訪問技術(shù)中的底層接口。<br><br>直接使用ole db來設(shè)計(jì)數(shù)據(jù)庫應(yīng)用程序需要大量的代碼。在vc中提供了atl模板,用于設(shè)計(jì)ole db數(shù)據(jù)應(yīng)用程序和數(shù)據(jù)提供程序。<br><br><br>ado<br><br>ado技術(shù)是基于ole db的訪問接口,它繼承了ole db技術(shù)的優(yōu)點(diǎn),并且,ado對(duì)ole db的接口作了封裝,定義了ado對(duì)象,使程序開發(fā)得到簡化,ado技術(shù)屬于數(shù)據(jù)庫訪問的高層接口。<br><br> <br><br>2、 使用odbc api<br><br>microsoft 開放數(shù)據(jù)庫互連(odbc,open database connectivity)是microsoft windows 開放服務(wù)體系(wosa)的一部分,是一個(gè)數(shù)據(jù)庫訪問的標(biāo)準(zhǔn)接口。使用這一標(biāo)準(zhǔn)接口,我們可以不關(guān)心具體的數(shù)據(jù)庫管理系統(tǒng)(dbms)的細(xì)節(jié),而只要有相應(yīng)類型數(shù)據(jù)庫的odbc驅(qū)動(dòng)程序,就可以實(shí)現(xiàn)對(duì)數(shù)據(jù)庫的訪問。<br><br>odbc編程接口為我們提供了極大的靈活性,我們可以通過這一個(gè)接口訪問不同種類的數(shù)據(jù)庫。而且,通過相應(yīng)的odbc驅(qū)動(dòng)程序,我們可以方便地實(shí)現(xiàn)不同數(shù)據(jù)類型之間的轉(zhuǎn)換。<br><br>2.1 odbc api 概述<br><br>odbc是一個(gè)應(yīng)用廣泛的數(shù)據(jù)庫訪問應(yīng)用編程接口(api),使用標(biāo)準(zhǔn)的sql(結(jié)構(gòu)化查詢語言)作為其數(shù)據(jù)庫訪問語言。<br><br>2.11體系結(jié)構(gòu)<br><br>odbc的結(jié)構(gòu)是建立在客戶機(jī)/服務(wù)器體系結(jié)構(gòu)之上,它包含如下四個(gè)部分:<br><br>應(yīng)用程序(application ):<br><br>應(yīng)用程序即用戶的應(yīng)用,它負(fù)責(zé)用戶與用戶接口之間的交互操作,以及調(diào)用odbc函數(shù)以給出sql請(qǐng)求并提取結(jié)果以及進(jìn)行錯(cuò)誤處理。<br><br>odbc驅(qū)動(dòng)程序管理器(driver manager):<br><br>odbc驅(qū)動(dòng)程序管理器為應(yīng)用程序加載和調(diào)用驅(qū)動(dòng)程序,它可以同時(shí)管理多個(gè)應(yīng)用程序和多個(gè)驅(qū)動(dòng)程序。它的功能是通過間接調(diào)用函數(shù)和使用動(dòng)態(tài)鏈接庫(dll)來實(shí)現(xiàn)的,因此它一般包含在擴(kuò)展名為”dll”的文件中。<br><br>odbc驅(qū)動(dòng)程序(driver)<br><br>odbc 驅(qū)動(dòng)程序執(zhí)行odbc函數(shù)調(diào)用,呈送 sql 請(qǐng)求給指定的數(shù)據(jù)源,并將結(jié)果返回給應(yīng)用程序。驅(qū)動(dòng)程序也負(fù)責(zé)與任何訪問數(shù)據(jù)源的必要軟件層進(jìn)行交互作用,這種層包括與底層網(wǎng)絡(luò)或文件系統(tǒng)接口的軟件。<br><br>數(shù)據(jù)源<br><br>數(shù)據(jù)源由數(shù)據(jù)集和與其相關(guān)聯(lián)的環(huán)境組成,包括操作系統(tǒng)、dbms 和網(wǎng)絡(luò)(如果存在的話)。odbc 通過引入“數(shù)據(jù)源”的概念解決了網(wǎng)絡(luò)拓?fù)浣Y(jié)構(gòu)和主機(jī)的大范圍差異問題,這樣,用戶看到的是數(shù)據(jù)源的名稱而不必關(guān)心其它東西。<br><br>2.12數(shù)據(jù)類型<br><br>odbc使用兩類數(shù)據(jù)類型:sql數(shù)據(jù)類型和c數(shù)據(jù)類型。sql數(shù)據(jù)類型用于數(shù)據(jù)源,c數(shù)據(jù)類型用于應(yīng)用程序代碼中。<br><br>2.13句柄<br><br>odbc api 實(shí)現(xiàn)數(shù)據(jù)庫操作的手段是語句,這是一個(gè)強(qiáng)有力的手段。odbc語句除了能執(zhí)行sql語句和完成查詢操作之外,還能實(shí)現(xiàn)大多數(shù)數(shù)據(jù)庫操作。<br><br>在odbc中,使用不同的句柄(handle)來標(biāo)志環(huán)境(environment)、連接(connection)、語句(statement)、描述器(descriptor)等。<br><br>句柄就是一個(gè)應(yīng)用程序變量,系統(tǒng)用它來存儲(chǔ)關(guān)于應(yīng)用程序的上下文信息和應(yīng)用程序所用到的一些對(duì)象。它和 windows 編程中的概念類似,不過odbc 更加完善了句柄的作用。<br><br>1、 環(huán)境句柄是 odbc 中整個(gè)上下文的句柄,使用 odbc 的每個(gè)程序從創(chuàng)建環(huán)境句柄開始,以釋放環(huán)境句柄結(jié)束。所有其它的句柄(這一應(yīng)用程序所有的聯(lián)接句柄和語句句柄)都由環(huán)境句柄中的上下文來管理。環(huán)境句柄在每個(gè)應(yīng)用程序中只能創(chuàng)建一個(gè)。<br><br>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īng)用程序中,可以在任何適當(dāng)?shù)臅r(shí)候聯(lián)接或脫離數(shù)據(jù)源,但不要輕易地建立或脫離聯(lián)接。<br><br>3、語句句柄是 odbc api 真正發(fā)揮重要作用的,它被用來處理 sql 語句及目錄函數(shù),每個(gè)語句句柄只與一個(gè)聯(lián)接有關(guān)。當(dāng)驅(qū)動(dòng)程序接收一個(gè)來自應(yīng)用程序的函數(shù)調(diào)用指令而該指令包含一個(gè)語句句柄時(shí),驅(qū)動(dòng)程序管理器將使用存儲(chǔ)在語句句柄中的聯(lián)接句柄來將這一函數(shù)調(diào)用發(fā)送給合適的驅(qū)動(dòng)程序。<br><br>4、描述器句柄是元數(shù)據(jù)的集合,這些元數(shù)據(jù)描述了sql語句的參數(shù)、記錄集的列等信息。當(dāng)有語句被分配內(nèi)存之后,描述器自動(dòng)生成,稱為自動(dòng)分配描述器。在程序中,應(yīng)用程序也可調(diào)用sqlallochandle分配描述器。<br><br>當(dāng)應(yīng)用程序調(diào)用api函數(shù)sqlallochandle時(shí),驅(qū)動(dòng)管理器或者odbc驅(qū)動(dòng)程序?qū)樗暶鞯木浔愋头峙鋬?nèi)部結(jié)構(gòu),返回句柄值。<br><br>2.14異常處理<br><br>為了在程序開發(fā)過程中調(diào)試程序,發(fā)現(xiàn)程序錯(cuò)誤,odbc api通過兩種方式返回有關(guān)odbc api函數(shù)執(zhí)行的的信息:返回碼和診斷記錄。返回碼返回函數(shù)執(zhí)行的返回值,說明函數(shù)執(zhí)行成功與否。診斷記錄說明函數(shù)執(zhí)行的詳細(xì)信息。<br><br><br>返回碼(return code)<br><br>每一個(gè)odbc api函數(shù)都返回一個(gè)代碼——返回碼,指示函數(shù)執(zhí)行的成功與否。如果函數(shù)調(diào)用成功,返回碼為sql_success或sql_success_with_info。sql_success指示可通過診斷記錄獲取有關(guān)操作的詳細(xì)信息,sql_success_with_info指示應(yīng)用程序執(zhí)行結(jié)果帶有警告信息,可通過診斷記錄獲取詳細(xì)的信息。如果函數(shù)調(diào)用失敗,返回碼為sql_error。<br><br>下面的一段代碼根據(jù)函數(shù)sqlfetch()執(zhí)行的返回碼,判斷函數(shù)執(zhí)行的成功與否,從而據(jù)此進(jìn)行相應(yīng)的處理。<br><br>sqlreturn rtcode;<br><br>sqlhstmt hstmt;<br><br>while(rtcode=sqlfetch(hstmt)!=sql_no_data)<br><br>{<br><br>if(rtcode==sql_success_with_info)<br><br>{<br><br>//顯示警告信息<br><br>}<br><br>else<br><br>{<br><br>//顯示出錯(cuò)信息<br><br>break;<br><br>}<br><br>//函數(shù)調(diào)用成功,進(jìn)行處理<br><br>}<br><br>如果程序執(zhí)行錯(cuò)誤,返回碼為sql_invalid_handle,程序無法執(zhí)行,而其它的返回碼都帶有程序執(zhí)行的信息。<br><br><br>診斷記錄(diagnostic records)<br><br>每個(gè)odbc api函數(shù)都能夠產(chǎn)生一系列的反映操作信息的診斷記錄。這些診斷記錄放在相關(guān)連的odbc句柄中,直到下一個(gè)使用同一個(gè)句柄的函數(shù)調(diào)用,該診斷記錄一直存在。診斷記錄的大小沒有限制。<br><br>診斷記錄有兩類:頭記錄(head record)和狀態(tài)記錄(status record)。頭記錄是第一版權(quán)法記錄(record 0),后面的記錄為狀態(tài)記錄。診斷記錄有許多的域組成,這些域在頭記錄和狀態(tài)記錄中是不同的。<br><br>可以用sqlgetdiagfield函數(shù)獲取診斷記錄中的特定的域,另外,可以使用sqlgetdiagrec()獲取診斷記錄中一些常用的域,如sqlstate、原始錯(cuò)誤號(hào)等。<br><br><br>頭記錄<br><br>頭記錄的各個(gè)域中包含了一個(gè)函數(shù)執(zhí)行的通用信息,無論函數(shù)執(zhí)行成功與否,只要不返回sql_invalid_handle,都會(huì)生成頭記錄。<br><br><br>狀態(tài)記錄<br><br>狀態(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ì)生成診斷記錄。<br><br><br>使用sqlgetdiagrec和sqlgetdiagfield<br><br>應(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ù)以獲取信息。<br><br>2.2 應(yīng)用odbc api建立應(yīng)用程序<br><br>雖然直接應(yīng)用odbc api編制應(yīng)用程序相對(duì)來說較為繁瑣,但是,由于直接使用odbc api編寫的程序相對(duì)要簡潔、高效。所以,我們有必要學(xué)習(xí)直接使用odbc api編程。<br><br>一般地,編寫odbc程序主要有以下幾個(gè)步驟:<br><br><br>分配odbc環(huán)境<br><br><br>分配連接句柄<br><br><br>連接數(shù)據(jù)源<br><br><br>構(gòu)造和執(zhí)行sql語句<br><br><br>取得執(zhí)行結(jié)果<br><br><br>斷開同數(shù)據(jù)源的連接<br><br><br>釋放odbc環(huán)境<br><br>2.21 分配odbc環(huán)境<br><br>對(duì)于任何odbc應(yīng)用程序來說,第一步的工作是裝載驅(qū)動(dòng)程序管理器,然后初始化odbc環(huán)境,分配環(huán)境句柄。<br><br>首先,程序中聲明一個(gè)sqlhenv類型的變量,然后調(diào)用函數(shù)sqlallochandle,向其中傳遞分配的上述sqlhenv類型的變量地址和sql_handle_env選項(xiàng)。如下代碼所示:<br><br>sqlhenv henv;<br><br>sqlallochandle(sql_handle_env,sql_null_handle,&henv);<br><br>執(zhí)行該調(diào)用語句后,驅(qū)動(dòng)程序分配一個(gè)結(jié)構(gòu),該結(jié)構(gòu)中存放環(huán)境信息,然后返回對(duì)應(yīng)于該環(huán)境的環(huán)境句柄。<br><br>2.22分配連接句柄<br><br>分配環(huán)境句柄后,在建立至數(shù)據(jù)源的連接之前,我們必須分配一個(gè)連接句柄,每一個(gè)到數(shù)據(jù)源的連接對(duì)應(yīng)于一個(gè)連接句柄。<br><br>首先,程序定義了一個(gè)sqlhdbc類型的變量,用于存放連接句柄,然后調(diào)用sqlallochandle函數(shù)分配句柄。如下代碼所示:<br><br>sqlhdbc hdbc;<br><br>sqlallochandle(sql_handle_dbc,henv,&hdbc);<br><br>henv為環(huán)境句柄。<br><br>2.23 連接數(shù)據(jù)源<br><br>當(dāng)連接句柄分配完成后,我們可以設(shè)置連接屬性,所有的連接屬性都有缺省值,但是我們可以通過調(diào)用函數(shù)sqlsetconnectattr()來設(shè)置連接屬性。用函數(shù)sqlgetconnectattr()獲取這些連接屬性。<br><br>函數(shù)格式如下:<br><br>sqlreturn sqlsetconnectattr(sqlhdbc connectionhandle,sqlinteger attribute,sqlpointer valueptr,sqlinteger stringlength);<br><br>sqlreturn sqlgetconnectattr(sqlhdbc connectionhandle,sqlinteger attribute,sqlpointer valueptr,sqlinteger stringlength);<br><br>應(yīng)用程序可以根據(jù)自己的需要設(shè)置不同的連接屬性。<br><br>完成對(duì)連接屬性的設(shè)置之后,就可以建立到數(shù)據(jù)源的連接了。對(duì)于不同的程序和用戶接口,可以用不同的函數(shù)建立連接:sqlconnect、sqldriverconnect、sqlbrowseconnect。<br><br>sqlconnect<br><br>該函數(shù)提供了最為直接的程序控制方式,我們只要提供數(shù)據(jù)源名稱、用戶id和口令,就可以進(jìn)行連接了。<br><br>函數(shù)格式:<br><br>sqlreturn sqlconnect(sqlhdbc connectionhandle,sqlchar servername,sqlsmallint namelength1,sqlchar username,sqlsmallint namelength2,sqlchar *authentication,sqlsmallint namelength3);<br><br>參數(shù):<br><br>connectionhandle 連接句柄<br><br>servername 數(shù)據(jù)源名稱<br><br>namelength1 數(shù)據(jù)源名稱長度<br><br>username 用戶id<br><br>namelength2 用戶id長度<br><br>authentication 用戶口令<br><br>namelength3 用戶口令長度<br><br>返回值:<br><br>sql_success, sql_success_with_info, sql_error, or sql_invalid_handle.<br><br>成功返回sql_success,如果返回值為sql_error或sql_success_with_info,可以用函數(shù)sqlgetdiagrec獲取相應(yīng)sqlstate的值。<br><br> <br><br>下面的代碼演示了如何使用odbc api的sqlconnect函數(shù)建立同數(shù)據(jù)源sqlserver的連接。<br><br> <br><br>#include “sqlext.h”<br><br>sqlhenv henv;;<br><br>sqlhdbc hdbc;<br><br>sqlhstmt hstmt;<br><br>sqlreturn retcode;<br><br>/*allocate environment handle */<br><br>retcode = sqlallochandle(sql_handle_env, sql_null_handle, &henv); <br><br>if (retcode == sql_success ¦¦ retcode == sql_success_with_info) {<br><br>/* set the odbc version environment attribute */<br><br>retcode = sqlsetenvattr(henv, sql_attr_odbc_version, (void*)sql_ov_odbc3, 0); <br><br>if (retcode == sql_success ¦¦ retcode == sql_success_with_info) {<br><br>/* allocate connection handle */<br><br>retcode = sqlallochandle(sql_handle_dbc, henv, &hdbc); <br><br>if (retcode == sql_success ¦¦ retcode == sql_success_with_info) {<br><br>/* set login timeout to 5 seconds. */<br><br>sqlsetconnectattr(hdbc, (void*)sql_login_timeout, 5, 0);<br><br>/* connect to data source */<br><br>retcode = sqlconnect(hdbc, (sqlchar*) "sales", sql_nts,<br><br>(sqlchar*) "johns", sql_nts,<br><br>(sqlchar*) "sesame", sql_nts);<br><br>if (retcode == sql_success ¦¦ retcode == sql_success_with_info){<br><br>/* allocate statement handle */<br><br>retcode = sqlallochandle(sql_handle_stmt, hdbc, &hstmt); <br><br>if (retcode == sql_success ¦¦ retcode == sql_success_with_info) {<br><br>/* process data */;<br><br>sqlfreehandle(sql_handle_stmt, hstmt);<br><br>}<br><br>sqldisconnect(hdbc);<br><br>}<br><br>sqlfreehandle(sql_handle_dbc, hdbc); <br><br>} <br><br>}<br><br>sqlfreehandle(sql_handle_env, henv);<br><br>sqldriveconnect<br><br>函數(shù)sqldriveconnect用一個(gè)連接字符串建立至數(shù)據(jù)源的連接。它可以提供比sqlconnect函數(shù)的三個(gè)參數(shù)更多的信息,可以讓用戶輸入必要的連接信息。<br><br>如果連接建立,該函數(shù)返回完整的字符串,應(yīng)用程序可使用該連接字符串建立另外的連接。<br><br>函數(shù)格式:<br><br>sqlreturn sqldriverconnect(sqlhdbc connectionhandle,sqlhwnd windowhandle,sqlchar inconnectionstring,sqlsmallint stringlength1,sqlchar outconnetionstring,sqlsmallint bufferlength,sqlsmallint *stringlength2ptr,sqlsmallint drivercompletion);<br><br>參數(shù):<br><br>connectionhandle 連接句柄<br><br>windowhandle 窗口句柄,應(yīng)用程序可以用父窗口的句柄,或用null指針<br><br>inconnectionstring 連接字符串長度<br><br>outconnectionstring 一個(gè)指向連接字符中的指針<br><br>bufferlength 存放連接字符串的緩沖區(qū)的長度<br><br>stringlength2ptr 返回的連接字符串中的字符數(shù)<br><br>drivercompletion 額外連接信息,可能取值有:sql_driver_prompt,<br><br>sql_driver_complete, <br><br>sql_driver_complete_required, or<br><br>sql_driver_noprompt.<br><br>返回值:<br><br>sql_success, sql_success_with_info, sql_error, or sql_invalid_handle.<br><br>成功返回sql_success,如果返回值為sql_error或sql_success_with_info,可以用函數(shù)sqlgetdiagrec獲取相應(yīng)sqlstate的值。<br><br> <br><br>sqlbrowseconnect<br><br>函數(shù)sqlbrowseconnect支持以一種迭代的方式獲取到數(shù)據(jù)源的連接,直到最后建立連接。它是基于客房機(jī)/服務(wù)器的體系結(jié)構(gòu),因此,本地?cái)?shù)據(jù)庫不支持該函數(shù)。<br><br>一般,我們提供部分連接信息,如果足以建立到數(shù)據(jù)源的連接,則成功建立連接,否則返回sql__need__data,并在outconnectionstring參數(shù)中返回所需要的信息。<br><br>函數(shù)格式:<br><br>sqlreturn sqlbrowseconnect(sqlhdbc connectionhandle,sqlchar* inconnectionstring,sqlsamllint stringlength1,sqlchar* outconnectionstring,sqlsmallint bufferlength,sqlsmallint *stringlength2ptr);<br><br>參數(shù):<br><br>connectionhandle 連接句柄<br><br>inconnectionstring 指向輸出字符串的指針<br><br>stringlength1 輸出字符串的指針長度<br><br>outconnectionstring 指向輸出字符串的指針<br><br>bufferlength 用于存放輸出字符串的緩沖區(qū)的長度<br><br>stringlength2ptr 實(shí)際返回的字符串的長度<br><br> <br><br>返回值:<br><br>sql_success, sql_success_with_info, sql_error, or sql_invalid_handle.<br><br>成功返回sql_success,如果返回值為sql_error或sql_success_with_info,可以用函數(shù)sqlgetdiagrec獲取相應(yīng)sqlstate的值。<br><br> <br><br>下面的代碼講述了如何使用odbc api的sqlbrowseconnect函數(shù)建立同數(shù)據(jù)源的連接。<br><br> <br><br>#define brws_len 100sqlhenv <br><br>henv;sqlhdbc hdbc;<br><br>sqlhstmt hstmt;<br><br>sqlreturn retcode;<br><br>sqlchar szconnstrin[brws_len], szconnstrout[brws_len];<br><br>sqlsmallint cbconnstrout;/* allocate the environment handle. */<br><br>retcode = sqlallochandle(sql_handle_env, sql_null_handle, &henv); <br><br>if (retcode == sql_success ¦¦ retcode == sql_success_with_info) {<br><br>/* set the version environment attribute. */<br><br>retcode = sqlsetenvattr(henv, sql_attr_odbc_version, sql_ov_odbc3, 0);<br><br>if (retcode == sql_success ¦¦ retcode == sql_success_with_info) {<br><br>/* allocate the connection handle. */<br><br>retcode = sqlallochandle(sql_handle_dbc, henv, &hdbc);<br><br>if (retcode == sql_success ¦¦ retcode == sql_success_with_info) {<br><br>/* call sqlbrowseconnect until it returns a value other than */<br><br>/* sql_need_data (pass the data source name the first time). */<br><br>/* if sql_need_data is returned, call getuserinput (not */<br><br>/* shown) to build a dialog from the values in szconnstrout. */<br><br>/* the user-supplied values are returned in szconnstrin, */<br><br>/* which is passed in the next call to sqlbrowseconnect. */<br><br>lstrcpy(szconnstrin, "dsn=sales"); do {<br><br>retcode = sqlbrowseconnect(hdbc, szconnstrin, sql_nts,<br><br>szconnstrout, brws_len, &cbconnstrout);<br><br>if (retcode == sql_need_data)<br><br>getuserinput(szconnstrout, szconnstrin);<br><br>} while (retcode == sql_need_data);<br><br>if (retcode == sql_success ¦¦ retcode == sql_success_with_info){<br><br>/* allocate the statement handle. */<br><br>retcod<br><br>
</DIV></div></div>
<script src='../../../develop/get_readnum.asp?id=
309
'></script>
</center></BODY></HTML>
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -