程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> Visual Basic語言 >> VB綜合教程 >> 直接使用ODBCAPI訪問數據庫的VB程序

直接使用ODBCAPI訪問數據庫的VB程序

編輯:VB綜合教程
----開放數據庫互連(ODBC)已經成為Client/Server數據庫應用系統中訪問遠程數據庫的一個標准。做為強大的前端開發工具,MSVisualBasic為開發者提供了多種訪問ODBC數據源的途徑,如JET數據庫引擎、ODBCAPI函數、RDO接口等。比較而言,直接使用ODBCAPI函數的編程難度最大,但由此獲得的存取數據庫的性能也是最佳。誠然,VB4.0企業版提供的RDO接口的性能已經接近ODBCAPI,但是遺憾的是,這個接口只能在32位Windows環境中運行,而ODBCAPI函數則沒有這個限制。
  
  ----ODBCAPI函數的聲明方法
  
  ----與使用其它動態庫函數一樣,在VB中使用ODBCAPI函數之前,必須事先聲明將要使用的函數、常量和數據結構。ODBCAPI函數駐留在ODBC運行動態庫ODBC.DLL(16位)或ODBC32.DLL(32位)中,該動態庫位於Windows子目錄system中。通常做法是在VB項目中單獨使用一個模塊文件,然後將ODBCAPI聲明語句加入其中,如下所示,就是本文實例中使用的模塊文件module1.bas的內容:
  
  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
  
  ----需要說明的是,在函數聲明時,應該根據程序的運行環境選擇相應的動態庫。在VB子目錄samples emautodb_odbc中有兩個正文文件ODBC16.TXT和ODBC32.TXT,分別存有所有16位和32位ODBCAPI函數、常量和數據結構的聲明語句,編程時可以從中拷貝所需的聲明語句。
  
  ----使用ODBCAPI的編程方法
  
  ----在VB中調用ODBCAPI函數訪問ODBC數據庫,代碼編制一般是按照下列過程進行的:
  
  ----一、初始化ODBC
  
  ----在這個過程中,應用程序將通過調用SQLAlloEnv函數初始化ODBC接口,獲取ODBC環境句柄。ODBC環境句柄是其它所有ODBC資源句柄的父句柄,因此無論程序將建立多少個ODBC連接,這個過程只需執行一次即可。例如:
  
  DimrcAsInteger'ODBC函數的返回碼
  DimhenvAsLong'ODBC環境句柄
  rc=SQLAllocEnv(henv)'獲取ODBC環境句柄
  
  ----二、與ODBC數據源建立連接
  
  ----這個過程由下列兩個步驟組成:
  
  ----1、調用SQLAllocConnect函數獲取連接句柄。例如:
  
  DimhdbcAsLong'連接句柄
  rc=SQLAllocConnect(henv,hdbc)'獲取連接句柄
  
  ----2、建立連接。這個步驟可以通過多種方法實現,最簡單直觀的方法是調用SQLConnect函數。例如:
  
  DimDSNAsString,UIDAsString,PWDAsString
  DSN="DataSourceName"'ODBC數據源名稱
  UID="UserID"'用戶帳號
  PWD="Password"'用戶口令
  rc=SQLConnect(hdbc,DSN,Len(DSN),UID,
  Len(UID),PWD,Len(PWD))'建立連接
  
  ----三、存取數據
  
  ----用戶對ODBC數據源的存取操作,都是通過SQL語句實現的。在這個過程中,應用程序將通過連接向ODBC數據庫提交SQL語句,以完成用戶請求的操作。具體步驟如下:
  
  ----1、調用SQLAllocStmt函數獲取語句句柄。例如:
  
  DimhstmtAsLong
  rc=SQLAllocStmt(hdbc,hstmt)
  
  ----2、執行SQL語句。執行SQL語句的方法比較多,最簡單明了的方法是調用SQLAllocStmt函數,例如:
  
  DimSQLstmtAsString
  SQLstmt="SELECT*FROMauthors"
  rc=SQLExecDirect(hstmt,SQLstmt,Len(SQLstmt))
  
  ----四、檢索結果集
  
  ----如果SQL語句被順利提交並正確執行,那麼就會產生一個結果集。檢索結果集的方法有很多,最簡單最直接的方法是調用SQLFetch和SQLGetData函數。SQLFetch函數的功能是將結果集的當前記錄指針移至下一個記錄,SQLGetData函數的功能是提取結果集中當前記錄的某個字段值。通常可以采用一個循環以提取結果集中所有記錄的所有字段值,該循環重復執行SQLFetch和SQLGetData函數,直至SQLFetch函數返回SQL_NO_DATA_FOUND,這表示已經到達結果集的末尾。
  
  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
  
  ----五、結束應用程序
  
  ----在應用程序完成數據庫操作,退出運行之前,必須釋放程序中使用的系統資源。這些系統資源包括:語句句柄、連接句柄和ODBC環境句柄。完成這個過程的步驟如下:
  
  ----1、調用SQLFreeStmt函數釋放語句句柄及其相關的系統資源。例如:
  
  rc=SQLFreeStmt(hstmt,SQL_DROP)
  
  ----2、調用SQLDisconnect函數關閉連接。例如:
  
  rc=SQLDisconnect(hdbc)
  
  ----3、調用SQLFreeConnect函數釋放連接句柄及其相關的系統資源。例如:
  
  rc=SQLFreeConnect(hdbc)
  
  ----4、調用SQLFreeEnv函數釋放環境句柄及其相關的系統資源,停止ODBC操作。例如:
  
  rc=SQLFreeEnv(henv)
  
  ----此外,在編制程序時還有一個需要重點考慮的問題,這就是錯誤處理。所有ODBCAPI函數,若在執行期間發生錯誤,都將返回一個標准錯誤代碼SQL_ERROR。一般來講,在每次調用ODBCAPI函數之後,都應該檢查該函數返回值,確定該函數是否成功地執行,再決定是否繼續後續過程。而詳細的錯誤信息,可以調用SQLError函數獲得。SQLError函數將返回下列信息:
  
  標准的ODBC錯誤狀態碼
  
  ODBC數據源提供的內部錯誤編碼
  
  錯誤信息串
  ----簡單應用實例
  
  ----本實例將編制一個客戶機端VB應用程序,通過WindowsNT局域網查詢服務器端MSSQLServer6.5樣板數據庫PUBS中的AUTHORS數據表,並在一個Grid控件中顯示查詢結果。首先,使用Windows控制面板中的ODBC驅動管理器新建一個ODBC數據源,定義數據源名稱為ODBC_API_DEMO,定義登錄數據庫為PUBS,其它信息應根據用戶的環境正確設置。然後,啟動VB,新建一個項目Project1,在缺省窗體Form1中加入一個Grid控件Grid1、兩個CommandButton控件cmdQuery和cmdClose,在Project1中插入一個模塊Module1,將前面列舉的聲明語句加入其中。程序代碼如下:
  
  PrivateSubForm_Load()
  DimrcAsInteger
  rc=SQLAllocEnv(henv)
  Ifrc<>0Then
  MsgBox"無法初始化ODBC"
  End
  EndIf
  rc=SQLAllocConnect(henv,hdbc)
  Ifrc<>0Then
  MsgBox"無法獲得連接句柄"
  rc=SQLFreeEnv(henv)
  End
  EndIf
  DimDSNAsString,UIDAsString,PWDAsString
  DSN="ODBC_API_DEMO"
  UID="guest"
  PWD=""
  rc=SQLConnect(hdbc,DSN,Len(DSN),
  UID,Len(UID),PWD,Len(UID))
  Ifrc=SQL_ERRORThen
  MsgBox"無法建立與ODBC數據源的連接"
  End
  EndIf
  EndSub
  PrivateSubcmdQuery_Click()
  DimhstmtAsLong
  DimSQLstmtAsString
  DimRSColsAsInteger,RSRowsAsLong
  DimrcAsInteger,iAsInteger,jAsInteger
  DimColValAsString*1024
  DimColValLenAsLong,ColLabLenAsInteger,largAsLong
  rc=SQLAllocStmt(hdbc,hstmt)
  Ifrc<>SQL_SUCCESSThen
  MsgBox"無法獲得SQL語句句柄"
  ExitSub
  EndIf
  SQLstmt="SELECT*FROMauthors"
  rc=SQLExecDirect(hstmt,SQLstmt,Len(SQLstmt))
  Ifrc<>SQL_SUCCESSThen
  MsgBox"SQL語句執行失敗"
  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
  
  ----實例程序是使用VisualBasic4.0在Windows95環境下開發的。->

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved