国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 學(xué)院 > 開(kāi)發(fā)設(shè)計(jì) > 正文

直接使用ODBCAPI訪問(wèn)數(shù)據(jù)庫(kù)的VB程序

2019-11-18 17:47:09
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友
----開(kāi)放數(shù)據(jù)庫(kù)互連(ODBC)已經(jīng)成為Client/Server數(shù)據(jù)庫(kù)應(yīng)用系統(tǒng)中訪問(wèn)遠(yuǎn)程數(shù)據(jù)庫(kù)的一個(gè)標(biāo)準(zhǔn)。做為強(qiáng)大的前端開(kāi)發(fā)工具,MSVisualBasic為開(kāi)發(fā)者提供了多種訪問(wèn)ODBC數(shù)據(jù)源的途徑,如JET數(shù)據(jù)庫(kù)引擎、ODBCAPI函數(shù)、RDO接口等。比較而言,直接使用ODBCAPI函數(shù)的編程難度最大,但由此獲得的存取數(shù)據(jù)庫(kù)的性能也是最佳。誠(chéng)然,VB4.0企業(yè)版提供的RDO接口的性能已經(jīng)接近ODBCAPI,但是遺憾的是,這個(gè)接口只能在32位Windows環(huán)境中運(yùn)行,而ODBCAPI函數(shù)則沒(méi)有這個(gè)限制。

----ODBCAPI函數(shù)的聲明方法

----與使用其它動(dòng)態(tài)庫(kù)函數(shù)一樣,在VB中使用ODBCAPI函數(shù)之前,必須事先聲明將要使用的函數(shù)、常量和數(shù)據(jù)結(jié)構(gòu)。ODBCAPI函數(shù)駐留在ODBC運(yùn)行動(dòng)態(tài)庫(kù)ODBC.DLL(16位)或ODBC32.DLL(32位)中,該動(dòng)態(tài)庫(kù)位于Windows子目錄system中。通常做法是在VB項(xiàng)目中單獨(dú)使用一個(gè)模塊文件,然后將ODBCAPI聲明語(yǔ)句加入其中,如下所示,就是本文實(shí)例中使用的模塊文件module1.bas的內(nèi)容:

DeclareFunctionSQLAllocEnvLib"odbc32.dll"(phenv&)AsInteger
DeclareFunctionSQLAllocConnectLib"odbc32.dll"(ByValhenv&,phdbc&)AsInteger
DeclareFunctionSQLAllocStmtLib"odbc32.dll"(ByValhdbc&,phstmt&)AsInteger
DeclareFunctionSQLConnectLib"odbc32.dll"(ByValhdbc&,ByValszDSN$,ByValcbDSN,ByValszUID$,ByValcbUID,ByValszAuthStr$,ByValcbAuthStr)AsInteger
DeclareFunctionSQLColAttributesStringLib"odbc32.dll"Alias"SQLColAttributes"(ByValhstmt&,ByValicol,ByValfDescType,ByValrgbDescAsString,ByValcbDescMax,pcbDesc,pfDesc&)AsInteger
DeclareFunctionSQLDisconnectLib"odbc32.dll"(ByValhdbc&)AsInteger
DeclareFunctionSQLExecDirectLib"odbc32.dll"(ByValhstmt&,ByValszSqlStr$,ByValcbSqlStr&)AsInteger
DeclareFunctionSQLFetchLib"odbc32.dll"(ByValhstmt&)AsInteger
DeclareFunctionSQLFreeConnectLib"odbc32.dll"(ByValhdbc&)AsInteger
DeclareFunctionSQLFreeEnvLib"odbc32.dll"(ByValhenv&)AsInteger
DeclareFunctionSQLFreeStmtLib"odbc32.dll"(ByValhstmt&,ByValfOption)AsInteger
DeclareFunctionSQLGetDataLib"odbc32.dll"(ByValhstmt&,ByValicol,ByValfCType,ByValrgbValueAsString,ByValcbValueMax&,pcbValue&)AsInteger
DeclareFunctionSQLNumResultColsLib"odbc32.dll"(ByValhstmt&,pccol)AsInteger
GlobalConstSQL_C_CHARAsLong=1
GlobalConstSQL_COLUMN_LABELAsLong=18
GlobalConstSQL_DROPAsLong=1
GlobalConstSQL_ERRORAsLong=-1
GlobalConstSQL_NO_DATA_FOUNDAsLong=100
GlobalConstSQL_SUCCESSAsLong=0

----需要說(shuō)明的是,在函數(shù)聲明時(shí),應(yīng)該根據(jù)程序的運(yùn)行環(huán)境選擇相應(yīng)的動(dòng)態(tài)庫(kù)。在VB子目錄samples/remauto/db_odbc中有兩個(gè)正文文件ODBC16.TXT和ODBC32.TXT,分別存有所有16位和32位ODBCAPI函數(shù)、常量和數(shù)據(jù)結(jié)構(gòu)的聲明語(yǔ)句,編程時(shí)可以從中拷貝所需的聲明語(yǔ)句。

----使用ODBCAPI的編程方法

----在VB中調(diào)用ODBCAPI函數(shù)訪問(wèn)ODBC數(shù)據(jù)庫(kù),代碼編制一般是按照下列過(guò)程進(jìn)行的:

----一、初始化ODBC

----在這個(gè)過(guò)程中,應(yīng)用程序?qū)⑼ㄟ^(guò)調(diào)用SQLAlloEnv函數(shù)初始化ODBC接口,獲取ODBC環(huán)境句柄。ODBC環(huán)境句柄是其它所有ODBC資源句柄的父句柄,因此無(wú)論程序?qū)⒔⒍嗌賯€(gè)ODBC連接,這個(gè)過(guò)程只需執(zhí)行一次即可。例如:

DimrcAsInteger'ODBC函數(shù)的返回碼
DimhenvAsLong'ODBC環(huán)境句柄
rc=SQLAllocEnv(henv)'獲取ODBC環(huán)境句柄

----二、與ODBC數(shù)據(jù)源建立連接

----這個(gè)過(guò)程由下列兩個(gè)步驟組成:

----1、調(diào)用SQLAllocConnect函數(shù)獲取連接句柄。例如:

DimhdbcAsLong'連接句柄
rc=SQLAllocConnect(henv,hdbc)'獲取連接句柄

----2、建立連接。這個(gè)步驟可以通過(guò)多種方法實(shí)現(xiàn),最簡(jiǎn)單直觀的方法是調(diào)用SQLConnect函數(shù)。例如:

DimDSNAsString,UIDAsString,PWDAsString
DSN="DataSourceName"'ODBC數(shù)據(jù)源名稱(chēng)
UID="UserID"'用戶帳號(hào)
PWD="PassWord"'用戶口令
rc=SQLConnect(hdbc,DSN,Len(DSN),UID,
Len(UID),PWD,Len(PWD))'建立連接

----三、存取數(shù)據(jù)

----用戶對(duì)ODBC數(shù)據(jù)源的存取操作,都是通過(guò)SQL語(yǔ)句實(shí)現(xiàn)的。在這個(gè)過(guò)程中,應(yīng)用程序?qū)⑼ㄟ^(guò)連接向ODBC數(shù)據(jù)庫(kù)提交SQL語(yǔ)句,以完成用戶請(qǐng)求的操作。具體步驟如下:

----1、調(diào)用SQLAllocStmt函數(shù)獲取語(yǔ)句句柄。例如:

DimhstmtAsLong
rc=SQLAllocStmt(hdbc,hstmt)

----2、執(zhí)行SQL語(yǔ)句。執(zhí)行SQL語(yǔ)句的方法比較多,最簡(jiǎn)單明了的方法是調(diào)用SQLAllocStmt函數(shù),例如:

DimSQLstmtAsString
SQLstmt="SELECT*FROMauthors"
rc=SQLExecDirect(hstmt,SQLstmt,Len(SQLstmt))

----四、檢索結(jié)果集

----如果SQL語(yǔ)句被順利提交并正確執(zhí)行,那么就會(huì)產(chǎn)生一個(gè)結(jié)果集。檢索結(jié)果集的方法有很多,最簡(jiǎn)單最直接的方法是調(diào)用SQLFetch和SQLGetData函數(shù)。SQLFetch函數(shù)的功能是將結(jié)果集的當(dāng)前記錄指針移至下一個(gè)記錄,SQLGetData函數(shù)的功能是提取結(jié)果集中當(dāng)前記錄的某個(gè)字段值。通常可以采用一個(gè)循環(huán)以提取結(jié)果集中所有記錄的所有字段值,該循環(huán)重復(fù)執(zhí)行SQLFetch和SQLGetData函數(shù),直至SQLFetch函數(shù)返回SQL_NO_DATA_FOUND,這表示已經(jīng)到達(dá)結(jié)果集的末尾。

DimColValAsString*225
ColVal=String(255,0)
DoUntilSQLFetch(hstmt)=SQL_NO_DATA_FOUND
rc=SQLGetData(hstmt,i,SQL_C_CHAR,ColVal,
Len(ColVal),SQL_NULL_DATA)
Loop

----五、結(jié)束應(yīng)用程序

----在應(yīng)用程序完成數(shù)據(jù)庫(kù)操作,退出運(yùn)行之前,必須釋放程序中使用的系統(tǒng)資源。這些系統(tǒng)資源包括:語(yǔ)句句柄、連接句柄和ODBC環(huán)境句柄。完成這個(gè)過(guò)程的步驟如下:

----1、調(diào)用SQLFreeStmt函數(shù)釋放語(yǔ)句句柄及其相關(guān)的系統(tǒng)資源。例如:

rc=SQLFreeStmt(hstmt,SQL_DROP)

----2、調(diào)用SQLDisconnect函數(shù)關(guān)閉連接。例如:

rc=SQLDisconnect(hdbc)

----3、調(diào)用SQLFreeConnect函數(shù)釋放連接句柄及其相關(guān)的系統(tǒng)資源。例如:

rc=SQLFreeConnect(hdbc)

----4、調(diào)用SQLFreeEnv函數(shù)釋放環(huán)境句柄及其相關(guān)的系統(tǒng)資源,停止ODBC操作。例如:

rc=SQLFreeEnv(henv)

----此外,在編制程序時(shí)還有一個(gè)需要重點(diǎn)考慮的問(wèn)題,這就是錯(cuò)誤處理。所有ODBCAPI函數(shù),若在執(zhí)行期間發(fā)生錯(cuò)誤,都將返回一個(gè)標(biāo)準(zhǔn)錯(cuò)誤代碼SQL_ERROR。一般來(lái)講,在每次調(diào)用ODBCAPI函數(shù)之后,都應(yīng)該檢查該函數(shù)返回值,確定該函數(shù)是否成功地執(zhí)行,再?zèng)Q定是否繼續(xù)后續(xù)過(guò)程。而詳細(xì)的錯(cuò)誤信息,可以調(diào)用SQLError函數(shù)獲得。SQLError函數(shù)將返回下列信息:

標(biāo)準(zhǔn)的ODBC錯(cuò)誤狀態(tài)碼

ODBC數(shù)據(jù)源提供的內(nèi)部錯(cuò)誤編碼

錯(cuò)誤信息串
----簡(jiǎn)單應(yīng)用實(shí)例

----本實(shí)例將編制一個(gè)客戶機(jī)端VB應(yīng)用程序,通過(guò)WindowsNT局域網(wǎng)查詢服務(wù)器端MSSQLServer6.5樣板數(shù)據(jù)庫(kù)PUBS中的AUTHORS數(shù)據(jù)表,并在一個(gè)Grid控件中顯示查詢結(jié)果。首先,使用Windows控制面板中的ODBC驅(qū)動(dòng)管理器新建一個(gè)ODBC數(shù)據(jù)源,定義數(shù)據(jù)源名稱(chēng)為ODBC_API_DEMO,定義登錄數(shù)據(jù)庫(kù)為PUBS,其它信息應(yīng)根據(jù)用戶的環(huán)境正確設(shè)置。然后,啟動(dòng)VB,新建一個(gè)項(xiàng)目ExitSub
EndIf
rc=SQLNumResultCols(hstmt,RSCols)
IfRSCols>1Then
Grid1.Cols=RSCols
Grid1.Rows=10
Grid1.Row=0
Else
ExitSub
EndIf
Fori=1ToRSCols
rc=SQLColAttributesString(hstmt,i,
SQL_COLUMN_LABEL,ColVal,255,ColLabLen,larg)
Grid1.Col=i-1
Grid1.Text=Left(ColVal,ColLabLen)
Nexti
DoUntilSQLFetch(hstmt)=SQL_NO_DATA_FOUND
ColVal=String$(1024,0)
IfGrid1.Row 1>=Grid1.RowsThen
Grid1.Rows=Grid1.Rows 1
EndIf
Grid1.Row=Grid1.Row 1
Fori=1ToRSCols
rc=SQLGetData(hstmt,i,SQL_C_CHAR,
ColVal,Len(ColVal),ColValLen)
Grid1.Col=i-1
Grid1.Text=Left$(ColVal,ColValLen)
Nexti
Loop
rc=SQLFreeStmt(hstmt,SQL_DROP)
EndSub
PrivateSubcmdClose_Click()
DimrcAsInteger
Ifhdbc<>0Then
rc=SQLDisconnect(hdbc)
EndIf
rc=SQLFreeConnect(hdbc)
Ifhenv<>0Then
rc=SQLFreeEnv(henv)
EndIf
End
EndSub

----實(shí)例程序是使用VisualBasic4.0在Windows95環(huán)境下開(kāi)發(fā)的。->


發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 彝良县| 黎城县| 永登县| 旅游| 屏东县| 抚顺县| 临澧县| 禹城市| 普宁市| 丰原市| 庄浪县| 岑巩县| 丰镇市| 西贡区| 永州市| 阿克| 西林县| 苗栗市| 读书| 安溪县| 新晃| 台东县| 永靖县| 延边| 普兰县| 体育| 柞水县| 乃东县| 南川市| 桐梓县| 岱山县| 万全县| 昆山市| 乌兰浩特市| 黔南| 句容市| 宜丰县| 龙州县| 宜丰县| 双江| 米易县|