top
Loading...
如何從VB訪問SQLServer數據庫(1)

一、引言

SQL Server是微軟推出的中小型網絡數據庫系統,是目前最常用的數據庫系統之一。隨著SQL Server網絡數據庫應用程序日益增多,這種Web數據庫應用系統的正常運行一般依賴于已存在的用戶數據庫。創建維護數據庫的工作可用SQL Server提供的SQL Enterprise Manager工具來進行,如能提供一種定制的數據庫管理工具,通過管理應用程序來管理數據庫及其設備,對用戶來說無疑是最理想的。

Visual Basic作為一種面向對象的可視化編程工具,具有簡單易學,靈活方便和易于擴充的特點。而且Microsoft為其提供了與SQL Server通信的API函數集及工具集,因此它越來越多地用作大型公司數據和客戶機—服務器應用程序的前端,與后端的Microsoft SQL Server相結合,VB能夠提供一個高性能的客戶機—服務器方案。

二、VB訪問SQL Server數據的常用方法

使用Visual Basic作為前端開發語言,與SQL Server接口有幾種常用的方法,即:

①數據訪問對象/Jet

②為ODBC API編程

③使用SQL Server的Visual Basic庫(VBSQL)為DB庫的API編程

④RDO 遠程數據對象(RemoteData Objects)

⑤ADO 數據對象(Active Data Objects)

1、數據訪問對象/Jet

VB支持Data Access Objects(DAOs)的子集。DAO的方法雖然不是性能最好的管理客戶機—服務器之間的對話方式,但它的確有許多優點。DAO/Jet是為了實現從VB訪問Access數據庫而開發的程序接口對象。使用DAOs訪問SQL Server的過程如下:應用程序準備好語句并送至Jet,Jet引擎(MASJT200.DLL)優化查詢,載入驅動程序管理器并與之通訊,驅動程序管理器(ODBC.DLL)通過調用驅動器(SQLSRVR.DLL)的函數,實現連接到數據源,翻譯并向SQL Server提交SQL語句且返回結果。下面是一個用DAOs訪問SQL Server的VB實例。

注釋: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

上述例子是以非獨占、非只讀方式打開sales數據庫,并檢索Customers表中的所有字段。OpenDatabase函數的最后一個參數是ODBC連接字符串參數,它指明了Microsoft Access連接到SQL Server所需要知道的一些內容。其中“DSN”為數據源名,“WSID”為工作站名,“DATABASE”為所要訪問的數據庫名。

2、利用ODBC API編程

ODBC(Open Database Connectivity)的思想是訪問異種數據庫的一種可移植的方式。與數據資源對話的公用函數組裝在一個稱為驅動程序管理器(ODBC.DLL)的動態連接中。應用程序調用驅動程序管理器中的函數,而驅動程序管理器反過來通過驅動器(SQLSRVR.DLL)把它們送到服務器中。

下面的代碼使用上面一些函數先登錄到一個服務器數據庫,并為隨后的工作設置了語句句柄。

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))

3、使用VBSQL對DB庫API編程

DB庫是SQL Server的本地API,SQL Server的Visual Basic庫(VBSQL)為Visual Basic程序員提供API。從一定意義上說,VBSQL是連接Visual Basic程序到SQL Server的性能最好最直接的方式。VBSQL包含以下三個文件:

VBSQL.VBX: 包含庫函數,具有訪問重要的消息和處理錯誤的能力

VBSQL.BI:包括所有的常量和變量說明

VBSQL.HLP:Windows幫助文件,使用VBSQL的指南

使用VBSQL時,必須將VBSQL.BI加入到Visual Basic工程文件中,并確保VB程序運行時有VBSQL.VBX文件。

一般的DB庫API編程的過程是這樣的:先通過調用SqlInit對DB庫進行初始化,再調用SqlConnection打開一個連接,然后就可做一些工作。下面的代碼是一個初始化DB庫并登錄到服務器的通用例程。

Private Sub InitializeApplication() DBLIB_VERSION=SqlInit() If DBLIB_VERSION=""Then MsgBox"Could not initialize DBLIB!Exit application.", MB_ICONEXCLAMATION End If End SubPrivate Function LoginToServer() As integer loginToServer=SUCCEED Status%=SqlSetloginTime%(loginTimeOut) If giSqlConn<>0 Then SqlClose(giSqlConn) 注釋:關閉已打開的連接 giSqlConn=SqlOpenConnection(gsServerName, gsLoginID, gsPassword, ProgramName, ProgramName) If giSqlConn<>0 Then liresuit=SqlUse(giSqlConn,"Sales") Else LogintoServer=FAIL End If End Function

4、RDO 遠程數據對象(RemoteData Objects)

要討論RDO,就必然要談到DAO。RDO是從DAO派生出來的,但兩者很大的不同在于其數據庫模式。DAO是針對[記錄(Records)]和[字段( Fields)],而RDO是作為[行(Rows)]和[列(Columns)]來處理。也就是說DAO 是ISAM模式,RDO是關系模式。此外DAO是訪問Access的Jet引擎(Jet是ISAM)的接口,而RDO則是訪問ODBC的接口。

可見,RDO是綜合了DAO/Jet、VBSQL/DBLib以及ODBC的優點的對象(Object)。需要強調的是,RDO是包裹著ODBC API的一層薄薄的外殼, 被設計成在后臺(服務器端)有數據庫存在的前提下運行,同時也是針對SQL Server和Oracle而特別設計的。

RDO的優勢在于它完全被集成在VB之中。此外,直接訪問SQL Server存儲過程、完全支持T-SQL、T-SQL調試集成在開發環境中、Visual Database Tools的集成化等,也是RDO的長處。

在RDO的對象和集合中,有很多對數據庫的狀態和設定進行操作的屬性(Property),以及對數據庫進行操作的方法(Method)。利用這些,從RDO2.0起就可以開發事件驅動的數據庫應用程序。

RDO對象與VB中其他對象的概念相同。與VB用的ActiveX控件(以往稱為Custom Control或OCX、VBX)相似的是,RDO也帶有屬性和方法;但同Spread、InputMan等普遍應用的ActiveX控件不同的是,RDO沒有自己的用戶界面,因而可以和VB標準的Timer控件歸為同一類。當然也可以將RDO看作調用ODBC API函數,進而對后臺數據庫操作加以控制的對象。在RDO的屬性和方法中,包含了對單個的ODBC API函數以及一連串API函數的調用。

①rdoEngine對象

最初調用RDO對象以及RDC(遠程數據控件)時,自動生成rdoEngine對象的附帶事件(incident)。rdoEngine用于對RDO全局屬性的參數、選項進行設置,是在RDO的階層結構內處于最上層的對象,包含了所有的其他對象。

rdoEngine對象與DAO/Jet不同,雖然被多個應用程序共享,但體現rdoEngine對象的設定值的屬性卻并不共用,而是在各自的應用程序的程序界面中對其分別加以設定。這些設定值對其他使用RDO以及RDC的應用程序沒有任何影響。rdoEngine不是集合的要素,而是重新定義的對象,rdoEngine對象不能被追加作成對象屬性的初值。

②rdoEnvironment對象

RDO對象在自動創建rdoEngine對象時,將rdoEnviroment對象的初始值生成并保存為rdoEnviroments(0)。一般情況下,應用程序中不必追加rdoEnvironment對象,大多只需對已有的rdoEnviroments(0)進行操作就可以了。只有在支持一個以上事務(Transaction),需要將用戶名和口令信息分別處理的情況下,利用rdoCreateEnvironment方法將特定的用戶名和口令值做成新的rdoEnvironment對象。在這個方法中可以指定固有名、用戶名和口令,如果所指定的值與rdoEnvironments集合的已經存在的成員名稱相同,會產生錯誤。新建的rdoEnvironment對象自動追加在rdoEnvironments集合的最后。調rdoCreateEnvironment方法時,其name參數可以是長度為0的文字列,這時新的rdoEnvironment對象將不會被追加在rdoEnvironments集合之中。

③rdoConnection對象

rdoConnection對象用于同SQL Server的連接管理。

下面是與SQL Server連接的例子。

用OpenConnection方法的一個實例。

設定的DSN為MyDSN:

Dim Cn As rdoConnection Dim En As rdoEnvironment Dim Conn As String Conn = "DSN = MyDSN; UID = Jacob;" & "PWD = 123456; DATA BASE = MyDb;" Set Cn= En.OpenConnection("", rdDriverPrompt, False, Co nn) Set Cn= En.OpenConnection(Prompt:= rdDriverPrompt, Rea dOnly:= False,Connect:= Cnn)

用EstablishConnection方法的一個實例。

這里以獨立的rdoConnection對象為例說明與SQL Server的連接。

Public WithEvents Eng As rdoEngine Public WithEvents Cn As rdoConnection Private Sub Form_Load() Set Eng = New rdoEngine Set Cn = New rdoConnection With Cn .Connect = "UID = ; PWD = ;" & "DATABASE = pubs; DSN = biblio" .LoginTimeout = 5 .EstablishConnection rdoDriverNoPromt, True, rdAsyncEna ble End With End Sub

在這個例子中,Form_Load函數對rdoEngine和rdoConnection對象進行初始化。這里有一點需要注意,rdoConnection對象是處于獨立的狀態之下,即使是處于未連接狀態也可以設置屬性的值。接下來是rdoConnect對象的事件處理程序。從RDO 2.0起可以實現異步方式(rdAsyn cEnable),EstablishConnection就設定為該值。在異步狀態下,不必等待與數據庫的連接,程序可以迅速從Form_Load 函數中退出。 然后是BeforeConnect事件,該處理在與數據庫的連接開始以前被激發,此時不能進行有關終止連接的操作:

Private Sub Cn_BeforeConnect(ConnetString As String, Pro mpt As Variant) MsgBox "正在連接" & ConnectString, vbOKOnly, "連接前" End Sub

連接完成之后的事件處理:

Private Sub Cn_Connect(ByVal ErrorOccurred As Boolean) Dim M As String If ErrorOccurred Then For Each er In rdoErrors M = M & er & vbCrLf & M Next MsgBox "連接失敗" & vbCrLf & M Else MsgBox "連接成功" 注釋:這是確認連接狀態的測試代碼 Cn.Excute "use pubs" End Sub

RDO連接處理結束后,在該事件中確認連接成功與否。連接成功的情況下ErrorOccurred返回False,失敗時為True,由此可以對rdoErrors集合進行檢測:

Private Sub Eng_InfoMessage() For Each er In rdoErrors Debug.Print er Next RdoErrors.Clear End Sub

不能與SQL Server連接的原因多種多樣,有可能是由于對數據庫的訪問權限、網絡連接問題、數據庫表的信息錯誤、SQL Server同時連接的許可數、資源不足等等,具體情況需要與網絡管理員商量。 斷開連接的操作非常簡單,但又很重要,因為RDO不提供自動斷開的功能。

Cn.Close Set Cn = Nothing 注釋:釋放對象所占的內存資源 En.Close Set En = Nothing 注釋:釋放對象所占的內存資源

VB是對象語言,Form、ActiveX控件也都是對象。使用對象后必須養成將對象設為Nothing把它從內存中釋放的編程習慣。這樣可以預防很多不可預測錯誤,往往程序中發生原因不明的錯誤時,其原因就在于此。

(T114)

作者:http://www.zhujiangroad.com
來源:http://www.zhujiangroad.com
北斗有巢氏 有巢氏北斗