準備知識—VB數(shù)據(jù)庫應用基礎(chǔ)
一、VB如何訪問數(shù)據(jù)庫
目前,,Visual Basic訪問數(shù)據(jù)庫的主流技術(shù)是ADO,。ADO是一種基于對象的數(shù)據(jù)訪問接口,在VB中提供了利用ADO訪問數(shù)據(jù)庫的兩種主要形式:ADO數(shù)據(jù)控件(ADODC)和ADO對象編程模型(ADO代碼),。這兩種方式可以單獨使用,,也可以同時使用。
使用ADO數(shù)據(jù)控件的優(yōu)點是代碼少,,一個簡單的數(shù)據(jù)庫應用程序甚至可以不用編寫任何代碼,。它的缺點是功能簡單,不夠靈活,,不能滿足編制較復雜的數(shù)據(jù)庫應用程序的需要,。
使用ADO對象編程模型的優(yōu)點是具有高度的靈活性,可以編制復雜的數(shù)據(jù)庫應用程序,。它的缺點是代碼編寫量較大,對初學者來說有一定困難,。
二,、對記錄集對象的初步理解
無論是使用ADO數(shù)據(jù)控件,還是使用ADO對象編程模型,,都會涉及到記錄集對象,。因此,在討論訪問數(shù)據(jù)庫的兩種方式之前,,有必要初步了解一下記錄集對象,。
請看下面來自學生數(shù)據(jù)庫的幾個集合:
取學籍表(含學號、姓名,、性別等字段)中所有學生的記錄構(gòu)成一個集合,;
取學籍表中所有男生的記錄構(gòu)成一個集合;
取學籍表中張三的學號和姓名,,根據(jù)其學號取成績表(含學號,、課程和分數(shù)三個字段)中張三的各科成績構(gòu)成一個集合。
以上幾個集合都是“記錄的集合”,,由此得出以下概念:
將數(shù)據(jù)庫中一個或多個表中的部分或全部數(shù)據(jù)構(gòu)成一個“記錄的集合”,,這個集合就稱為“記錄集”(Recordset),。若將記錄集看作一個對象,這個對象就是記錄集對象,。
記錄集由行(記錄)和列(字段)構(gòu)成,。
記錄集對象是ADO中的一個功能強大的對象,對數(shù)據(jù)庫的絕大部分操作,,如記錄指針的移動,,記錄的查找、添加,、刪除和修改等,,都是針對記錄集對象進行的。記錄集對象的具體操作將在后面討論,。
三,、用SQL語句生成記錄集
生成記錄集最常用的方法是利用SQL語句。
SQL(Structure Query Language,,結(jié)構(gòu)化查詢語言)中的語句很多,,最常用的是SELECT語句,該語句用于從數(shù)據(jù)庫中篩選(查詢)記錄集,。
SELECT語句可用于ADO數(shù)據(jù)控件的記錄源(RecordSource)屬性,、記錄集的Source屬性和Open方法、Connection和Command對象的Execute方法或Command對象的CommandText屬性,。
1. SELECT語句的語法
SELECT 字段列表 FROM 表名 [WHERE 查詢條件] [GROUP BY 分組字段 [HAVING 分組條件]] [ORDER BY 排序字段 [ASC|DESC]]
說明:
字段列表:逗號分隔(“*”表示所有字段,,來自不同表的同名字段前需加表名和圓點)。
FROM:指定表(可有多個表,,逗號分隔),,必選。
WHERE:選擇記錄的條件,。
GROUP BY及HAVING:分組過濾,,將分組字段表中同值記錄合并為一條記錄。
ORDER BY:排序,。升序:ASC,;降序:DESC。
下面的SQL語句是最簡單的查詢形式,,生成的記錄集包含整個表的全部數(shù)據(jù):
SELECT * FROM 表名
其中“*”指表中所有字段(列),。
示例:
SELECT * FROM 用戶
SELECT 工資.編號,概況.姓名,,工資總額 FROM 工資,,概況WHERE 工資.編號=概況.編號
2. 用WHERE子句限定記錄集篩選條件
在各種子句中,WHERE子句使用頻率最高,。該子句指明查詢的條件,。
在WHERE子句中可使用各種關(guān)系(比較)運算符表示篩選記錄的條件,。
例如,選擇學籍表中所有男生:
SELECT * FROM 學籍 WHERE 性別 = "男"
在WHERE子句中用Like運算符可實現(xiàn)模糊查詢,。
ADO的數(shù)據(jù)提供者所使用的Like運算符的通配符是“%”(VB內(nèi)部為“*”),,可代表任何字符,字符數(shù)不限,。例如,,查詢所有姓“張”的學生:
SELECT * FROM 學籍 WHERE 姓名 Like "張%"
查詢所有姓名中含有“小”字的學生:
SELECT * FROM 學籍 WHERE 姓名 Like "%小%"
查詢姓名最后一個字為“剛”的所有學生:
SELECT * FROM 學籍 WHERE姓名 like "%剛"
SELECT語句與WHERE子句的關(guān)系如圖1-1所示。
3. 用ORDER BY子句排序
用ORDER BY子句(ASC:升序,,默認,;DESC:降序)對記錄排序。例如:
SELECT * FROM 學籍 ORDER BY 學號 ASC
4. 用GROUP BY子句分組
用GROUP BY子句將指定字段中等值的多條記錄合并為一條記錄,??捎?/span>HAVING子句附加條件。
例如,,以“班級”作為分組字段,,查詢各班女生人數(shù):
SELECT 班級,Count(*) AS 女生人數(shù) FROM 成績表 GROUP BY 班級 HAVING 性別="女"
說明:上面的語句中Count(*)表示統(tǒng)計記錄總數(shù),,AS子句表示存放統(tǒng)計結(jié)果的字段別名,。其他SQL函數(shù)還有Sum、Avg,、Max和Min等,。
5. 過濾重復記錄
過濾重復記錄是指忽略字段值相同的重復記錄。例如,,假定學籍表中含有400名學生的信息,,這些學生來自10個班級,現(xiàn)在要查詢學籍表中的“班級”字段生成一個班級名稱記錄集,如果不進行篩選過濾,則生成的記錄集將含有400條記錄,,會有很多班級名稱相同的重復記錄,。過濾重復記錄后,可以生成僅含10個記錄的記錄集,,每個班級的名稱都是惟一的,。過濾重復記錄實際上是對記錄進行分類,可以通過下面的方法實現(xiàn),。
(1)用DISTINCT關(guān)鍵字
在SELECT語句中使用DISTINCT關(guān)鍵字忽略重復記錄,。例如,以下語句可以過濾重復記錄和空字段:
SELECT DISTINCT 班級 FROM 學籍 WHERE 班級<>NULL AND 班級<>""
(2)用GROUP BY子句
如前所述,,用GROUP BY子句可以對記錄進行分組,,實現(xiàn)重復記錄的過濾,。例如:
SELECT 班級 FROM 學籍 GROUP BY 班級 HAVING 班級<>NULL AND 班級<>""
四、使用ADO數(shù)據(jù)控件及數(shù)據(jù)綁定控件
ADO數(shù)據(jù)控件屬于ActiveX控件,,加載后才能使用:
右擊工具箱→部件→選中“Mcrosoft ADO Data Control 6.0(OLE DB)”→確定,。
1. 連接數(shù)據(jù)庫及指定記錄源
ADO數(shù)據(jù)控件與數(shù)據(jù)庫的連接有3種方式:數(shù)據(jù)鏈接文件(.UDL)、ODBC(DSN)和字符串連接,。與Access數(shù)據(jù)庫建立連接的常用方式是字符串連接,。
通常通過屬性頁一次完成連接數(shù)據(jù)庫和指定記錄源的設(shè)置。右擊窗體上的ADO數(shù)據(jù)控件,,在彈出菜單中選擇“ADODC屬性”菜單項,,打開屬性頁對話框。在“通用”選項卡中選擇“使用連接字符串”,,單擊“生成”按鈕,,打開數(shù)據(jù)鏈接屬性窗口。在“提供者”選項卡中選擇“Microsoft Jet 4.0 OLE DB Provider”,,單擊“下一步”按鈕,。在如圖1-2所示的“連接”選項卡中單擊第一個輸入框右側(cè)的 按鈕,在彈出的對話框中選擇數(shù)據(jù)庫,,單擊“打開”后返回“連接”選項卡,,單擊“測試連接”按鈕,成功后單擊“確定”,,完成連接數(shù)據(jù)庫的設(shè)置,,返回屬性頁對話框。
圖1-2 連接數(shù)據(jù)庫
單擊屬性頁對話框“記錄源”選項卡,,顯示如圖1-3所示的窗口,,在“記錄源”選項卡中設(shè)命令類型為“2-adCmdTable”,然后在“表或存儲過程名稱”下拉列表中選擇數(shù)據(jù)表,。也可以設(shè)命令類型為“8-adCmdUnknown”或“1-adCmdText”,,然后在“命令文本(SQL)”文本框中輸入SQL語句,單擊“確定”完成設(shè)置,。
(a) 用數(shù)據(jù)表作記錄源 (b) 用SQL語句作記錄源
圖1-3 設(shè)置記錄源
上述操作實際上是設(shè)置了ADO數(shù)據(jù)控件的兩個重要屬性ConnectionString(連接字符串)和RecordSource(記錄源),。除了使用屬性頁之外,還可通過屬性窗口或程序代碼設(shè)置這兩個屬性,。
在設(shè)置ADO數(shù)據(jù)控件與數(shù)據(jù)庫的連接時,,有一點要提請讀者注意。如圖x-2所示,,在數(shù)據(jù)鏈接屬性窗口的“連接”選項卡中指定數(shù)據(jù)庫時采用的是絕對路徑,,為了保證數(shù)據(jù)庫應用程序移植到其它計算機上仍可正常使用,應在測試連接成功后刪除數(shù)據(jù)庫名稱前面的所有路徑(圖x-2輸入框中的反相顯示部分),僅保留數(shù)據(jù)庫文件名,。將數(shù)據(jù)庫文件與工程文件存放在同一文件夾下,,在工程啟動窗體的Initialize事件過程中進行路徑初始化處理:
Private Sub Form_Initialize()
ChDrive App.Path '設(shè)當前驅(qū)動器為工程所在驅(qū)動器
ChDir App.Path '設(shè)當前目錄為工程所在目錄
End Sub
2. 用代碼設(shè)置或改變記錄源
ADO數(shù)據(jù)控件一旦建立了與數(shù)據(jù)庫的連接,就可以通過設(shè)置或改變其RecordSource(記錄源)屬性訪問數(shù)據(jù)庫中的任何表,,亦可訪問由一個或多個表中的部分或全部數(shù)據(jù)構(gòu)成的記錄集,。在實際應用中,常常在程序運行時用代碼設(shè)置RecordSource屬性及其相關(guān)屬性,,從而使ADO數(shù)據(jù)控件具有更大的靈活性,。例如:
用數(shù)據(jù)表名稱作為記錄源
Adodc1.CommandType = adCmdTable
Adodc1.RecordSource = "學籍"
Adodc1.Refresh
用SQL語句生成的記錄集作為記錄源
Adodc1.CommandType = adCmdText
Adodc1.RecordSource = "SELECT * FROM 學籍"
Adodc1.Refresh
注意:設(shè)置記錄源后,必須調(diào)用ADO數(shù)據(jù)控件的Refresh方法刷新對數(shù)據(jù)庫的訪問,。
3. SQL語句的應用形式
在程序代碼中,,SQL語句必須以字符串形式提供。例如:
Adodc1.RecordSource = "SELECT * FROM 學籍"
如果SQL語句中含有字符串常量,,必須將字符串常量放在一對單引號中,,例如:
Dim strSQL As String
strSQL = "SELECT * FROM 學籍 WHERE 性別 = '男'"
Adodc1.RecordSource = strSQL
如果SQL語句中引用了String型變量或其他控件的字符串類型的屬性(如文本框的Text屬性),應當采用下面的引用形式(注意單引號的位置):
" ... '" & 字符串變量或控件屬性 & "' ... "
例如:
Dim strSQL As String, strSex As String
strSex = "男"
strSQL = "SELECT * FROM 學籍 WHERE 性別 = '" & strSex & "'"
Adodc1.RecordSource = strSQL
又如:
Dim strSQL As String
Text1.Text = "張"
strSQL = "SELECT * FROM 學籍 WHERE 姓名 Like '" & Text1.Text & "%'"
Adodc1.RecordSource = strSQL
如果SQL語句中引用了其他類型的變量或控件屬性,,不使用單引號,。例如:
Dim strSQL As String, intGrade As Integer
intGrade = 60
strSQL = "SELECT * FROM 成績 WHERE 分數(shù) >= " & intGrade _
& " AND 課程='英語'"
Adodc1.RecordSource = strSQL
4. 數(shù)據(jù)綁定控件
ADO數(shù)據(jù)控件本身不能顯示記錄集,需通過綁定具有顯示功能的其他控件顯示記錄集,,這些控件稱為數(shù)據(jù)綁定控件或數(shù)據(jù)識別控件,,如文本框、標簽,、圖像(片)框,、列表框、組合框,、復選框,、DataGrid等。
(1)數(shù)據(jù)綁定控件的相關(guān)屬性
DataSource屬性(數(shù)據(jù)源):指定(綁定到)ADO數(shù)據(jù)控件
DataField屬性(數(shù)據(jù)字段):綁定到特定字段,。綁定后只要移動指針,,自動寫入修改內(nèi)容。
(2)在屬性窗口設(shè)置綁定控件屬性
在屬性窗口將數(shù)據(jù)綁定控件的DataSource屬性設(shè)為ADO數(shù)據(jù)控件(如Adodc1),。如果是單字段顯示控件(如文本框等),,還需將控件的DataField屬性設(shè)置為特定字段。DataGrid控件屬于多字段顯示控件,,沒有DataField屬性,。
(3)用代碼設(shè)置綁定控件屬性
程序運行時可以動態(tài)地設(shè)置數(shù)據(jù)綁定控件的屬性,。例如:
Set Text1.DataSource = Adodc1
Text1.DataField = "姓名"
Set DataGrid1.DataSource = Adodc1
說明:DataSource是對象類型的屬性,,必須用Set語句為其賦值。
5. 不用綁定方法如何顯示和處理記錄集內(nèi)容
不使用綁定的方法處理記錄集比較靈活,,缺點是代碼編寫量較大,。
(1)記錄集內(nèi)容的顯示
控件屬性 = 記錄集(“字段”)
例如:
Text1.Text = Adodc1.Recordset("學號")
Text2.Text = Adodc1.Recordset("姓名")
每當記錄指針移動時均需對控件屬性重新賦值,。若需要顯示的字段較多,可以編制一個自定義過程用于記錄指針移動時顯示各字段內(nèi)容,。
(2)為記錄集字段賦值
記錄集(“字段”) = 控件屬性
例如:
Adodc1.Recordset("學號") = Text1.Text
Adodc1.Recordset("姓名") = Text2.Text
Adodc1.Recordset.Update
說明:為字段賦值后,,應調(diào)用記錄集的Update方法更新數(shù)據(jù)庫。
五,、數(shù)據(jù)庫記錄的操作
數(shù)據(jù)庫記錄的操作是針對記錄集對象的操作,。下面討論的所有通過代碼操作記錄的方法對ADO數(shù)據(jù)控件和ADO對象編程模型中的記錄集對象都是適用的。
1. 移動記錄指針
(1)無編程法
不需編寫代碼,,直接利用ADO數(shù)據(jù)控件上的4個按鈕:首記錄,、上一記錄、下一記錄,、末記錄,。
(2)編程法
有時因為用戶界面的需要,將ADO數(shù)據(jù)控件隱藏(Visibal=False),,只能通過編寫代碼實現(xiàn)記錄指針的移動,。具體步驟如下:
在窗體上放置4個命令按鈕,分別為首記錄,、上一記錄,、下一記錄、末記錄,。
在上述按鈕的單擊事件中,,用記錄集的Move方法組移動記錄:
Adodc1.Recordset.MoveFirst
Adodc1.Recordset.MovePrevious
Adodc1.Recordset.MoveNext
Adodc1.Recordset.MoveLast
記錄指針的移動如圖1-4所示。
BOF
首記錄(First)
…
…
末記錄(Last)
EOF
|
圖1-4 移動記錄指針
BOF和EOF是記錄集的兩個特殊位置,,BOF位于第一個記錄之前(記錄集頭),,EOF位于最后一個記錄之后(記錄集尾)。當記錄指針移到BOF時,,若再向前(MovePrevious)移動,,或移到EOF時,再向后(MoveNext)移動,,將會引發(fā)錯誤,。采用下面的措施可以防止發(fā)生此類錯誤。
在“上一記錄”按鈕的單擊事件中作如下處理:
Adodc1.Recordset.MovePrevious
If Adodc1.Recordset.BOF = True Then Adodc1.Recordset.MoveFirst
在“下一記錄”按鈕的單擊事件中作如下處理:
Adodc1.Recordset.MoveNext
If Adodc1.Recordset.EOF = True Then Adodc1.Recordset.MoveLast
2. 查找記錄
查找記錄的方法很多,,較常用的有以下幾種,。
(1)用Find方法
記錄集的Find方法搜索記錄集中滿足指定條件的記錄(不區(qū)分大小寫)。如果條件滿足,,則記錄集指針定位于找到的記錄上,,否則指針定位于記錄集的末尾(EOF)。
語法:
記錄集.Find 條件[,跳行,,搜索方向,,開始位置]
參數(shù)說明:
條件:字符串,類似于SQL語句中WHERE子句的條件,,包括字段名,、比較操作符和值。
比較操作符可以是“>”,、“<”,、“=”、“>=”,、“<=”,、“<>”或“like”。
值可以是字符串,、數(shù)值或者日期,。字符串值以單引號分界(如“用戶名 = 'Admin'”);日期值以“#”分界(如“出生日期 > #1980/1/1#”),。
如果比較操作符為“like”,,則字符串值可以含有一個“%”(只能放在字符串最后),實現(xiàn)模糊比較,,但功能有限,。例如:
“姓名 like ‘王%’”
若與變量或控件屬性值比較,需用&連接,。例如:
Adodc1.Recordset.Find “用戶名=‘” & txtUserID.Text & “’”
跳行:可選,,長整型值,其默認值為零,,指定搜索的位移量,。若該選項設(shè)為1,連續(xù)執(zhí)行Find方法,,可依次找出每個符合條件的記錄,。
搜索方向:可選,指定搜索應從當前行還是下一個有效行開始,。其值可為adSearchForward(頭→尾)或adSearchBackward(尾→頭),。
開始位置:可選,變體型書簽,,用作搜索的開始位置,。
調(diào)用Find方法時,通常只帶有條件參數(shù)即可,,調(diào)用前先將記錄指針指向首記錄,。例如:
Adodc1.Recordset.MoveFirst
Adodc1.Recordset.Find "姓名 = '張三'"
If Adodc1.Recordset.EOF = True Then
MsgBox "未查到姓名為張三的記錄,。"
End If
(2)用循環(huán)結(jié)構(gòu)
通過循環(huán)結(jié)構(gòu)遍歷記錄集(適用于各種類型),查找符合條件的記錄(默認區(qū)分大小寫),。
例如:
Adodc1.Recordset.MoveFirst
Do While Not Adodc1.Recordset.EOF
If Adodc1.Recordset("姓名") = "李四" Then Exit Do ‘找到,退出循環(huán)
Adodc1.Recordset.MoveNext
Loop
If Adodc1.Recordset.EOF = True Then '若指針指向記錄集尾,,說明未找到
...
Else '否則,,說明找到符合條件的記錄
...
End If
(3)用SQL語句
用SQL語句生成只包括待查記錄的記錄集,若BOF和EOF均為True,,則為空記錄集,。例如:
Dim strSQL As String
strSQL = "SELECT * FROM 用戶 WHERE 用戶名='" & txtUserID.Text & "'"
Adodc1.RecordSource = strSQL
Adodc1.Refresh
If Adodc1.Recordset.BOF = True And Adodc1.Recordset.EOF = True Then
MsgBox "無此用戶!"
End If
3. 添加記錄
用記錄集的AddNew方法添加記錄,。
語法:
記錄集.AddNew [字段名, 字段值]
可以先用無參數(shù)的AddNew方法添加一個空記錄,,然后為字段賦值,最后調(diào)用記錄集的Update方法更新數(shù)據(jù)庫,。例如:
Adodc1.Recordset.AddNew
Adodc1.Recordset("學號") = "030101001"
Adodc1.Recordset("姓名") = "張三"
Adodc1.Recordset.Update
也可以通過控件屬性或變量為字段賦值,,例如用文本框中的內(nèi)容為字段賦值:
Adodc1.Recordset.AddNew
Adodc1.Recordset("學號") = txtNo.Text
Adodc1.Recordset("姓名") = txtName.Text
Adodc1.Recordset.Update
說明:如果在調(diào)用Update方法之前移動了記錄指針,系統(tǒng)將自動調(diào)用Update方法,。
4. 修改記錄
為記錄的字段重新賦值即可實現(xiàn)記錄的修改,。
為字段賦值的常用形式:
記錄集(“字段名”)= 新值
記錄集!字段名= 新值
記錄集.Fields(索引) = 新值
例如:
Adodc1.Recordset("學號") = "030101001"
Adodc1.Recordset!姓名 = "張三"
Adodc1.Recordset.Update
或者:
Adodc1.Recordset.Fields(0) = "030101001"
Adodc1.Recordset.Fields(1) = "張三"
Adodc1.Recordset.Update
說明:Fields是記錄集的字段集合,索引從0開始,。修改記錄后,,應調(diào)用記錄集的Update方法更新數(shù)據(jù)庫。
5. 刪除記錄
用記錄集的Delete方法刪除記錄,。
語法:
記錄集.Delete [AffectRecords]
AffectRecords參數(shù)的取值:
AdAffectCurrent:默認,。僅刪除當前記錄。
AdAffectGroup:刪除滿足記錄集Filter屬性設(shè)置的記錄,。
AdAffectAll:刪除所有記錄,。(隱含參數(shù))
AdAffectAllChapters:刪除所有子集記錄。
例如:
Adodc1.Recordset.Delete
Adodc1.Recordset.MoveNext
If Adodc1.Recordset.EOF And Adodc1.Recordset.RecordCount > 0 Then
Adodc1.Recordset.MoveLast
End If
說明:刪除當前記錄后,,數(shù)據(jù)綁定控件(如文本框等)仍將保持已被刪除的記錄內(nèi)容而不刷新,。將記錄指針移動到下一條記錄,可以讓用戶感覺到記錄已被刪除,,同時自動調(diào)用Update方法更新數(shù)據(jù)庫,。
六、ADO編程模型簡介
ADO的核心是Connection,、Recordset和Command對象,。ADO編程模型不使用ADO數(shù)據(jù)控件,直接用代碼通過ADO對象訪問數(shù)據(jù)庫,。
使用ADO編程模型需事先添加ADO對象類庫的“引用”:
工程→引用→選中“Microsoft ActiveX Data Objects 2.x Library”→確定,。
添加“引用”后,,應聲明ADO對象變量:
Dim 變量名 As New ADODB.對象
1. Connection對象
用于建立與數(shù)據(jù)源的連接。
聲明示例:
Dim cnn As New ADODB.Connection
一個Connection對象可以為多個Recordset和Command對象提供數(shù)據(jù)庫連接服務,??梢栽诔绦虻臉藴誓K中聲明一個全局Connection對象變量,供其他模塊調(diào)用:
Public pubCnn As New ADODB.Connection
2. Recordset對象
該對象表示記錄集,,用于記錄指針的移動和記錄的查找,、添加、修改或刪除,。
聲明示例:
Dim rs As New ADODB.Recordset
3. Command對象
該對象用于對數(shù)據(jù)源執(zhí)行指定的命令,,如數(shù)據(jù)的添加、刪除,、更新或查詢,。
聲明示例:
Dim cmm As New ADODB.Command
4. 使用ADO編程模型的一般步驟
ADO對象模型中對象的功能有交叉(冗余),對于一般的數(shù)據(jù)庫應用程序,,可不必使用Command對象,。
(1)聲明ADO對象變量
Dim cnn As New ADODB.Connection '連接對象
Dim rs As New ADODB.Recordset '記錄集對象
(2)與數(shù)據(jù)庫建立連接
為了保證數(shù)據(jù)庫應用程序移植到其它計算機上仍可正常使用,應將當前工程與數(shù)據(jù)庫文件保存在同一目錄,,并進行以下初始化處理:
Dim MyPath As String '用于存放路徑
MyPath = App.Path '取本工程所在路徑
'若非根目錄,,路徑后加"\"
If Right$(MyPath,1) <> "\" Then MyPath = MyPath & "\"
然后建立與數(shù)據(jù)庫的連接:
cnn.Provider = "Microsoft.Jet.OLEDB.4.0" '指定提供者
'設(shè)置數(shù)據(jù)源(指定數(shù)據(jù)庫)
cnn.ConnectionString = "Data Source=" & MyPath & "Student.mdb"
cnn.Open '與數(shù)據(jù)庫建立連接
(3)設(shè)置記錄集相關(guān)屬性
設(shè)置記錄集的鎖定類型(LockType)、游標類型(CursorType),、使用的連接對象(ActiveConnection)和記錄源(Source):
'鎖定類型:開放式記錄鎖定
rs.LockType = adLockOptimistic
'游標類型:鍵集游標,允許在記錄集中進行所有類型的移動
rs.CursorType = adOpenKeyset
'設(shè)置記錄集使用的連接對象為打開的 Connection 對象
Set rs.ActiveConnection = cnn
'設(shè)置記錄集的記錄源
rs.Source = "SELECT * FROM 學籍"
說明:以上屬性的設(shè)置必須在記錄集關(guān)閉狀態(tài)下方可進行,。首次設(shè)定記錄集的鎖定類型、游標類型和連接對象后,,如果不需要改變設(shè)置內(nèi)容,,則不必重復設(shè)定。經(jīng)常發(fā)生變化的是記錄源(Source屬性),。
(4)打開記錄集
用記錄集的Open方法打開記錄集,。
rs.Open
說明:如果記錄集已經(jīng)打開,調(diào)用Open方法將引發(fā)錯誤,。
(5)對記錄集進行操作
在前面的“數(shù)據(jù)庫記錄的操作”一節(jié)中已作了較詳細的討論,,在此僅舉一例:
rs.MoveFirst '指針移到首記錄
(6)ADO對象的關(guān)閉和釋放
調(diào)用Close方法可關(guān)閉Connection或Recordset對象。例如:
rs.Close
cnn.Close
關(guān)閉對象并非將其從內(nèi)存中刪除,,對象關(guān)閉后可以更改其屬性設(shè)置,,然后再次打開。要將對象從內(nèi)存中完全刪除,,可將對象變量設(shè)置為Nothing,。例如:
Set rs = Nothing
Set cnn = Nothing
5. 記錄集的Open方法
前面討論打開記錄集時,事先已對記錄集的有關(guān)屬性進行了設(shè)置,,使用的是沒有參數(shù)的Open方法,。若使用帶有參數(shù)的Open方法,,可以在打開記錄集的同時設(shè)置記錄集的相關(guān)屬性。
語法:
記錄集.Open [記錄源, 活動連接, 游標類型, 鎖定類型, 命令類型]
記錄集的Open方法有五個可選參數(shù),,其中前四個參數(shù)代表了前面已經(jīng)討論過的記錄集的四個重要屬性,。最后一個參數(shù)“命令類型”與ADO數(shù)據(jù)控件的CommandType屬性相似,默認值為adCmdUnknown(未知命令類型),,可以將其設(shè)置為adCmdText(SQL語句)或adCmdTable(數(shù)據(jù)庫中表的名稱),,但必須與“記錄源”參數(shù)的內(nèi)容相對應。
設(shè)cnn為已經(jīng)與數(shù)據(jù)庫建立連接的Connection對象,,可以用以下程序段打開記錄集:
Dim rs As New ADODB.Recordset
Dim strSQL As String
strSQL = "學籍"
'用數(shù)據(jù)庫中的表作為記錄源
rs.Open strSQL, cnn, adOpenKeyset , adLockOptimistic, adCmdTable
...
rs.Close
strSQL = "SELECT * FROM 學籍 WHERE 性別='男'"
'用SQL語句作為記錄源
rs.Open strSQL, cnn, adOpenKeyset , adLockOptimistic, adCmdText
小結(jié)
1. VB提供了利用ADO訪問數(shù)據(jù)庫的兩種主要形式:ADO數(shù)據(jù)控件和ADO對象編程模型,。這兩種方式可以單獨使用,,也可以同時使用,。
2. 記錄集對象是ADO中的一個功能強大的對象,對數(shù)據(jù)庫的絕大部分操作,,如記錄指針的移動,,記錄的查找、添加,、刪除和修改等,,都是針對記錄集對象進行的。
3. 生成記錄集最常用的方法是利用SQL語句,,其中最常用的是SELECT語句,,該語句用于從數(shù)據(jù)庫中篩選(查詢)記錄集。在各種子句中,,WHERE子句使用頻率最高,,該子句指明查詢的條件。在程序代碼中,,SQL語句必須以字符串形式提供給ADO對象的相關(guān)屬性和方法,。
4. ADO數(shù)據(jù)控件與Access數(shù)據(jù)庫建立連接的常用方式是字符串連接。通常用屬性頁完成對ADO數(shù)據(jù)控件連接數(shù)據(jù)庫和指定記錄源的設(shè)置,。在程序運行時可以用代碼設(shè)置RecordSource屬性,,從而使ADO數(shù)據(jù)控件具有更大的靈活性。ADO數(shù)據(jù)控件本身不能顯示記錄集,,需通過數(shù)據(jù)綁定控件顯示和處理記錄集,。
5. 數(shù)據(jù)庫記錄的操作是針對記錄集對象的操作。記錄操作包括記錄指針的移動,,記錄的查找,、添加、刪除和修改,,這些操作是編制數(shù)據(jù)庫應用程序的主要內(nèi)容,。
6. ADO編程模型不使用ADO數(shù)據(jù)控件,,直接用代碼通過ADO對象訪問數(shù)據(jù)庫。使用ADO編程模型的一般步驟為:聲明ADO對象變量,;與數(shù)據(jù)庫建立連接,;設(shè)置記錄集相關(guān)屬性;打開記錄集,;對記錄集進行操作,;關(guān)閉和釋放ADO對象。
|