VB訪問SQLServer數(shù)據(jù)庫技術(shù)全揭密_第1頁
VB訪問SQLServer數(shù)據(jù)庫技術(shù)全揭密_第2頁
VB訪問SQLServer數(shù)據(jù)庫技術(shù)全揭密_第3頁
VB訪問SQLServer數(shù)據(jù)庫技術(shù)全揭密_第4頁
VB訪問SQLServer數(shù)據(jù)庫技術(shù)全揭密_第5頁
已閱讀5頁,還剩3頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)

文檔簡介

VB訪問SQLServer數(shù)據(jù)庫技術(shù)全揭密

摘要:

本文討論了VisualBasic應(yīng)用程序訪問SQLServer數(shù)據(jù)庫的幾種常用的方法,分別說明了

每種方法的內(nèi)部機理并給出了每種方法的一個簡單的實例,最后比較了每種方法性能和優(yōu)缺

點。

一、引言

SQLServer是微軟推出的中小型網(wǎng)絡(luò)數(shù)據(jù)庫系統(tǒng),是目前最常用的數(shù)據(jù)庫系統(tǒng)之一.隨

著SQLServer網(wǎng)絡(luò)數(shù)據(jù)庫應(yīng)用程序日益增多,這種Web數(shù)據(jù)庫應(yīng)用系統(tǒng)的正常運行一般依

賴于已存在的用戶數(shù)據(jù)庫。創(chuàng)建維護數(shù)據(jù)庫的工作可用SQLServer提供的SQLEnterprise

Manager工具來進行,如能提供一種定制的數(shù)據(jù)庫管理工具,通過管理應(yīng)用程序來管理數(shù)據(jù)

庫及其設(shè)備,對用戶來說無疑是最理想的。

VisualBasic作為一種面向?qū)ο蟮目梢暬幊坦ぞ撸哂泻唵我讓W(xué),靈活方便和易于擴充

的特點。而且Microsoft為其提供了與SQLServer通信的API函數(shù)集及工具集,因此它越來

越多地用作大型公司數(shù)據(jù)和客戶機一服務(wù)器應(yīng)用程序的前端,與后端的MicrosoftSQLServer

相結(jié)合,VB能夠提供一個高性能的客戶機一服務(wù)器方案。

二、VB訪問SQLServer數(shù)據(jù)的常用方法

使用VisualBasic作為前端開發(fā)語言,與SQLServer接口有幾種常用的方法,即:

①數(shù)據(jù)訪問對象/Jet

②為ODBCAPI編程

③使用SQLServer的VisualBasic庫(VBSQL)為DB庫的API編程

@RDO遠(yuǎn)程數(shù)據(jù)對象(RemoteDataObjects)

⑤ADO數(shù)據(jù)對象(ActiveDataObjects)

1、數(shù)據(jù)訪問對象/Jet

VB支持DataAccessObjects(DAOs)的子集。DAO的方法雖然不是性能最好的管理客

戶機一服務(wù)器之間的對話方式,但它的確有許多優(yōu)點。DAO/Jet是為了實現(xiàn)從VB訪問Access

數(shù)據(jù)庫而開發(fā)的程序接口對象。使用DAOs訪問SQLServer的過程如下:應(yīng)用程序準(zhǔn)備好

語句并送至Jet,Jet引擎(MASJT200.DLL)優(yōu)化查詢,載入驅(qū)動程序管理器并與之通訊,

驅(qū)動程序管理器(ODBC.DLL)通過調(diào)用驅(qū)動器(SQLSRVR.DLL)的函數(shù),實現(xiàn)連接到數(shù)

據(jù)源,翻譯并向SQLServer提交SQL語句且返回結(jié)果。下面是一個用DAOs訪問SQLServer

的VB實例。

注釋:FormDeclarations

DimmydbAsDatabase

DimmydynasetAsDynaset才

PrivateSubForm_Load()

Setmydb=OpenDatabase("“,F(xiàn)alse,False,"ODBC;DSN=Myserver;WSID=LCL;

DATABASE=sales")

Setmydynaset=mydbCreateDynaset("Select*fromCustomers1')才

EndSub

上述例子是以非獨占、非只讀方式打開sales數(shù)據(jù)庫,并檢索Customers表中的所有字段。

OpenDatabase函數(shù)的最后一個參數(shù)是ODBC連接字符串參數(shù),它指明了MicrosoftAccess連

接到SQLServer所需要知道的一些內(nèi)容。其中“DSN”為數(shù)據(jù)源名,“WSID”為工作站名,

“DATABASE”為所要訪問的數(shù)據(jù)庫名。

2、利用ODBCAPI編程

ODBC(OpenDatabaseConnectivity)的思想是訪問異種數(shù)據(jù)庫的一種可移植的方式。與

數(shù)據(jù)資源對話的公用函數(shù)組裝在一個稱為驅(qū)動程序管理器(ODBCDLL)的動態(tài)連接中。應(yīng)

用程序調(diào)用驅(qū)動程序管理器中的函數(shù),而驅(qū)動程序管理器反過來通過驅(qū)動器

(SQLSRVR.DLL)把它們送到服務(wù)器中。

下面的代碼使用上面一些函數(shù)先登錄到一個服務(wù)器數(shù)據(jù)庫,并為隨后的工作設(shè)置了語句

句柄。

GlobalgiHEnvAsLong

GlobalgiHDBAsLong

GlobalgiHStmtAsLong

DimmyResultAsinteger

DimmyConnectionAsSiting

DimmyBuffAsString*256

DimmyBufflenAsInteger

IfSQLAllocEnv(giHEnv)<>SQL_SUCCESSThen

MsgBox,'Allocationcouldn注釋:thappen!'1

EndIf

IfSQLAllocConnect(giHEnv,giHDB)<>SQL_SUCCESSThen

MsgBox"SQLServercouldn注釋:tconnect!"

EndIf

myConnection=nDSN=myServer;UID=LCL;PWD=;APP=ODBCTest;WSID=LCL;DATABAS

E=salesn

myResult=SQLDriverConnect(giHDB,Test,forml.hWnd,myConnection.len(myConnection),

myBuff,256,myBufflen,SQL_DRIVER_COMPLETE_REQUIED)

myResult=SQLAllocStmt(giHDS,giHStmt)

myResult=SQLFreeStmt(giHStmt,SQL_COLSE)

rsSQL="Select*fromCustomersWhereCity="Hunan"”

myResult=SQLExecDirect(giHStmt,rsSQL,Len(rsSQD)

3、使用VBSQL對DB庫API編程

DB庫是SQLServer的本地API,SQLServer的VisualBasic庫(VBSQL)為VisualBasic

程序員提供API。從一定意義上說,VBSQL是連接VisualBasic程序到SQLServer的性能

最好最直接的方式。VBSQL包含以下三個文件:

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

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

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

使用VBSQL時,,必須將VBSQL.BI加入到VisualBasic工程文件中,并確保VB程序運

行時有VBSQL.VBX文件。

一般的DB庫API編程的過程是這樣的:先通過調(diào)用Sqllnit對DB庫進行初始化,再調(diào)

用SqlConnection打開一個連接,然后就可做一些工作。下面的代碼是一個初始化DB庫并

登錄到服務(wù)器的通用例程。

PrivateSubInitializeApplication()

DBLIB_VERSION=SqlInit()

IfDBLIBVERSION=""Then

MsgBox"CouldnotinitializeDBLIBiExitapplication.",MBJCONEXCLAMATION

EndIf

EndSub

PrivateFunctionLoginToServer()Asinteger

loginToServer=SUCCEED

Status%=SqlSetloginTime%(loginTimeOut)

IfgiSqlConnoOThen

SqlClose(giSqlConn)注釋:關(guān)閉已打開的連接

giSqlConn=SqlOpenConnection(gsServerName,gsLoginlD,gsPassword,ProgramName,

ProgramName)

IfgiSqlConnoOThen

liresuit=SqlUse(giSqlConn,"Sales")

Else

LogintoServer=FAIL

EndIf

EndFunction

4^RDO遠(yuǎn)程數(shù)據(jù)對象(RemoteDataObjects)

要討論RDO,就必然要談到DAO。RDO是從DAO派生出來的,但兩者很大的不同在于

其數(shù)據(jù)庫模式。DAO是針對[記錄(Records)]和[字段(Fields)RDO是作為[行(Rows)]

和[列(Columns)]來處理。也就是說DAO是ISAM模式,RDO是關(guān)系模式。此外DAO

是訪問Access的Jet引擎(Jet是ISAM)的接口,而RDO則是訪問ODBC的接口。

可見,RDO是綜合了DAO/Jet、VBSQL/DBLib以及ODBC的優(yōu)點的對象(Object)?需

要強調(diào)的是,RDO是包裹著ODBCAPI的一層薄薄的外殼,被設(shè)計成在后臺(服務(wù)器端)

有數(shù)據(jù)庫存在的前提下運行,同時也是針對SQLServer和Oracle而特別設(shè)計的。

RDO的優(yōu)勢在于它完全被集成在VB之中。此外,直接訪問SQLServer存儲過程、完全

支持T-SQL、T-SQL調(diào)試集成在開發(fā)環(huán)境中、VisualDatabaseTools的集成化等,也是RDO

的長處。

在RDO的對象和集合中,有很多對數(shù)據(jù)庫的狀態(tài)和設(shè)定進行操作的屬性(Property),以

及對數(shù)據(jù)庫進行操作的方法(Method)。利用這些,從RDO2.0起就可以開發(fā)事件驅(qū)動的數(shù)

據(jù)庫應(yīng)用程序。

RDO對象與VB中其他對象的概念相同。與VB用的ActiveX控件(以往稱為Custom

Control或OCX、VBX)相似的是,RDO也帶有屬性和方法;但同Spread、InputMan等普

遍應(yīng)用的ActiveX控件不同的是,RDO沒有自己的用戶界面,因而可以和VB標(biāo)準(zhǔn)的Timer

控件歸為同一類。當(dāng)然也可以將RDO看作調(diào)用ODBCAPI函數(shù),進而對后臺數(shù)據(jù)庫操作加

以控制的對象。在RDO的屬性和方法中,包含了對單個的ODBCAPI函數(shù)以及一連串API

函數(shù)的調(diào)用。

①rdoEngine對象

最初調(diào)用RDO對象以及RDC(遠(yuǎn)程數(shù)據(jù)控件)時,自動生成rdoEngine對象的附帶事件

(incident)ordoEngine用于對RDO全局屬性的參數(shù)、選項進行設(shè)置,是在RDO的階層結(jié)

構(gòu)內(nèi)處于最上層的對象,包含了所有的其他對象。

rdoEngine對象與DAO/Jet不同,雖然被多個應(yīng)用程序共享,但體現(xiàn)rdoEngine對象的設(shè)

定值的屬性卻并不共用,而是在各自的應(yīng)用程序的程序界面中對其分別加以設(shè)定。這些設(shè)定

值對其他使用RDO以及RDC的應(yīng)用程序沒有任何影響。rdoEngine不是集合的要素,而是

重新定義的對象,rdoEngine對象不能被追加作成對象屬性的初值。

?rdoEnvironment對象

RDO對象在自動創(chuàng)建rdoEngine對象時,將rdoEnviroment對象的初始值生成并保存為

rdoEnviroments(0)。一般情況下,應(yīng)用程序中不必追加rdoEnvironment對象,大多只需對

已有的rdoEnviroments(0)進行操作就可以了。只有在支持一個以上事務(wù)(Transaction),

需要將用戶名和口令信息分別處理的情況下,利用rdoCreateEnvironment方法將特定的用戶

名和口令值做成新的rdoEnvironment對象。在這個方法中可以指定固有名、用戶名和口令,

如果所指定的值與rdoEnvironments集合的己經(jīng)存在的成員名稱相同,會產(chǎn)生錯誤。新建的

rdoEnvironment對象自動追力口在rdoEnvironments集合的最后。調(diào)rdoCreateEnvironment方法

時,其name參數(shù)可以是長度為0的文字列,這時新的rdoEnvironment對象將不會被追加在

rdoEnvironments集合之中。

③rdoConnection對象

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

下面是與SQLServer連接的例子。

用OpenConnection方法的一個實例。

設(shè)定的DSN為MyDSN:

DimCnAsrdoConnection

DimEnAsrdoEnvironment

DimConnAsString

Conn=HDSN=MyDSN;UID=Jacob;'1&"PWD=123456;DATABASE=MyDb;H

SetCn=En.OpenConnectionrdDriverPrompt,False,Conn)

SetCn=En.OpenConnection(Prompt:=rdDriverPrompt,ReadOnly:=False,ConnectsCnn)

用EstablishConnection方法的一個實例。

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

PublicWithEventsEngAsrdoEngine

PublicWithEventsCnAsrdoConnection

PrivateSubForm__Load()

SetEng=NewrdoEngine

SetCn=NewrdoConnection

WithCn

.Connect="UID=;PWD=;n&"DATABASE=pubs;DSN=biblio11

.LoginTimeout=5

.EstablishConnectionrdoDriverNoPromt,True,rdAsyncEnable

EndWith

EndSub

在這個例子中,F(xiàn)orm_Load函數(shù)對rdoEngine和rdoConnection對象進行初始化。這里有

一點需要注意,rdoConnection對象是處于獨立的狀態(tài)之下,即使是處于未連接狀態(tài)也可以

設(shè)置屬性的值。接下來是rdoConnect對象的事件處理程序。從RDO2.0起可以實現(xiàn)異步方

式(rdAsyncEnable),EstablishConnection就設(shè)定為該值。在異步狀態(tài)下,不必等待與數(shù)據(jù)

庫的連接,程序可以迅速從Form_Load函數(shù)中退出。然后是BeforeConnect事件,該處理

在與數(shù)據(jù)庫的連接開始以前被激發(fā),此時不能進行有關(guān)終止連接的操作:

PrivateSubCn_BeforeConnect(ConnetStringAsString,PromptAsVariant)

MsgBox”正在連接“&ConnectString,vbOKOnly,“連接前“

EndSub

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

PrivateSubCn_Connect(ByVaiErrorOccurredAsBoolean)

DimMAsString

IfErrorOccurredThen

ForEacherInrdoErrors

M=M&er&vbCrLf&M

Next

MsgBox”連接失敗"&vbCrLf&M

Else

MsgBox”連接成功”

注釋:這是確認(rèn)連接狀態(tài)的測試代碼

Cn.Excute"usepubs',

EndSub

RDO連接處理結(jié)束后,在該事件中確認(rèn)連接成功與否。連接成功的情況下ErrorOccurred

返回False,失敗時為True,由此可以對rdoErrors集合進行檢測:

PrivateSubEng_InfoMessage()

ForEacherInrdoErrors

Debug.Printer

Next

RdoErrors.Clear

EndSub

不能與SQLServer連接的原因多種多樣,有可能是由于對數(shù)據(jù)庫的訪問權(quán)限、網(wǎng)絡(luò)連接

問題、數(shù)據(jù)庫表的信息錯誤、SQLServer同時連接的許可數(shù)、資源不足等等,具體情況需要

與網(wǎng)絡(luò)管理員商量。斷開連接的操作非常簡單,但又很重要,因為RDO不提供自動斷開

的功能。

Cn.Close

SetCn=Nothing注釋:釋放對象所占的內(nèi)存資源

En.Close

SetEn=Nothing注釋:釋放對象所占的內(nèi)存資源

VB是對象語言,Form,ActiveX控件也都是對象。使用對象后必須養(yǎng)成將對象設(shè)為Nothing

把它從內(nèi)存中釋放的編程習(xí)慣。這樣可以預(yù)防很多不可預(yù)測錯誤,往往程序中發(fā)生原因不明

的錯誤時,其原因就在于此。

5、ADO數(shù)據(jù)對象(ActiveDataObjects)

ADO是基于全新的OLEDB技術(shù),OLEDB可對電子郵件、文本文件、復(fù)合文件、數(shù)據(jù)

表等各種各樣的數(shù)據(jù)通過統(tǒng)一的接口進行存取。隨著ActiveX控件的升級(Windows98的

ActiveX5.0),RDO將被以ActiveX技術(shù)為基礎(chǔ)的ADO接口所替代。下面將介紹基于ActiveX

技術(shù)的ADO訪問SQLServer6.5數(shù)據(jù)庫的技術(shù)和方法?;跒g覽器的ADO接口常用函數(shù)如

下:

(1)取當(dāng)前的工作數(shù)據(jù)庫

由于管理任務(wù)一般都必須在Master庫中完成,因此在執(zhí)行管理任務(wù)之前,最好保存當(dāng)前

工作庫,以便完成任務(wù)之后再切換回原來的任務(wù)。

PublicFunctionSQLGetCunentDatabaseName(CnAsADODB.Connection)AsString

DimsSQLAsString

DimRSAsNewADODB.Recordset

OnErrorGoToerrSQLGetCurrentDatabaseName

sSQL=nselectCurrentDB=DB_NAME()”

RS.OpensSQL,Cn

SQLGetCurrentDatabaseName=Trim$(RS!CurrentDB)

RS.Close

ExitFunction

errSQLGetCurrentDatabaseName:

SQLGetCuiTentDatabaseName="*"

EndFunction

(2)取SQLServer安裝目錄下的DATA子目錄路徑

取SQLServer的設(shè)備文件缺省目錄,返回如D:MSSQLDATAo

PublicFunctionSQLGetDataPath(CnAsADODB.Connection)AsString

DimsSQLAsString

DimRSAsNewADODB.Recordset

DimsFullPathAsString

OnErrorGoToerrSQLGetDataPath

sSQL="selectphynamefrommastersysdeviceswherename=注釋:master注釋:"

RS.OpensSQL,Cn

sFullPath=RS!phyname

RS.Close

SQLGetDataPath=Left$(sFullPath,Len(sFullPath)-10)注釋:MASTER.DAT的大

ExitFunction

errSQLGetDataPath:

SQLGetDataPath=nn

EndFunction

(3)創(chuàng)建一個新數(shù)據(jù)庫

PublicFunctionSQLCreateDatabase65(CnAsADODB.Connection,sDBNameAsString,

sDataDeviceNameAsString,nDataSizeAsInteger,OptionalsLogDeviceName,Optional

nLogSize)AsBoolean

DimsSQLAsString

OnErrorGoToerrSQLCreateDatabase65

DimsDBAsString

sDB=SQLGetCurrentDatabaseName(Cn)

sSQL="USEmaster"

Cn.ExecutesSQL

sSQL=nCREATEDATABASE,1&sDBName

sSQL=sSQL&"ON"&sDataDeviceName&"二"&nDataSize

IfNotIsMissing(sLogDeviceName)AndNotIsMissing(nLogSize)Then

sSQL=sSQL&"LOGON"&sLogDeviceName&'nLogSize

EndIf

Cn.ExecutesSQL

sSQL=MUSEn&sDB

Cn.ExecutesSQL

SQLCreateDatabase65=True

ExitFunction

errSQLCreateDatabase65:

OnErrorResumeNext

sSQL="USE"&sDB

Cn.ExecutesSQL

SQLCreateDatabase65=False

EndFunction

(4)判斷一個數(shù)據(jù)庫是否存在

PublicFunctionSQLExistDatabase(CnAsADODB.Connection,sDBNameAsString)As

Boolean

DimsSQLAsString

DimRSAsNewADODB.Recordset

DimbTmpAsBoolean

onErrorGoToerrSQLExistDatabase

sSQL="selectCntDB=count(*)"

sSQL=sSQL&"Frommaster.dbo.sysdatabasesu

sSQL=sSQL&"Wherename=注釋:"&sDBName&”注釋:”

RS.OpensSQL,Cn

IfRS!CntDB=0ThenbTmp=FalseElsebTmp=True

RS.Close

SQLExistDatabase=bTmp

ExitFunction

errSQLExistDatabase:

SQLExistDatabase=False

ExitFunction

EndFunction

(5)刪除一個數(shù)據(jù)庫

PublicFunctionSQLDropDatabase(CnAsADODB.Connection,sDBNameAsString)As

Boolean

DimsSQLAsString

OnErrorGoToerrSQLDropDatabase

IfNotSQLExistDatabase(Cn,sDBName)Then

SQLDropDatabase=True

ExitFunction

EndIf

DimsDBAsString

sDB=SQLGetCurrentDatabaseName(Cn)

sSQL="Usemaster"

Cn.ExecutesSQL

sSQL="DROPDATABASE"&sDBName

Cn.ExecutesSQL

sSQL="USE"&sDB

Cn.ExecutesSQL

SQLDropDatabase=True

ExitFunction

errSQLDropDatabase:

OnErrorResumeNext

sSQL=nUSE(,&sDB

Cn.ExecutesSQL

SQLDropDatabase=False

EndFunction

三、性能比較及應(yīng)用說明

用VB開發(fā)基于SQLServer的數(shù)據(jù)庫系統(tǒng),以上幾種訪問SQLServer的方法各有各的特

點。DAOs方法是基于對象的,因而便于使用,但是它是從VisualBasic到SQLServer最慢

的連接方式。ODBCAPI和VBSQL方法從本質(zhì)上講是基于程序的。ODBCAPI方法通用性

好,允許最強的互操作性,編程簡單,但速度慢于VBSQL方法。VBSQL方法通過VBSQL

控件,提供了重要

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論