摘要
本文討論了VisualBasic應用程序訪問SQLServer數據的幾中常用的方法,分別說明了每種方法的內部機理並給出了每種方法的一個簡單的實例,最後比較了每種方法的性能和優缺點。
引言
MicrosoftVisualBasic(簡稱VB)作為一種面向對象的可視化編程工具,具有簡單易學的,靈活方便和易於擴充的特點。而且Microsoft為其提供了與SQLServer通信的API函數集及工具集。因此它越來越多地用作大型公司數據和客戶機—服務器應用程序的前端。與後端的MicrosoftSQLServer相結合,VB能夠提供一個魯棒的、高性能的客戶機—服務器方案。
使用VisualBasic作為前端開發語言,與SQLServer接口有三種常用的方法,即:
*數據訪問對象/Jet
*為ODBCAPI編程
*使用SQLServer的VisualBasic庫(VBSQL)為DB庫API編程
本文將討論這三種VB應用程序管理SQLServer數據的方法,並比較每種方法的性
能和優缺點。
方法1.數據訪問對象/JetVisualBasic支持DataAccessObjects(DAOs)的子集。DAO的方法雖然不是性能最好的管理客戶機—服務器之間的對話方式,但它確有許多優點。使用DAOs訪問SQLServer的過程如下:應用程序准備好語句並送至Jet,Jet引擎(MASJT200.DLL)優化查詢,載入驅動程序管理器並與之通訊,驅動程序管理器(ODBC.DLL)通地調用驅動器(SQLSRVR.DLL)的函數,實現連接到數據源,翻譯並向SQLServer提交SQL語句且返回結果。下面是一個用DAOs訪問SQLServer的VB實例。
'FormDeclarations
DimmydbAsDatabase
DimmydynasetAsDynaset
PrivateSubForm_Load()
Setmydb=OpenDatabase("",Fa|se,Fa|se,"ODBC;DSN=Myserver;WSID=LCL;DATABASE=sa|es")
Setmydynaset=mydbCreateDynaset("Select*fromCustomers")
EndSub
上述例子是以非獨占、非只讀方式打開sales數據庫,並檢索Customers表中的所有字段。OpenDatabase函數的最後一個參數是ODBC連接字符串參數,它指明了MicrosoftAccess連接到SQLServer所需要知道的一些內容。其中“DSN”為數據源名,“WSID”為工作站名,
“DATABASE”為所要訪問的數據庫名。
方法2.用ODBCAPI編程
ODBC(OpenDatabaseConnectivity)的思想是訪問異種數據庫的一種可移植的方式。與數據資源對話的公用函數組裝在一個稱為驅動程序管理器(ODBC.DLL)的動態連接中。應用程序調用驅動程序管理器中的函數,而驅動程序管理器反過來通過驅動器反過來通來驅動器(SQLSRVR.DLL)把它們送到服務器中。
用ODBCAPI編程,一般要用到以下一些函數。下面列出了常用的函數以及它們的功能。
函數功能
SQLALLocEnv初始化ODBC環境,返回環境句柄
SQLALLocConnect為連接句柄分配內存並返回連接句柄
SQLConnect連接一個SQL數據資源
SQLDriverConnect連接一個SQL數據資源,允許驅動器向用戶詢問信息
SQLALLocStmt為語句句柄分配內存並返回語句句柄
SQLExecDirect把SQL語句送到服務器
SQLFetchAdvances到結果集的下一行(或第一行)
SQLGetData從結果集的特定的一列取回數據
SQLFreeStmt釋放與語句句柄相關的資源
SQLDisconnect切斷連接
SQLFreeConnect釋放與連接句柄相關的資源
SQLFreeEnv釋放與環境句柄相關的資源
下面的代碼使用上面一些函數先登錄到一個服務器數據庫,並為隨後的工作設置了語句
句柄。
G|oba|giHEnvAsLong
G|oba|giHDBAsLong
G|oba|giHStmtAsLong
DimmyResultAsinteger
DimmyConnectionAsSrting
DimmyBuffAsString*256
DimmyBufflenAsInteger
IfSQLA||ocEnv(giHEnv)<>SQL_SUCCESSThen
MsgBox"A||ocationcouldn'thappen!"
Endif
ifSQL||ocConnect(giHEnv,giHDB)<>SQL_SUCCESSThen
MsgBox"SQLServercouldn'tconnect!"
Endif
myConnection="DSN=myServer;UID=|c|;PWD=;APP=ODBCTest;WS|D=LCL;DATABASE=sales"
myResult=SQLDriverConnect(giHDB,Test,form1.hWnd,myConnection.len(myConnection),
myBuff,256,myBufflen,SQL_DRIVER_COMPLETE_REQUIED)
myResult=SQLA||ocStmt(giHDS,giHStmt)
myResult=SQLFreeStmt(giHStmt,SQL_COLSE)
rsSQL="Select*fromCustomersWhereCity="Wuhan""
myResult=SQLExecDirect(giHStmt,rsSQL,Len(rsSQL))
方法3.使用VBSQL對DB庫API編程
DB庫是SQLServer的本地API,SQLServer的VisualBasic庫(VBSQL)為VisualBasic程序員提供API。從一定意義上說,VBSQL是連接VisualBasic程序到SQLServer的性能最好最直接的方式。VBSQL包含以下三個文件:
VBSQL.VBX包含庫函數,具有訪問重要的消息和處理錯誤的能力
VBSQL.BI包括所有的常量和變量說明
VBSQL.HLPWindows幫助文件,使用VBSQL的指南
使用VBSQL時,必需將VBSQL.BI加入到VisualBasic工程文件中,並確保VB程序運行時有VBSQL.VBX文件。
一個典型的VBSQL對話中,一般要用到以下這些函數。
函數功能
Sq||nit在客戶機上裝載DB庫
Sq|OpenConnection打開服務器連接,返回連接句柄
Sq|Cmd在客戶機上建立批處理命令
Sq|Exec向服務器提交批處理命令
Sq|rexu|ts把客戶機定位在第一條(或下一條)結果集的開端
Sq|NextRow驅動每個結果集的行之間的循環
Sq|Data訪問一個特定列的數據
Sq|C|ose切斷特定的連接
Sq|Exit切斷所有找開的連接
Sq|WinExit卸下DB庫
一般的DB庫API編程的過程是這樣的:先通過調用SqlInit對DB庫進行初始化,再調用
SqlConnection打開一個連接,然後就可做一些工作。下面的代碼是一個初始化DB庫並
登錄到服務器的通用例程。
PrivateSub|nitia|izeApp|ication()
DBL|B-VERS|ON●=Sq||nit●()
|fDBL|B_VERS|ON●=""Then
MsgBox"Couldnotinitia|izeDBL|B!Exitapp|ication.",MB_|CONEXCLAMAT|ON
End
Endif
EndSub
PrivateFunctionLoginToServer()Asinteger
loginToServer=SUCCEED
Status=Sq|SetloginTime(loginTimeOut)
|fgiSq|Conn<>0Then
Sq|C|ose(giSq|Conn)'關閉已打開的連接
giSq|Conn=Sq|OpenConnection(gsServerName,gsLogin|D,gsPassword,ProgramName●,ProgramName●)
|fgiSq|Conn<>oThen
|iresu|t=Sq|Use(giSq|Conn,"Sales")
Else
LogintoServer=FA|L
End|f
EndFunction
性能比較
以上三種訪問SQLServer的方法各有各的特點。DAOs方法是基於對象的,因而便於使用,但是它從VisualBasic到SQLServer的最慢的方式。ODBCAPI和VBSQL方法從本質上講是基於程序的。ODBCAPI方法通用性好,允許最強的互操作性,編程簡單,但速度慢於VBSQL方法。VBSQL方法通過VBSQL控件,提供了重要的SQL`Server前端應用程序所需的靈活性、強大功能和良好性能。它具有真正的事件驅動及錯誤處理能力,完全支持異步處理、游標和計算列等。這些都是VBSQL方法超出其它方法的優勢,但其編程稍復雜。至於實際使用哪一種接口方式,在很大程度上依賴於用戶的應用程序的具體情況而定。->