本文討論了Visual Basic應(yīng)用程序訪問(wèn)SQL Server數(shù)據(jù)庫(kù)的幾種常用的方法,分別說(shuō)明了每種方法的內(nèi)部機(jī)理并給出了每種方法的一個(gè)簡(jiǎn)單的實(shí)例,最后比較了每種方法性能和優(yōu)缺點(diǎn)。
一、引言
SQL Server是微軟推出的中小型網(wǎng)絡(luò)數(shù)據(jù)庫(kù)系統(tǒng),是目前最常用的數(shù)據(jù)庫(kù)系統(tǒng)之一。隨著SQL Server網(wǎng)絡(luò)數(shù)據(jù)庫(kù)應(yīng)用程序日益增多,這種Web數(shù)據(jù)庫(kù)應(yīng)用系統(tǒng)的正常運(yùn)行一般依賴于已存在的用戶數(shù)據(jù)庫(kù)。創(chuàng)建維護(hù)數(shù)據(jù)庫(kù)的工作可用SQL Server提供的SQL EntERPrise Manager工具來(lái)進(jìn)行,如能提供一種定制的數(shù)據(jù)庫(kù)管理工具,通過(guò)管理應(yīng)用程序來(lái)管理數(shù)據(jù)庫(kù)及其設(shè)備,對(duì)用戶來(lái)說(shuō)無(wú)疑是最理想的。
Visual Basic作為一種面向?qū)ο蟮目梢暬幊坦ぞ?,具有?jiǎn)單易學(xué),靈活方便和易于擴(kuò)充的特點(diǎn)。而且Microsoft為其提供了與SQL Server通信的API函數(shù)集及工具集,因此它越來(lái)越多地用作大型公司數(shù)據(jù)和客戶機(jī)—服務(wù)器應(yīng)用程序的前端,與后端的Microsoft SQL Server相結(jié)合,VB能夠提供一個(gè)高性能的客戶機(jī)—服務(wù)器方案?! ?BR> 二、VB訪問(wèn)SQL Server數(shù)據(jù)的常用方法
使用Visual Basic作為前端開(kāi)發(fā)語(yǔ)言,與SQL Server接口有幾種常用的方法,即:
①數(shù)據(jù)訪問(wèn)對(duì)象/Jet
②為ODBC API編程
③使用SQL Server的Visual Basic庫(kù)(VBSQL)為DB庫(kù)的API編程
④RDO 遠(yuǎn)程數(shù)據(jù)對(duì)象(RemoteData Objects)
⑤ADO 數(shù)據(jù)對(duì)象(Active Data Objects)
1、數(shù)據(jù)訪問(wèn)對(duì)象/Jet
VB支持Data Access Objects(DAOs)的子集。DAO的方法雖然不是性能的管理客戶機(jī)—服務(wù)器之間的對(duì)話方式,但它的確有許多優(yōu)點(diǎn)。DAO/Jet是為了實(shí)現(xiàn)從VB訪問(wèn)Access數(shù)據(jù)庫(kù)而開(kāi)發(fā)的程序接口對(duì)象。使用DAOs訪問(wèn)SQL Server的過(guò)程如下:應(yīng)用程序準(zhǔn)備好語(yǔ)句并送至Jet,Jet引擎(MASJT200.DLL)優(yōu)化查詢,載入驅(qū)動(dòng)程序管理器并與之通訊,驅(qū)動(dòng)程序管理器(ODBC.DLL)通過(guò)調(diào)用驅(qū)動(dòng)器(SQLSRVR.DLL)的函數(shù),實(shí)現(xiàn)連接到數(shù)據(jù)源,翻譯并向SQL Server提交SQL語(yǔ)句且返回結(jié)果。下面是一個(gè)用DAOs訪問(wèn)SQL Server的VB實(shí)例?! ?BR> 注釋:Form Declarations
Dim mydb As Database
Dim mydynaset As Dynaset オ
Private Sub Form_Load()
Set mydb = OpenDatabase("", False, False, "ODBC; DSN=Myserver; WSID=LCL; DATABASE = sales")
Set mydynaset = mydb CreateDynaset("Select*from Customers") オ
End Sub ァ
上述例子是以非獨(dú)占、非只讀方式打開(kāi)sales數(shù)據(jù)庫(kù),并檢索Customers表中的所有字段。OpenDatabase函數(shù)的最后一個(gè)參數(shù)是ODBC連接字符串參數(shù),它指明了Microsoft Access連接到SQL Server所需要知道的一些內(nèi)容。其中“DSN”為數(shù)據(jù)源名,“WSID”為工作站名,“DATABASE”為所要訪問(wèn)的數(shù)據(jù)庫(kù)名。
2、利用ODBC API編程
ODBC(Open Database Connectivity)的思想是訪問(wèn)異種數(shù)據(jù)庫(kù)的一種可移植的方式。與數(shù)據(jù)資源對(duì)話的公用函數(shù)組裝在一個(gè)稱為驅(qū)動(dòng)程序管理器(ODBC.DLL)的動(dòng)態(tài)連接中。應(yīng)用程序調(diào)用驅(qū)動(dòng)程序管理器中的函數(shù),而驅(qū)動(dòng)程序管理器反過(guò)來(lái)通過(guò)驅(qū)動(dòng)器(SQLSRVR.DLL)把它們送到服務(wù)器中。
下面的代碼使用上面一些函數(shù)先登錄到一個(gè)服務(wù)器數(shù)據(jù)庫(kù),并為隨后的工作設(shè)置了語(yǔ)句句柄。
Global giHEnv As Long
Global giHDB As Long
Global giHStmt As Long
Dim myResult As integer
Dim myConnection As Srting
Dim myBuff As String*256
Dim myBufflen As Integer
If SQLAllocEnv(giHEnv)<>SQL_SUCCESS Then
MsgBox"Allocation couldn注釋:t happen!"
End If
If SQLAllocConnect(giHEnv,giHDB)<>SQL_SUCCESS Then
MsgBox "SQL Server couldn注釋:t connect!"
End If
myConnection="DSN=myServer;UID=LCL;PWD=;APP=ODBCTest;WSID=LCL;DATABASE=sales"
myResult=SQLDriverConnect(giHDB,Test,form1.hWnd,myConnection.len(myConnection),myBuff,256,myBufflen,SQL_DRIVER_COMPLETE_REQU IE D)
myResult=SQLAllocStmt(giHDS,giHStmt)
myResult=SQLFreeStmt(giHStmt,SQL_COLSE)
rsSQL="Select * from Customers Where City = "Hunan""
myResult = SQLExecDirect(giHStmt,rsSQL,Len(rsSQL))
一、引言
SQL Server是微軟推出的中小型網(wǎng)絡(luò)數(shù)據(jù)庫(kù)系統(tǒng),是目前最常用的數(shù)據(jù)庫(kù)系統(tǒng)之一。隨著SQL Server網(wǎng)絡(luò)數(shù)據(jù)庫(kù)應(yīng)用程序日益增多,這種Web數(shù)據(jù)庫(kù)應(yīng)用系統(tǒng)的正常運(yùn)行一般依賴于已存在的用戶數(shù)據(jù)庫(kù)。創(chuàng)建維護(hù)數(shù)據(jù)庫(kù)的工作可用SQL Server提供的SQL EntERPrise Manager工具來(lái)進(jìn)行,如能提供一種定制的數(shù)據(jù)庫(kù)管理工具,通過(guò)管理應(yīng)用程序來(lái)管理數(shù)據(jù)庫(kù)及其設(shè)備,對(duì)用戶來(lái)說(shuō)無(wú)疑是最理想的。
Visual Basic作為一種面向?qū)ο蟮目梢暬幊坦ぞ?,具有?jiǎn)單易學(xué),靈活方便和易于擴(kuò)充的特點(diǎn)。而且Microsoft為其提供了與SQL Server通信的API函數(shù)集及工具集,因此它越來(lái)越多地用作大型公司數(shù)據(jù)和客戶機(jī)—服務(wù)器應(yīng)用程序的前端,與后端的Microsoft SQL Server相結(jié)合,VB能夠提供一個(gè)高性能的客戶機(jī)—服務(wù)器方案?! ?BR> 二、VB訪問(wèn)SQL Server數(shù)據(jù)的常用方法
使用Visual Basic作為前端開(kāi)發(fā)語(yǔ)言,與SQL Server接口有幾種常用的方法,即:
①數(shù)據(jù)訪問(wèn)對(duì)象/Jet
②為ODBC API編程
③使用SQL Server的Visual Basic庫(kù)(VBSQL)為DB庫(kù)的API編程
④RDO 遠(yuǎn)程數(shù)據(jù)對(duì)象(RemoteData Objects)
⑤ADO 數(shù)據(jù)對(duì)象(Active Data Objects)
1、數(shù)據(jù)訪問(wèn)對(duì)象/Jet
VB支持Data Access Objects(DAOs)的子集。DAO的方法雖然不是性能的管理客戶機(jī)—服務(wù)器之間的對(duì)話方式,但它的確有許多優(yōu)點(diǎn)。DAO/Jet是為了實(shí)現(xiàn)從VB訪問(wèn)Access數(shù)據(jù)庫(kù)而開(kāi)發(fā)的程序接口對(duì)象。使用DAOs訪問(wèn)SQL Server的過(guò)程如下:應(yīng)用程序準(zhǔn)備好語(yǔ)句并送至Jet,Jet引擎(MASJT200.DLL)優(yōu)化查詢,載入驅(qū)動(dòng)程序管理器并與之通訊,驅(qū)動(dòng)程序管理器(ODBC.DLL)通過(guò)調(diào)用驅(qū)動(dòng)器(SQLSRVR.DLL)的函數(shù),實(shí)現(xiàn)連接到數(shù)據(jù)源,翻譯并向SQL Server提交SQL語(yǔ)句且返回結(jié)果。下面是一個(gè)用DAOs訪問(wèn)SQL Server的VB實(shí)例?! ?BR> 注釋:Form Declarations
Dim mydb As Database
Dim mydynaset As Dynaset オ
Private Sub Form_Load()
Set mydb = OpenDatabase("", False, False, "ODBC; DSN=Myserver; WSID=LCL; DATABASE = sales")
Set mydynaset = mydb CreateDynaset("Select*from Customers") オ
End Sub ァ
上述例子是以非獨(dú)占、非只讀方式打開(kāi)sales數(shù)據(jù)庫(kù),并檢索Customers表中的所有字段。OpenDatabase函數(shù)的最后一個(gè)參數(shù)是ODBC連接字符串參數(shù),它指明了Microsoft Access連接到SQL Server所需要知道的一些內(nèi)容。其中“DSN”為數(shù)據(jù)源名,“WSID”為工作站名,“DATABASE”為所要訪問(wèn)的數(shù)據(jù)庫(kù)名。
2、利用ODBC API編程
ODBC(Open Database Connectivity)的思想是訪問(wèn)異種數(shù)據(jù)庫(kù)的一種可移植的方式。與數(shù)據(jù)資源對(duì)話的公用函數(shù)組裝在一個(gè)稱為驅(qū)動(dòng)程序管理器(ODBC.DLL)的動(dòng)態(tài)連接中。應(yīng)用程序調(diào)用驅(qū)動(dòng)程序管理器中的函數(shù),而驅(qū)動(dòng)程序管理器反過(guò)來(lái)通過(guò)驅(qū)動(dòng)器(SQLSRVR.DLL)把它們送到服務(wù)器中。
下面的代碼使用上面一些函數(shù)先登錄到一個(gè)服務(wù)器數(shù)據(jù)庫(kù),并為隨后的工作設(shè)置了語(yǔ)句句柄。
Global giHEnv As Long
Global giHDB As Long
Global giHStmt As Long
Dim myResult As integer
Dim myConnection As Srting
Dim myBuff As String*256
Dim myBufflen As Integer
If SQLAllocEnv(giHEnv)<>SQL_SUCCESS Then
MsgBox"Allocation couldn注釋:t happen!"
End If
If SQLAllocConnect(giHEnv,giHDB)<>SQL_SUCCESS Then
MsgBox "SQL Server couldn注釋:t connect!"
End If
myConnection="DSN=myServer;UID=LCL;PWD=;APP=ODBCTest;WSID=LCL;DATABASE=sales"
myResult=SQLDriverConnect(giHDB,Test,form1.hWnd,myConnection.len(myConnection),myBuff,256,myBufflen,SQL_DRIVER_COMPLETE_REQU IE D)
myResult=SQLAllocStmt(giHDS,giHStmt)
myResult=SQLFreeStmt(giHStmt,SQL_COLSE)
rsSQL="Select * from Customers Where City = "Hunan""
myResult = SQLExecDirect(giHStmt,rsSQL,Len(rsSQL))