第一節(jié) ODBC API
第二節(jié) DAO 和 ADO 的技術(shù)狀態(tài) 1994年,微軟在Access 2.0 中首先引入了16位的DAO (Data Accessing Object 數(shù)據(jù)訪問對(duì)象),以實(shí)現(xiàn)和Jet 數(shù)據(jù)庫(kù)引擎的連接,這是允許程序 員操縱Jet 引擎的第一個(gè)面向?qū)ο蟮慕涌凇?br>DAO 提供了一個(gè)復(fù)雜的可編程數(shù)據(jù)對(duì)象的層次模型,由上到下分別是: DBEngine Workspace Database TableDef QueryDef Recorset DAO 的使用非常復(fù)雜,例如,為了引用 Recorset,必須從上到下逐級(jí) 引用:
DIM wname As DAO.Workspace DIM wm1 As DAO.Database DIM wm2 As DAO. TableDef DIM wm3 As DAO.QueryDef DIM wm4 As DAO.Recorset set wname=DBEngine.Workspace(0) ..... 更重要的,DAO/Jet 并不適合客戶/服務(wù)器模式的數(shù)據(jù)庫(kù)系統(tǒng),于是, 微軟又開發(fā)出了RDO(Remote Data Object 遠(yuǎn)程數(shù)據(jù)對(duì)象), 和RDC 控 件(在MS RemoteData Control 6.0下),解決了客戶/服務(wù)器模式下,開 發(fā)象SQL Server 或 Oracle 這些大型遠(yuǎn)程數(shù)據(jù)庫(kù)的困難。 VB提供的RDO 組件在工程-〉引用: 客戶端:MS Remote Data Object 2.0 服務(wù)器端:MS Remote Data Servers 2.5 Library 和 MS Remote Data Servers Server 2.5 Library 顯然,這種模式需要編寫服務(wù)器端程序,在某些情況下可能是不現(xiàn)實(shí)的。 繼RDO 之后,微軟又提出了全新的ADO 技術(shù)(ActiveX Data Object ),ADO 是DAO 和RDO 的繼承者,它基于微軟提出來(lái)的OLE DB 數(shù)據(jù)訪問 模式,它可以處理目前幾乎全部關(guān)系型數(shù)據(jù)庫(kù)和非關(guān)系型數(shù)據(jù)庫(kù)系統(tǒng)。 而且,它是專門為大范圍的商業(yè)數(shù)據(jù)庫(kù)系統(tǒng)設(shè)計(jì)的,ADO 比DAO 占用 內(nèi)存少,所以它更適合大流量和大事務(wù)量的網(wǎng)絡(luò)計(jì)算機(jī)系統(tǒng)。 ADO 的影響很大,現(xiàn)在幾乎所有的非微軟開發(fā)環(huán)境都內(nèi)置了ADO 驅(qū) 動(dòng)程序。ADO 的使用也相當(dāng)方便,利用ADODC 控件(在MS ADO Data Control 6.0(OLEDB)下),可以在本地計(jì)算機(jī)上獲取本地和遠(yuǎn)程的數(shù)據(jù) 源,并且可以立刻測(cè)試聯(lián)接是否成功。 ADODC 控件,是以ADO 為父類的一個(gè)子類,所以,它繼承了ADO 的幾乎絕大多數(shù)屬性事件和方法,同時(shí),也加入了自己的屬性事件和方法。 這些屬性事件和方法,又大多數(shù)套用于一種原來(lái)基于DAO 的控件Data,為熟悉Data控件的程序員做一個(gè)合理的過渡,并且,加入了和數(shù)據(jù)綁定控件連接的內(nèi)容。 所以,同一種目的,在ADODC 中可以有兩種方式解決,這樣做的好處是給程序員帶來(lái)了方便,更重要的,ADODC 和數(shù)據(jù)綁定控件連接非常方便,但代價(jià)是無(wú)疑降低了效率。 因此,盡管使用ADODC 控件處理數(shù)據(jù)庫(kù)問題相當(dāng)方便,但是,在更多的大型數(shù)據(jù)庫(kù)系統(tǒng)的設(shè)計(jì)中,人們還是使用直接調(diào)用ADO 類的方式,因?yàn)檫@樣一來(lái),程序的效率往往更高,更靈活。 鑒于這個(gè)情況,在下面的討論中,我們兩種情況都進(jìn)行討論,具體 怎么用,要看項(xiàng)目的需要。當(dāng)然首先是從源頭說(shuō)起,先研究ADO 。 還需要說(shuō)明的是:ADODC 提供了一整套的自動(dòng)聯(lián)接方式,這些方式, 十分方便,但是,如果不明白原理,往往聯(lián)接以后還是感到自己心中無(wú) 數(shù),所以,即使您使用ADODC ,但是仔細(xì)的研究ADO 本身的東西,也還 是很有必要的。同時(shí),利用ADODC 提供的信息,也給以編程為主的ADO 提供了方便,這些我們后面都會(huì)加以介紹。 最近一兩年,ADO 技術(shù)又有了長(zhǎng)足的發(fā)展,這里首先要提到微軟的 Visual Studio.Net 平臺(tái),在這個(gè)平臺(tái)上的主導(dǎo)語(yǔ)言是Visual Basic, Visual C++,Visual C# ,對(duì)于VB 6.0的編程人員,過渡到VB.NET是理 所當(dāng)然的事情。
微軟公司對(duì)VB升級(jí)到VB.Net的同時(shí),對(duì)數(shù)據(jù)訪問模型進(jìn)行了翻天覆 地的升級(jí)。把原來(lái)的ADO 模型升級(jí)為全新的ADO.NET數(shù)據(jù)源, 原來(lái)最重要的RecordSet 現(xiàn)在消失了,取而代之的是DataSet 和 DataReader,而且不再像原來(lái)RecordSet 那樣一次只讀取一條記錄,而 是讀取整個(gè)數(shù)據(jù)庫(kù),然后在內(nèi)存中建立一個(gè)映像,從而實(shí)現(xiàn)了斷開方式 數(shù)據(jù)庫(kù)連接和內(nèi)存管理自動(dòng)化,這是微軟的一個(gè)重大的技術(shù)突破。
但是,這并不等于說(shuō)學(xué)習(xí)ADO 技術(shù)就沒有意義了,首先,由于技術(shù) 的繼承性,ADO.NET 繼承了ADO 的大部分編程方法,另一方面,VB.NET 也還是保留了原來(lái)在VB 6.0中ADO 的COM 組件,這就是說(shuō),在VB.Net中, 我們還是可以用在VB 6.0中完全相同的方法來(lái)編寫數(shù)據(jù)庫(kù)程序,這對(duì)于 中小規(guī)模的數(shù)據(jù)庫(kù)管理系統(tǒng),也是很有意義的。
如果您主要是處理Access數(shù)據(jù)庫(kù),那么使用專為Access數(shù)據(jù)庫(kù)編寫 的DAO 技術(shù)將更直接效率更高。因此,在VB.Net中也仍然保留了DAO 的 COM 組件,但是,更改了驅(qū)動(dòng)程序,解決了在VB 6.0中DAO 不能驅(qū)動(dòng) Access 2000 的問題,因此也得到了廣泛的應(yīng)用。 下面,我們就來(lái)仔細(xì)的研究ADO 和DAO 的有關(guān)問題。在課程的最后, 我們將通過一兩個(gè)例子,來(lái)說(shuō)明VB.NET中數(shù)據(jù)庫(kù)處理的一些方法和特點(diǎn)。 第三節(jié) ADO 最基本的內(nèi)容
ADO 的內(nèi)容比較多,我想還是分兩個(gè)層,先討論最基本最重要的內(nèi)容。
一、ADO 組件的引用 ADO 實(shí)際上是個(gè)COM 組件,它的頂層有三個(gè)對(duì)象: Connection :指定數(shù)據(jù)源,建立和數(shù)據(jù)源的連接; Command :對(duì)數(shù)據(jù)源a執(zhí)行指定的命令,b接受SQL 語(yǔ)句,c表名,d存儲(chǔ)過程的名字,e執(zhí)行SQL 查詢,f更新數(shù)據(jù),g插入記錄等; Recordset: 來(lái)自表或命令執(zhí)行結(jié)果的記錄全集,操縱來(lái)自提供者的幾乎所有數(shù)據(jù)。 要應(yīng)用ADO 組件,必須在工程-〉引用: Ms Activex data object 2.7 Library 把ADO 這個(gè)COM 組件調(diào)入當(dāng)前系統(tǒng)。 用F2 可以看到這個(gè)組件的狀況。庫(kù)的名字為ADODB,也就是在當(dāng)初設(shè)計(jì)組件的時(shí)候,工程名起的是是ADODB,所以,應(yīng)用這三個(gè)類都要構(gòu)造相應(yīng)的實(shí)例,引用時(shí)必須作如下聲明,: Dim Cnn As ADODB.Connection Dim Cmm As ADODB.Command Dim Reco As ADODB.Recordset 其中,Cnn,Cmm和Reco 是用戶自定義的對(duì)象變量,為了表述方便,后面的討論我們都以這組名字作為表達(dá)的基礎(chǔ)。 真正使用,就要通過New 來(lái)建立一個(gè)ADO 的實(shí)例。 Set Cnn = New ADODB.Connection Set Cmm = New ADODB.Command Set Reco = New ADODB.Recordset 有時(shí),希望定義的同時(shí)構(gòu)造實(shí)例,也可以寫成(ADODB一般可以不寫): Dim Cnn As New Connection Dim Cmm As New Command Dim Reco As New Recordset 值得指出的是,如果您直接使用ADODC控件,那上述方法都已經(jīng)在ADODC內(nèi)部完成了,不需要程序員自己來(lái)寫。但是,如果您不使用ADODC控件,而要使用ADO 這個(gè)類來(lái)編寫數(shù)據(jù)庫(kù)系統(tǒng)的時(shí)候,就需要使用引用COM 的標(biāo)準(zhǔn)方法。 一、數(shù)據(jù)庫(kù)連接的建立 可以有四種連接方式: 第一種(用Open) Cnn.Provider = "驅(qū)動(dòng)程序" Cnn.Open "數(shù)據(jù)庫(kù)名"[,"用戶名","密碼"] 例 Cnn.Provider = "Microsoft.Jet.OLEDB.4.0" Cnn.Open Add.path & "\獎(jiǎng)金數(shù)據(jù)庫(kù).mdb" 這里App.path給出了當(dāng)前路徑(該語(yǔ)句在VB.NET中變?yōu)?br>Application.startuppath),這樣就可以實(shí)現(xiàn)相對(duì)路徑調(diào)用數(shù) 據(jù)庫(kù)了。
第二種(用連接字符串) Connection對(duì)象變量有一個(gè)Connectionstring,可以輸入字符串, 例如對(duì)于sql server數(shù)據(jù)庫(kù),字符串設(shè)置可用如下規(guī)則: Provider=SQLOLEDB.1; (提供者) Integrated Security=SSPI; (安全設(shè)置) Persist Security Info=False; (持續(xù)的安全信息) Initial Catalog=pubs; (初始的目錄,或默認(rèn)的數(shù)據(jù)庫(kù)) Data Source=XXX-PE (數(shù)據(jù)源--計(jì)算機(jī)名) 請(qǐng)看如下的例子: Cnn.DefaultDatabase="pubs" ' 這個(gè)屬性是指定默認(rèn)數(shù)據(jù)庫(kù),如果沒有指定數(shù)據(jù)庫(kù)名, '就使用這里指定的數(shù)據(jù)庫(kù)名,SQL Server通常是pubs Cnn.Connectionstring="driver={SQL Server};Server=bigs; _ uld=sa;pws=pwd" '其中:bigs為服務(wù)器名;sa為用戶名;pwd為密碼。 Cnn.Mode=adModeShareExclusive '以獨(dú)占方式打開(后面會(huì)討論) Cnn.open 第三種(使用DSN 數(shù)據(jù)源名) Cnn.Connectionstring="DSN=pubs;UID=***;PWD=***" '由于建立DSN 時(shí)就已經(jīng)提供了諸如上面有關(guān)的各種數(shù)據(jù), '所以這里只需要直接調(diào)用名字就可以了。 Cnn.open 第四種(直接用Open打開) Cnn.Open "DSN數(shù)據(jù)源名","用戶名","密碼" 實(shí)例,第一部分,建立三個(gè)數(shù)據(jù)庫(kù)的連接: ----------------------------------------------------------------- 建立三個(gè)Button,分別用三種方法打開三個(gè)庫(kù),運(yùn)行時(shí)不出錯(cuò)就代表 已連接。由于后面要用一個(gè)顯示畫面,所以一次只能打開一個(gè)數(shù)據(jù)庫(kù),看 看這里是怎么解決這個(gè)問題的? ----------------------------------------------------------------- Dim Cnn As New Connection Dim Cmm As New Command Dim Reco As New Recordset Dim Cnn1 As New Connection Dim Cnn2 As New Connection Dim Kzr, Kzc, kzc1, kzc2, Nd, inname, Tname Private Sub Command2_Click()
'用字符串連接SQL SERVER 數(shù)據(jù)庫(kù)
If Kzc = True Then Cnn.Close Kzc = True If kzc1 = True Then Cnn1.Close kzc1 = False End If If kzc2 = True Then Cnn2.Close kzc2 = False End If Cnn.ConnectionString = "Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=pubs;Data Source=XXX-PE" '注意一下計(jì)算機(jī)名要更改 Cnn.Open
End Sub Private Sub Command1_Click()
'打開數(shù)據(jù)庫(kù)的Provider+Open方法 If kzc1 = True Then Cnn1.Close kzc1 = True If Kzc = True Then Cnn.Close Kzc = False End If If kzc2 = True Then Cnn2.Close kzc2 = False End If
Cnn1.Provider = "Microsoft.Jet.OLEDB.4.0" inname = App.Path & "\獎(jiǎng)金數(shù)據(jù)庫(kù).mdb" Cnn1.Open inname Tname = "獎(jiǎng)金"
End Sub Private Sub Command3_Click() '直接使用OPEN 和DSN數(shù)據(jù)源打開數(shù)據(jù)庫(kù) If kzc2 = True Then Cnn2.Close kzc2 = True If Kzc = True Then Cnn.Close Kzc = False End If If kzc1 = True Then Cnn1.Close kzc1 = False End If
Cnn2.Open "Mysql"
End Sub Private Sub Form_Load() Kzr = False Kzc = False kzc1 = False kzc2 = False End Sub -----------------------------------------------------------------
二、應(yīng)用Recordset打開表 前面已經(jīng)提到,Recordset對(duì)象是用于處理來(lái)自表或命令執(zhí)行結(jié)果的記錄全集,操縱來(lái)自提供者的幾乎所有數(shù)據(jù),所以,處理數(shù)據(jù)庫(kù)問題,Recordset是處在重中之重的位置,由于這是個(gè)COM 對(duì)象,應(yīng)用的時(shí)候同樣需要聲明, 并且構(gòu)造一個(gè)實(shí)例:
Dim Reco As ADODB.Recordset Set Reco = New ADODB.Recordset Reco.Open "數(shù)據(jù)源", Cnn [,指針形態(tài)][,鎖定方式] 其中:數(shù)據(jù)源:表名,或者SQL語(yǔ)句 指針形態(tài): 0 向后指針(默認(rèn)) 1 索引鍵集 3 動(dòng)態(tài)記錄(常用) 4 靜態(tài)記錄 鎖定方式: 1 只讀(默認(rèn)) 2 編輯更新 3 Updata更新 4 批次更新 實(shí)例:關(guān)于Recordset的打開 ------------------------------------------------------------- 在相應(yīng)的按鈕事件中加上Reco.Open ------------------------------------------------------------- Private Sub Command2_Click() ............. Tname = "employee" Reco.Open Tname, Cnn, 3, 3 '雙向指針,Updata更新 Kzr = True End Sub Private Sub Command1_Click() ............................... Tname = "獎(jiǎng)金" Reco.Open Tname, Cnn1, 3, 3 Kzr = True End Sub Private Sub Command3_Click() .................... Tname = "基本表" Reco.Open Tname, Cnn2, 3, 3 Kzr = True End Sub ------------------------------------------------------------- 三、幾個(gè)重要的Connection對(duì)象方法 1)open方法 語(yǔ)法: Cnn.Open [Connectionstring][,UserID][,password] 注意:Connection的Open方法是連接了數(shù)據(jù)庫(kù),但并沒有打開表。 2)Close方法 Cnn.Close 關(guān)閉已經(jīng)打開的連接,但該對(duì)象還保留在內(nèi)存中 3)清除內(nèi)存 Set Cnn=Noting 真正的消除掉
四、取得記錄集中的數(shù)據(jù)
Reco.("字段名")
Reco.Fields(index).Value '內(nèi)容 Reco.Fields(index).Name ‘字段名 Reco.Fields(index).type '字段類型 Reco.Fields(i).ActualSize '字段長(zhǎng)度 Reco.Fields.Count '字段總數(shù) 記錄數(shù) Reco.RecordCount 記錄數(shù)
N=Reco.AbsolutePosition '當(dāng)前指針的位置 Reco.AbsolutePosition=N '把指針定位在第N筆記錄上 五、指針的移動(dòng)
Reco.MoveFirst '指針指向第一筆記錄 Reco.MoveNext '指針指向下一筆記錄 Reco.MovePrevious '指針指向上一筆記錄 Reco.MoveLast '指針指向最后一筆記錄 ------------------------------------------------------------------ 做一個(gè)frame用于顯示,內(nèi)部放置9個(gè)Textbox和Label數(shù)組。 開始的時(shí)候frame1.visible=false。 VarType()檢測(cè)數(shù)據(jù)庫(kù)輸出是否為空(MULL),因?yàn)榭諗?shù)據(jù)的送 出會(huì)顯示錯(cuò)誤信息,應(yīng)避免這種情況。 Showfiel()用于顯示數(shù)據(jù) Myscreen()用于設(shè)置初始屏幕 ------------------------------------------------------------------ Private Sub Showfiel()
For i = 0 To Nd - 1 If VarType(Reco.Fields(i).Value) > 1 Then Text1(i).Text = Reco.Fields(i).Value Else Text1(i).Text = "" End If Next End Sub Private Sub Myscreen() Nd = Reco.Fields.Count If Nd >= 9 Then Nd = 9 End If
For i = 0 To 8 Label1(i).Visible = False Text1(i).Visible = False Next
For i = 0 To Nd - 1 Label1(i).Caption = Reco.Fields(i).Name Label1(i).Visible = True Text1(i).Visible = True Next Reco.MoveFirst Label2.Visible = False frame1.visible=true End Sub ' 在三個(gè)打開數(shù)據(jù)庫(kù)的開關(guān)事件中都寫上: ' Myscreen ' Showfiel '第一個(gè) Private Sub Command4_Click() Reco.MoveFirst Showfiel End Sub '上一個(gè) Private Sub Command5_Click() Reco.MovePrevious If Reco.BOF Then Reco.MoveFirst End If Showfiel End Sub '下一個(gè) Private Sub Command6_Click() Reco.MoveNext If Reco.EOF Then Reco.MoveLast End If Showfiel End Sub '末一個(gè) Private Sub Command7_Click() Reco.MoveLast Showfiel End Sub ------------------------------------------------------------------ 六、Recordst重要的方法:
AddNew 創(chuàng)建一個(gè)新記錄 UpData 保存對(duì)當(dāng)前數(shù)據(jù)的修改 Delete 刪除當(dāng)前記錄 Requery 用新的SQL 查詢?nèi)ジ庐?dāng)前數(shù)據(jù)集。 ------------------------------------------------------------------ 增加幾個(gè)功能 ------------------------------------------------------------------ '增加 Private Sub Command13_Click() Reco.AddNew Showfiel End Sub '刪除 Private Sub Command14_Click() Reco.Delete Reco.MoveNext If Reco.EOF Then Reco.MoveLast End If Showfiel End Sub '更新
Private Sub Command15_Click()
'Reco.Fields(i).Type = 3為自動(dòng)加一的字段ID,不能更新
For i = 0 To Nd - 1 If (Trim(LTrim(Text1(i).Text)) <> "") And (Reco.Fields(i).Type <> 3) Then Reco.Fields(i).Value = Text1(i).Text End If Next Reco.Update
End Sub ------------------------------------------------------------------ 七、執(zhí)行SQL 語(yǔ)句
執(zhí)行SQL 語(yǔ)句是為了構(gòu)造數(shù)據(jù)集,可以用兩種方法: 1)用Connection的Execute方法
完成查詢后以記錄集的形式把數(shù)據(jù)傳回,這在數(shù)據(jù)編修的時(shí)候,需要傳回修改以后的記錄集的時(shí)候用得比較多。 語(yǔ)法:
Set Reco=Cnn.Execute("命令文字",影響記錄的筆數(shù),選擇) “影響記錄的筆數(shù)”指的是執(zhí)行Execute方法以后,數(shù)據(jù)庫(kù)被修改的筆數(shù),對(duì)SELECT 該數(shù)值無(wú)效。 “選擇”指的是“命令文字”的意義,說(shuō)明如下: adCmdText 數(shù)據(jù)源將傳入的“文字定義”視為命令文字, 比如SQL 語(yǔ)句。 adCmdTable 數(shù)據(jù)源將傳入的“文字定義”視為表名稱。 adCmdStoredProc 數(shù)據(jù)源將傳入的“文字定義”視為存儲(chǔ)過程, 適用于SQL Server。 adCmdUnknown 數(shù)據(jù)源不知道“文字定義”的類型,將自動(dòng) 檢測(cè),可以是SQL 語(yǔ)句,但是自動(dòng)監(jiān)測(cè)將會(huì)降低 效率,此為默認(rèn)值。 2)用Recordset的Open方法 語(yǔ)法 Reco.Open "SQL語(yǔ)句",Cnn,指針形態(tài),鎖定方式 --------------------------------------------------------------- 做一個(gè)數(shù)據(jù)查詢的Frame,打開表的時(shí)候讓frame2.visible=true 放入一個(gè)Textbox(Text3)為寫入SQL 語(yǔ)言用,一個(gè)按鈕執(zhí)行查詢, 另一個(gè)按鈕用于把當(dāng)前表的名字加入。 --------------------------------------------------------------- Private Sub Command9_Click() If Kzc Then Reco.Close Reco.Open Text2.Text, Cnn, 3 ElseIf kzc1 Then Reco.Close Reco.Open Text2.Text, Cnn1, 3 ElseIf kzc2 Then Reco.Close Reco.Open Text2.Text, Cnn2, 3 End If
End Sub Private Sub Command12_Click() Text2.SelText = Tname + " " Text2.SetFocus End Sub Private Sub Command9_Click() If Kzc Then Reco.Close Reco.Open Text3.Text, Cnn, 3, 3 ElseIf kzc1 Then Reco.Close Reco.Open Text3.Text, Cnn1, 3, 3 ElseIf kzc2 Then Reco.Close Reco.Open Text3.Text, Cnn2, 3, 3 End If Showfiel End Sub ---------------------------------------------------------------
八、Recordset查詢和過濾
Reco.Find "條件" 把指針定位在符合條件的記錄上 Reco.filter = "條件" 只顯示符合條件的記錄,注意,篩選掉的數(shù)據(jù)并沒有刪除,只是 暫時(shí)隱蔽,一旦篩選條件移除,又自動(dòng)恢復(fù)原狀,篩選移除的方法:
Reco.filter = "" 由于條件是文本的形式,所以構(gòu)造條件相當(dāng)?shù)姆奖?。條件表達(dá)式除 了>、>=、<、<=、<>、 AND、 OR、 NOT、 XOR以外,更有一種Like , 用于處理文字類型,使用統(tǒng)配符(*或%),可以實(shí)現(xiàn)部分匹配查詢。 注意兩點(diǎn): 第一點(diǎn)是查詢表達(dá)式需要用引號(hào)時(shí),要改成單引號(hào)。 第二點(diǎn)是統(tǒng)配符必須在結(jié)尾存在: 比如: 客戶名稱 LIKE '龍*' 或 客戶名稱 LIKE '*龍*' 是正確的。 而 客戶名稱 LIKE '龍*' 是錯(cuò)誤的。
雖然SQL 和Recordset可能有相似的查詢功能,但本質(zhì)是不同的, SQL是在服務(wù)器端處理,把查詢的結(jié)果傳入,所以更適合構(gòu)造數(shù)據(jù)集。 而Recordset查詢是在客戶端,并不影響數(shù)據(jù)集的本身,所以速度更快, 也更加精細(xì),所更適合做精細(xì)的數(shù)據(jù)處理。 ------------------------------------------------------------ 在實(shí)驗(yàn)程序中增加功能 ------------------------------------------------------------ 'Find查詢 Private Sub Command8_Click() Reco.Find Text2.Text If Reco.EOF() Then MsgBox "沒有這個(gè)數(shù)據(jù)" Reco.MoveFirst End If Showfiel End Sub '下一個(gè) Private Sub Command8_Click() Reco.Find Text2.Text If Reco.EOF() Then MsgBox "沒有這個(gè)數(shù)據(jù)" Reco.MoveFirst End If Showfiel End Sub '過濾 Private Sub Command16_Click() Reco.Filter = Text2.Text Showfiel End Sub ------------------------------------------------------------ 九、分頁(yè) 設(shè)置每頁(yè)為N 筆 Reco.PageSize=N
總頁(yè)數(shù)為N N=Reco.PageCount
設(shè)定記錄指針指向的頁(yè)數(shù) Reco.AbsolutePage=N 取得指針指向的頁(yè)數(shù) N=Reco.AbsolutePage 例:輸出某頁(yè)中的記錄: Reco.AbsolutePage=2 for i=1 to Reco.pagesize if Reco.Eof then Exit for end if -----處理--------- Next
十、Recordst屬性Bof和Eof 分別指示指針指向頭以前和尾以后。 結(jié)果為true和false ---------------------------------------------------------------- 下面我們?cè)O(shè)法讓構(gòu)造查詢條件變得更方便。 加入兩個(gè)List和一個(gè)Combo1,list1的style屬性選1-Checkbox為 多選型list2的list屬性加入常用的SQL命令單詞,再加入一個(gè)“字段 送出按鈕”。 Myscreen子程序增加一些List和ComboBox處理的程序,在打開 數(shù)據(jù)庫(kù)時(shí),把相應(yīng)字段名顯示出來(lái),便于組織條件的時(shí)候使用。 所以要加入一個(gè)新的過程MyscreenSQL,是因?yàn)椴樵円院罂赡茏侄?br>數(shù)目要發(fā)生變化,ComboBox要顯示新的字段值,但List卻希望顯示原 來(lái)的字段值,便于重新組織查詢。
---------------------------------------------------------------- '給Myscreen增加相應(yīng)的語(yǔ)句 Private Sub Myscreen() Nd = Reco.Fields.Count If Nd >= 9 Then Nd = 9 End If
For i = 0 To 8 Label1(i).Visible = False Text1(i).Visible = False Next
For i = 0 To Nd - 1 Label1(i).Caption = Reco.Fields(i).Name Label1(i).Visible = True Text1(i).Visible = True Next Reco.MoveFirst Label2.Visible = False
List1.Clear Combo1.Clear
For i = 0 To Reco.Fields.Count - 1 List1.AddItem Reco.Fields(i).Name Combo1.AddItem Reco.Fields(i).Name Next Combo1.Text = Combo1.List(0) Frame2.Visible = True End Sub '做一個(gè)MyscreenSQL過程,為SQL語(yǔ)言發(fā)送用
Private Sub MyscreenSQL() Nd = Reco.Fields.Count If Nd >= 9 Then Nd = 9 End If
For i = 0 To 8 Label1(i).Visible = False Text1(i).Visible = False Next
For i = 0 To Nd - 1 Label1(i).Caption = Reco.Fields(i).Name Label1(i).Visible = True Text1(i).Visible = True Next Reco.MoveFirst
Combo1.Clear
For i = 0 To Reco.Fields.Count - 1 Combo1.AddItem Reco.Fields(i).Name Next Combo1.Text = Combo1.List(0)
End Sub '送出字段名 Private Sub Combo1_Click() Text2.SelText = Combo1.Text Text2.SetFocus End Sub '送出選中的字段列表 Private Sub Command10_Click()
Dim i, st 'List1.Selected(i) = True為選中 st = "" For i = 0 To List1.ListCount - 1 If List1.Selected(i) = True Then If st = "" Then st = List1.List(i) Else st = st + "," + List1.List(i) End If End If Next Text2.SelText = st + " " Text2.SetFocus End Sub '雙擊list2送出選中的SQL命令 Private Sub List2_DblClick() Text2.SelText = List2.Text + " " Text2.SetFocus End Sub --------------------------------------------------------------- 好啦,一個(gè)完整的數(shù)據(jù)庫(kù)處理程序完成了,最后注意,退出程序, 在VB 6.0中是 Unload Me,相應(yīng)的,在VB.Net 變成了Application.Exit()。 怎么樣,很有意思吧?
十一、ADO 的Command對(duì)象 Command對(duì)象主要用于查詢數(shù)據(jù)庫(kù),并返回Recordset對(duì)象中的記錄。 常用屬性: 1)CommandText: 設(shè)置返回命令,包括SQL,表格,存儲(chǔ)過程。 如果是SQL 語(yǔ)句,CommandText的后面要跟上Execute方法。 例如:
Cmm.CommandText="SQL 語(yǔ)句" Cmm.Execute 2)CommandType屬性: 指示如何計(jì)算CommandText的值,主要有如下幾種選擇: adCmdText 數(shù)據(jù)源將傳入的“文字定義”視為命令文字, 比如SQL 語(yǔ)句。 adCmdTable 數(shù)據(jù)源將傳入的“文字定義”視為表名稱。 adCmdStoredProc 數(shù)據(jù)源將傳入的“文字定義”視為存儲(chǔ)過程, 適用于SQL Server。 adCmdUnknown 數(shù)據(jù)源不知道“文字定義”的類型,將自動(dòng) 檢測(cè),可以是SQL 語(yǔ)句,但是自動(dòng)監(jiān)測(cè)將會(huì)降低 效率,此為默認(rèn)值。 這個(gè)屬性在很多地方需要設(shè)置。 十二、實(shí)例:用戶名和密碼申請(qǐng)機(jī)制
第四節(jié) ADODC 控件
ADODC 是VB提供的一個(gè)基于ADO 模型的控件,調(diào)用它需要: 工程-〉部件-〉MS ADO Data Control 6.0(OLEDB)。 一、連接數(shù)據(jù)源: 屬性: Connectionstring 1,使用ODBC數(shù)據(jù)源:如果有可以選擇,如沒有可以新建,新 建的方法與在Windows下一樣。 選擇好數(shù)據(jù)源以后,應(yīng)該能看到: Connectionstring="DSN=***" 2, 使用連接字符串:連接字符串包括了驅(qū)動(dòng)程序, 可以利 用文件名調(diào)用,完成后要注意測(cè)試一下連接。 從效果上看,和數(shù)據(jù)源是一樣的,但可以避免每臺(tái)客戶機(jī) 上重復(fù)設(shè)置。 CommandType屬性,最好根據(jù)要求設(shè)置。
連接“表”或者初始的SQL 語(yǔ)言: 屬性: RecordSource 對(duì)話框中出現(xiàn)“命令類型”,實(shí)際上就是設(shè)置CommandType屬性, 最好根據(jù)要求選擇: 用SQL 用 1-adCmdText 用表名用 2-adCmdTable 存儲(chǔ)過程用 4-adCmdStoredProc 不清楚用 8-adCmdUnknown 輸入表名或SQL 語(yǔ)句,就完成了數(shù)據(jù)源聯(lián)接的設(shè)置。
(提示,在直接使用ADO 的時(shí)候,如果對(duì) Connectionstring參數(shù) 或其它項(xiàng)目沒把握??梢韵扔肁DODC設(shè)置,成功后再把相應(yīng)的字符串拷 貝過去)。 ADODC 內(nèi)置了Recordset對(duì)象,所有Recordset對(duì)象的屬性和方法, 都可以采用,指令格式為: ADODC1.Recordset.屬性或者方法
也就是說(shuō),上面所研究的關(guān)于ADO 的Recordset對(duì)象的一切屬性和 方法,都可以直接在這里使用,因此就不再重復(fù)了。 值得提出的是SQL 的使用方法: Adodc1.RecordSource="SQL" Adodc1.Refresh '沒有此句不反應(yīng) 二、數(shù)據(jù)綁定控件
使用ADODC 的最大的好處是,可以方便的使用數(shù)據(jù)綁定控件,這 里先介紹兩種: 1)表(Datagrid) MS Datagrid Control 6.0 屬性 DataSource=Adodc1 2)TextBox 屬性 DataSource=Adodc1 Datafilds=字段 實(shí)例:SQL自由查詢 第五節(jié) 數(shù)據(jù)環(huán)境DataEnvironment
一、建立數(shù)據(jù)連接 在工程管理器中,右鍵 -〉添加 -〉Data Environment 這就產(chǎn)生了一個(gè)數(shù)據(jù)環(huán)境窗口DataEnvironment1。下面出現(xiàn)了一 個(gè)Connection圖標(biāo),用以實(shí)現(xiàn)和數(shù)據(jù)庫(kù)的連接。 在Connection1上右鍵 -〉屬性 ,用ADO 同樣的方法進(jìn)行數(shù)據(jù)庫(kù) 的連接。 完成以后,Connection1的ConnectionSource是連接字符串,也 可以在運(yùn)行期改變連接。 具體方法是:
DataEnvironment1.Connection1.ConnectionString=連接字符串 二、添加命令(與表的連接): 在Connection1上右鍵 -〉添加命令 就產(chǎn)生了一個(gè)Command1 右鍵,就出現(xiàn)了一個(gè)對(duì)話框: 通用-〉數(shù)據(jù)源 -〉可以選 SQL、表、存儲(chǔ)過程 例如這里選“表”,選擇表名,確認(rèn)。 在Command1的屬性:CommandType 可以改變?cè)O(shè)置,而CommandText 可以改變“表”或者SQL 命令的文字。 點(diǎn)Command1的加號(hào),可以看到字段名字。 三、添加數(shù)據(jù)庫(kù)的關(guān)聯(lián) 如果需要添加數(shù)據(jù)庫(kù)的關(guān)聯(lián),可以在Command1上右鍵 -〉添加子 命令。 于是在Command1下出現(xiàn)了一個(gè)Command2 在Command2上右鍵 -〉屬性 進(jìn)行表的連接。
打開“關(guān)聯(lián)”選項(xiàng)卡,選擇關(guān)聯(lián)字段,添加。這就實(shí)現(xiàn)了兩個(gè)表 的關(guān)聯(lián)。 四、數(shù)據(jù)庫(kù)顯示 Command1左鍵拖入窗體,就實(shí)現(xiàn)了數(shù)據(jù)庫(kù)的顯示(左鍵為Textbox, 右鍵為DataGrid) 如果是自定義的顯示控件(例如DataGrid): 屬性: DataSource=DataEnvironment1 DataMember=Command1 或 Command2
五、Recordset命令 如果希望使用Recordset命令,注意在DataEnvironment1下有一個(gè) ReCommand1(其中的Command1是根據(jù)Command1的名字自動(dòng)給出的),相 當(dāng)于ADO的Recordset,可以使用Recordset命令集。 這樣,我們就可以方便的應(yīng)用數(shù)據(jù)庫(kù)了。
在熟悉了ADO 以后,DataEnvironment數(shù)據(jù)環(huán)境可以使我們?cè)O(shè)計(jì)數(shù)據(jù)庫(kù)系統(tǒng)更加方便快捷。 · |