




版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 沉箱碼頭施工方案
- 室內(nèi)電纜敷設(shè)施工方案
- 2025年東師復(fù)試化學(xué)試題及答案
- 2025年高職數(shù)據(jù)庫試題及答案
- 5年級下冊英語第1第2單元單詞跟讀
- 5年級上冊第5單元摘抄
- 燈泡溫度與電阻的關(guān)系式
- 地下車庫 行政復(fù)議申請
- 機械合同的施工方案
- 2025年合肥信息技術(shù)職業(yè)學(xué)院單招職業(yè)適應(yīng)性測試題庫學(xué)生專用
- 拼音瘋狂背古詩(6個單元120首)
- 閱讀讓我們更聰明
- 牙周病科普講座課件
- 實驗室安全專項培訓(xùn)
- 工業(yè)地產(chǎn)營銷推廣方案
- 2024年貴州能源集團電力投資有限公司招聘筆試參考題庫附帶答案詳解
- 電子產(chǎn)品設(shè)計案例教程(微課版)-基于嘉立創(chuàng)EDA(專業(yè)版) 課件 第3章 多諧振蕩器的PCB設(shè)計
- 鐵路軌道與修理
- 紡織行業(yè)清潔生產(chǎn)評價指標(biāo)體系色紗
- 管理能力測試題大全
- 《風(fēng)景談》新教學(xué)課件
評論
0/150
提交評論