第14章 編輯SQL Server數(shù)據(jù)庫(kù)數(shù)據(jù)
編輯SQL Server數(shù)據(jù)庫(kù)數(shù)據(jù),就是往數(shù)據(jù)庫(kù)添加新記錄、修改更新記錄和刪除不需要的記錄。我們既可以通過(guò)企業(yè)管理器編輯數(shù)據(jù)庫(kù)數(shù)據(jù),也可以通過(guò)Excel VBA編制程序?qū)崿F(xiàn)編輯數(shù)據(jù)的自動(dòng)化。
14.1 添加新記錄
添加新記錄可以使用SQL的INSERT INTO語(yǔ)句,其語(yǔ)法格式如下:
INSERT INTO 數(shù)據(jù)表名(字段1,字段2,……) VALUES(值1,值2,……)
如果要輸入全部字段數(shù)據(jù),那么就可以省略字段列表,即:
INSERT INTO 數(shù)據(jù)表名 VALUES(值1,值2,……)
在VALUES參數(shù)列表中,各個(gè)值要與前面的字段一一對(duì)應(yīng)。如果字段的數(shù)據(jù)類型是文本型或日期時(shí)間型,則參數(shù)值要用單引號(hào)“‘”括趕來(lái);如果字段的數(shù)據(jù)類型是數(shù)值型,則參數(shù)值直接為數(shù)字。
【例14-1】下面的例子是向數(shù)據(jù)表“成績(jī)”中添加一條記錄,該條記錄的各個(gè)字段數(shù)據(jù)如下:
學(xué)號(hào) A01200601
課程代碼 200601007
成績(jī) 85
學(xué)期 2006學(xué)年第一學(xué)期
在運(yùn)行下面的程序之前,要確保已經(jīng)引用了ADO對(duì)象庫(kù)MicrosoftActive Data Objects 2.5 Library或其他版本(如Microsoft Active Data Objects 2.1 Library、Microsoft Active Data Objects 2.8 Library等)。同時(shí),還要根據(jù)電腦實(shí)際情況,將連接字符串中的SQL Server服務(wù)器名稱進(jìn)行變更,并輸入相應(yīng)的用戶名和密碼(如果有的話)。
Public Sub 例14—1()
Dim cnn As New ADODB.Connection
'建立與指定SQL Server數(shù)據(jù)庫(kù)的連接
cnn.ConnectionString = "Provider=SQLOLEDB;" _
& "User ID=sa;" _
& "password=11111;" _
& "Data Source=THTFCOMPUTER;" _
& "Initial Catalog=研究生管理"
cnn.Open
'添加新記錄
If MsgBox("下面將向數(shù)據(jù)表<成績(jī)>添加新記錄!是否添加?", _
vbQuestion + vbYesNo) = vbYes Then
SQL = " insert into 成績(jī)(學(xué)號(hào),課程代碼,成績(jī),學(xué)期) " _
&"values('A01200601','200601007',85,'2006學(xué)年第一學(xué)期')"
cnn.ExecuteSQL
MsgBox "數(shù)據(jù)添加成功!", vbInformation
Else
MsgBox "添加數(shù)據(jù)操作被取消!", vbExclamation
End If
'關(guān)機(jī)記錄集以及與數(shù)據(jù)庫(kù)的連接
cnn.Close
Set cnn = Nothing
End Sub
在這個(gè)程序中,由于是添加數(shù)據(jù)表的所有字段數(shù)據(jù),因此SQL語(yǔ)句還簡(jiǎn)化為下面的情形:
SQL = “insertinto 成績(jī) values(‘A
在很多情況下,可能要從其他的數(shù)據(jù)表中查詢出符合條件的記錄,然后將這些記錄輸入到當(dāng)前的數(shù)據(jù)表中,這就是一次輸入多條記錄的情況。在此情況下,可以使用追加查詢的方法來(lái)輸入數(shù)據(jù)。
如果是單獨(dú)給定了要添加的記錄數(shù)據(jù),我們可以將這些數(shù)據(jù)保存到數(shù)組中,然后通過(guò)循環(huán)數(shù)組的方式向數(shù)據(jù)表中逐條添加記錄。
【例14-2】下面的例子是向數(shù)據(jù)表“成績(jī)”中添加3條記錄,其各個(gè)字段數(shù)據(jù)如下:
學(xué)號(hào) | 課程代碼 | 成績(jī) | 學(xué)期 |
A01200601 | 200601007 | 85 | 2006學(xué)年第一學(xué)期 |
A01200602 | 200601007 | 92 | 2006學(xué)年第一學(xué)期 |
A01200603 | 200601007 | 69 | 2006學(xué)年第一學(xué)期 |
在運(yùn)行下面的程序之前,要確保已經(jīng)引用了ADO對(duì)象庫(kù)MicrosoftActive Data Objects 2.5 Library或其他版本(如Microsoft Active Data Objects 2.1 Library、Microsoft Active Data Objects 2.8 Library等)。同時(shí),還要根據(jù)電腦實(shí)際情況,將連接字符串中的SQL Server服務(wù)器名稱進(jìn)行變更,并輸入相應(yīng)的用戶名和密碼(如果有的話)。
Public Sub 例14—2()
Dim cnn As New ADODB.Connection
Dim myColumn As Variant, myValue1 As Variant, myValue2 As Variant
Dim myValue3 As Variant, myValue4 As Variant
Dim i As Integer
Dim myStr As String
'建立與指定SQL Server數(shù)據(jù)庫(kù)的連接
cnn.ConnectionString = "Provider=SQLOLEDB;" _
& "User ID=sa;" _
& "password=11111;" _
& "Data Source=THTFCOMPUTER;" _
& "Initial Catalog=研究生管理"
cnn.Open
'添加新記錄
If MsgBox("下面將向數(shù)據(jù)表<成績(jī)>添加新記錄!是否添加?", _
vbQuestion + vbYesNo) = vbYes Then
myColumn = "(學(xué)號(hào),課程代碼,成績(jī),學(xué)期)”"
myValue1 = Array("A01200601", "A01200602","A01200603")
myValue2 = Array("200601004", "200601004","200601007")
myValue3 = Array(85, 92, 69)
myValue4 = Array("2006學(xué)年第一學(xué)期","2006學(xué)年第一學(xué)期", "2006學(xué)年第一學(xué)期")
For i = 0 To UBound(myValue1)
myStr = "values("
myStr = myStr & "'" & myValue1(i) &"','" & myValue2(i) _
& "'," &myValue3(i) & ",'" & myValue4(i) & "')"
SQL = "insert into 成績(jī) " & myColumn & " "& myStr
cnn.Execute SQL
Next i
MsgBox "數(shù)據(jù)添加成功!", vbInformation
Else
MsgBox "添加數(shù)據(jù)操作被取消!", vbExclamation
End If
'關(guān)閉記錄集以及與數(shù)據(jù)庫(kù)的連接
cnn.Close
Set cnn = Nothing
End Sub
將工作表的數(shù)據(jù)添加到數(shù)據(jù)庫(kù),可以采用【例14-2】的方法,循環(huán)工作表的各行數(shù)據(jù)并向數(shù)據(jù)表添加數(shù)據(jù)。
【例14-3】下面的例子是將工作表的數(shù)據(jù)添加到數(shù)據(jù)表“成績(jī)”中,工作表數(shù)據(jù)如圖14-1所示。
在運(yùn)行下面的程序之前,要確保已經(jīng)引用了ADO對(duì)象庫(kù)MicrosoftActive Data Objects 2.5 Library或其他版本(如Microsoft Active Data Objects 2.1 Library、Microsoft Active Data Objects 2.8 Library等)。同時(shí),還要根據(jù)電腦實(shí)際情況,將連接字符串中的SQL Server服務(wù)器名稱進(jìn)行變更,并輸入相應(yīng)的用戶名和密碼(如果有的話)。
Public Sub 例14—3()
Dim cnn As New ADODB.Connection
Dim i As Integer
Dim myStr As String
'建立與指定SQL Server數(shù)據(jù)庫(kù)的連接
cnn.ConnectionString = "Provider=SQLOLEDB;" _
& "User ID=sa;" _
& "password=11111;" _
& "Data Source=THTFCOMPUTER;" _
& "Initial Catalog=研究生管理"
cnn.Open
'添加新記錄
If MsgBox("下面將把工作表的數(shù)據(jù)添加到數(shù)據(jù)表<成績(jī)>!是否添加?", _
vbQuestion + vbYesNo) = vbYes Then
myColumn = "(學(xué)號(hào),課程代碼,成績(jī),學(xué)期)”"
For i = 2 To Range("A65536").End(xlUp).Row
myStr = "values("
myStr = myStr & "'" & Cells(i, 1) &"','" & Cells(i, 2) _
& "'," &Cells(i, 3) & ",'" & Cells(i, 4) & "')"
SQL = "insert into 成績(jī) " & myColumn & " "& myStr
cnn.Execute SQL
Next i
MsgBox "數(shù)據(jù)添加成功!", vbInformation
Else
MsgBox "添加數(shù)據(jù)操作被取消!", vbExclamation
End If
'關(guān)閉記錄集以及與數(shù)據(jù)庫(kù)的連接
cnn.Close
Set cnn = Nothing
End Sub
空值是指字段的數(shù)據(jù)值未知,既不是0,也不是零長(zhǎng)度的字符串(零長(zhǎng)度的字符串看起來(lái)好象沒(méi)有數(shù)據(jù))。在企業(yè)管理器中輸入空值需要按【Ctrl+0】組合鍵,此時(shí)該字段數(shù)據(jù)顯示為“<NULL>”,但當(dāng)光標(biāo)移到該字段時(shí),“<NULL>”就消失了。
為某字段插入空值,就是直接將該字段值設(shè)置為“<NULL>”。
【例14-4】下面的例子是往數(shù)據(jù)表“研究生”中添加一個(gè)新記錄,數(shù)據(jù)如下所示:
在運(yùn)行下面的程序之前,要確保已經(jīng)引用了ADO對(duì)象庫(kù)MicrosoftActive Data Objects 2.5 Library或其他版本(如Microsoft Active Data Objects 2.1 Library、Microsoft Active Data Objects 2.8 Library等)。同時(shí),還要根據(jù)電腦實(shí)際情況,將連接字符串中的SQL Server服務(wù)器名稱進(jìn)行變更,并輸入相應(yīng)的用戶名和密碼(如果有的話)。
Public Sub 例14—4()
Dim cnn As New ADODB.Connection
Dim rs As New ADODB.Recordset
'建立與指定SQL Server數(shù)據(jù)庫(kù)的連接
cnn.ConnectionString = "Provider=SQLOLEDB;" _
& "User ID=sa;" _
& "password=11111;" _
& "Data Source=THTFCOMPUTER;" _
& "Initial Catalog=研究生管理"
cnn.Open
'添加新記錄
If MsgBox("下面將向數(shù)據(jù)表<成績(jī)>添加新記錄!是否添加?", _
vbQuestion + vbYesNo) = vbYes Then
SQL = "insert into 研究生 values('A04200603','祝麗萍','女' " _
& " '
cnn.Execute SQL
MsgBox "數(shù)據(jù)添加成功!", vbInformation
Else
MsgBox "添加數(shù)據(jù)操作被取消!", vbExclamation
End If
'關(guān)閉記錄集以及與數(shù)據(jù)庫(kù)的連接
cnn.Close
Set cnn = Nothing
End Sub
運(yùn)行上面的程序,然后打開數(shù)據(jù)表,可以看到在數(shù)據(jù)表中添加了這個(gè)新記錄,它的“研究方向”字段是一個(gè)空值NULL,如圖14-2所示。
14.2 修改更新記錄
有時(shí)候可能需要修改數(shù)據(jù)庫(kù)中的數(shù)據(jù)。此時(shí),就需要用到SQL的UPDATE語(yǔ)句,其語(yǔ)法結(jié)構(gòu)如下:
UPDATE 數(shù)據(jù)表名 SET 字段1=新值1,字段2=新值2,……WHERE 條件
【例14-5】下面的例子是將數(shù)據(jù)表“研究生”中的學(xué)號(hào)為“A02200601”的“研究方向”由目前的空值改為“證券投資”。
在運(yùn)行下面的程序之前,要確保已經(jīng)引用了ADO對(duì)象庫(kù)MicrosoftActive Data Objects 2.5 Library或其他版本(如Microsoft Active Data Objects 2.1 Library、Microsoft Active Data Objects 2.8 Library等)。同時(shí),還要根據(jù)電腦實(shí)際情況,將連接字符串中的SQL Server服務(wù)器名稱進(jìn)行變更,并輸入相應(yīng)的用戶名和密碼(如果有的話)。
Public Sub 例14—5()
Dim cnn As New ADODB.Connection
Dim rs As New ADODB.Recordset
'建立與指定SQL Server數(shù)據(jù)庫(kù)的連接
cnn.ConnectionString = "Provider=SQLOLEDB;" _
& "User ID=sa;" _
& "password=11111;" _
& "Data Source=THTFCOMPUTER;" _
& "Initial Catalog=研究生管理"
cnn.Open
'添加新記錄
If MsgBox("下面將修改數(shù)據(jù)表<研究生>的記錄!是否修改?", _
vbQuestion + vbYesNo) = vbYes Then
SQL = "update 研究生 set 研究方向=‘證券投資’ where 學(xué)號(hào)=‘A
cnn.Execute SQL
MsgBox "數(shù)據(jù)添加成功!", vbInformation
Else
MsgBox "添加數(shù)據(jù)操作被取消!", vbExclamation
End If
'關(guān)閉記錄集以及與數(shù)據(jù)庫(kù)的連接
cnn.Close
Set cnn = Nothing
End Sub
運(yùn)行上面的程序,然后打開數(shù)據(jù)表,可以看到學(xué)號(hào)為“A02200601”的“研究方向”由目前的空值改為“證券投資”,如圖14-3所示。
在UPDATE語(yǔ)句中,使用WHERE子句,我們可以一次修改多個(gè)滿足條件的記錄。
【例14-6】下面的例子是將數(shù)據(jù)表“成績(jī)”中的選修編碼為“200601003”課程的分?jǐn)?shù)都加5分。
在運(yùn)行下面的程序之前,要確保已經(jīng)引用了ADO對(duì)象庫(kù)MicrosoftActive Data Objects 2.5 Library或其他版本(如Microsoft Active Data Objects 2.1 Library、Microsoft Active Data Objects 2.8 Library等)。同時(shí),還要根據(jù)電腦實(shí)際情況,將連接字符串中的SQL Server服務(wù)器名稱進(jìn)行變更,并輸入相應(yīng)的用戶名和密碼(如果有的話)。
Public Sub 例14—6()
Dim cnn As New ADODB.Connection
Dim rs As New ADODB.Recordset
'建立與指定SQL Server數(shù)據(jù)庫(kù)的連接
cnn.ConnectionString = "Provider=SQLOLEDB;" _
& "User ID=sa;" _
& "password=11111;" _
& "Data Source=THTFCOMPUTER;" _
& "Initial Catalog=研究生管理"
cnn.Open
'添加新記錄
If MsgBox("下面將修改數(shù)據(jù)表<研究生>的記錄!是否修改?", _
vbQuestion + vbYesNo) = vbYes Then
SQL = "update 成績(jī) set 成績(jī)=成績(jī)+5 where 課程代碼=‘
cnn.Execute SQL
MsgBox "數(shù)據(jù)添加成功!", vbInformation
Else
MsgBox "添加數(shù)據(jù)操作被取消!", vbExclamation
End If
'關(guān)閉記錄集以及與數(shù)據(jù)庫(kù)的連接
cnn.Close
Set cnn = Nothing
End Sub
運(yùn)行上面的程序,然后打開數(shù)據(jù)表,可以看到選修編碼為“200601003”課程的分?jǐn)?shù)都被加了5分,如圖14-4所示(請(qǐng)與圖14-5所示修改前的數(shù)據(jù)進(jìn)行比較)。
14.3 刪除記錄
在某些情況下,可能需要直接從數(shù)據(jù)庫(kù)中刪除一些記錄,這可以由DELETE FROM語(yǔ)句來(lái)完成,其語(yǔ)法如下:
DELETE FROM 數(shù)據(jù)表名 WHERE 條件表達(dá)式
如果在DELETE FROM語(yǔ)句中不加任何條件,那么就會(huì)刪除整個(gè)數(shù)據(jù)表的數(shù)據(jù),僅僅留下一個(gè)空白的沒(méi)有任何記錄的數(shù)據(jù)表。
由于數(shù)據(jù)一旦刪除將無(wú)法恢復(fù),因此在用DELETE FROM語(yǔ)句刪除數(shù)據(jù)時(shí)要特別慎重,最好設(shè)置一個(gè)緩沖,例如設(shè)置一個(gè)是否刪除數(shù)據(jù)的詢問(wèn)框,并將默認(rèn)按鈕設(shè)置為“否”。
【例14-7】下面的例子是將數(shù)據(jù)表“研究生”中的學(xué)號(hào)為“A02200601”的記錄刪除。
在運(yùn)行下面的程序之前,要確保已經(jīng)引用了ADO對(duì)象庫(kù)MicrosoftActive Data Objects 2.5 Library或其他版本(如Microsoft Active Data Objects 2.1 Library、Microsoft Active Data Objects 2.8 Library等)。同時(shí),還要根據(jù)電腦實(shí)際情況,將連接字符串中的SQL Server服務(wù)器名稱進(jìn)行變更,并輸入相應(yīng)的用戶名和密碼(如果有的話)。
在運(yùn)行下面的程序之前,要確保已經(jīng)引用了ADO對(duì)象庫(kù)MicrosoftActive Data Objects 2.5 Library或其他版本(如Microsoft Active Data Objects 2.1 Library、Microsoft Active Data Objects 2.8 Library等)。同時(shí),還要根據(jù)電腦實(shí)際情況,將連接字符串中的SQL Server服務(wù)器名稱進(jìn)行變更,并輸入相應(yīng)的用戶名和密碼(如果有的話)。
在DELETE語(yǔ)句中,使用WHERE子句,我們可以一次刪除多個(gè)滿足條件的記錄。
【例14-8】下面的例子是將數(shù)據(jù)表“研究生”中的所有研究方向?yàn)榭罩档挠涗泟h除。
在運(yùn)行下面的程序之前,要確保已經(jīng)引用了ADO對(duì)象庫(kù)MicrosoftActive Data Objects 2.5 Library或其他版本(如Microsoft Active Data Objects 2.1 Library、Microsoft Active Data Objects 2.8 Library等)。同時(shí),還要根據(jù)電腦實(shí)際情況,將連接字符串中的SQL Server服務(wù)器名稱進(jìn)行變更,并輸入相應(yīng)的用戶名和密碼(如果有的話)。
Public Sub 例14—8()
Dim cnn As New ADODB.Connection
Dim rs As New ADODB.Recordset
'建立與指定SQL Server數(shù)據(jù)庫(kù)的連接
cnn.ConnectionString = "Provider=SQLOLEDB;" _
& "User ID=sa;" _
& "password=11111;" _
& "Data Source=THTFCOMPUTER;" _
& "Initial Catalog=研究生管理"
cnn.Open
'刪除記錄
If MsgBox("下面將刪除數(shù)據(jù)表<研究生>的記錄!是否修改?", _
vbQuestion + vbYesNo + vbDefaultButton2) = vbYes Then
SQL = "delete from 研究生 where 研究方向 isnull "
cnn.Execute SQL
MsgBox "數(shù)據(jù)刪除成功!", vbInformation
Else
MsgBox "刪除數(shù)據(jù)操作被取消!", vbExclamation
End If
'關(guān)閉記錄集以及與數(shù)據(jù)庫(kù)的連接
cnn.Close
Set cnn = Nothing
End Sub
如果在DELETE FROM語(yǔ)句中不加任何條件,那么就會(huì)刪除整個(gè)數(shù)據(jù)表的數(shù)據(jù),僅僅留下一個(gè)空白的沒(méi)有任何記錄的數(shù)據(jù)表。
【例14-9】下面的例子是將數(shù)據(jù)表“研究生”中的所有記錄刪除。
在運(yùn)行下面的程序之前,要確保已經(jīng)引用了ADO對(duì)象庫(kù)MicrosoftActive Data Objects 2.5 Library或其他版本(如Microsoft Active Data Objects 2.1 Library、Microsoft Active Data Objects 2.8 Library等)。同時(shí),還要根據(jù)電腦實(shí)際情況,將連接字符串中的SQL Server服務(wù)器名稱進(jìn)行變更,并輸入相應(yīng)的用戶名和密碼(如果有的話)。
Public Sub 例14—9()
Dim cnn As New ADODB.Connection
Dim rs As New ADODB.Recordset
'建立與指定SQL Server數(shù)據(jù)庫(kù)的連接
cnn.ConnectionString = "Provider=SQLOLEDB;" _
& "User ID=sa;" _
& "password=11111;" _
& "Data Source=THTFCOMPUTER;" _
& "Initial Catalog=研究生管理"
cnn.Open
'刪除記錄
If MsgBox("下面將刪除數(shù)據(jù)表<研究生>的所有記錄!是否修改?", _
vbQuestion + vbYesNo + vbDefaultButton2) = vbYes Then
SQL = "delete from 研究生 "
cnn.Execute SQL
MsgBox "數(shù)據(jù)刪除成功!", vbInformation
Else
MsgBox "刪除數(shù)據(jù)操作被取消!", vbExclamation
End If
'關(guān)閉記錄集以及與數(shù)據(jù)庫(kù)的連接
cnn.Close
Set cnn = Nothing
End Sub
14.4 編輯數(shù)據(jù)綜合應(yīng)用案例
下面我們介紹如何利用窗體對(duì)SQL Server數(shù)據(jù)庫(kù)數(shù)據(jù)進(jìn)行瀏覽和編輯。本案例的數(shù)據(jù)表為“研究生管理”的“導(dǎo)師”;本案例的文件名為“例14-10.xls”。
導(dǎo)師管理窗體如圖14-6所示。用戶窗體的名稱為“UserForm1”,Caption屬性設(shè)置為“導(dǎo)師管理”。
在窗體上插入3個(gè)框架Frame1、Frame2和Frame3,其Caption屬性分別設(shè)置為“院系導(dǎo)師瀏覽”、“導(dǎo)師基本數(shù)據(jù)”和“編輯數(shù)據(jù)”。
在框架Frame1內(nèi)插入1個(gè)TreeView控件,基名稱為TreeView1,用于顯示在“導(dǎo)師”數(shù)據(jù)表內(nèi)各個(gè)院系名稱以及導(dǎo)師名稱。
在框架Frame2內(nèi)插入5個(gè)標(biāo)簽和5個(gè)文本框,5個(gè)標(biāo)簽用于對(duì)5個(gè)文本框的功能進(jìn)行說(shuō)明,其Caption屬性分別設(shè)置為“導(dǎo)師編號(hào)”、“姓名”、“性別”、“職稱”和“院系編號(hào)”;5個(gè)文本框用于顯示或輸入導(dǎo)師的基本信息數(shù)據(jù),其名稱分別設(shè)置為“導(dǎo)師編號(hào)”、“姓名”,“性別”、“職稱”和“院系編號(hào)”。
在框架Frame3內(nèi)插入4個(gè)命令按鈕,其名稱屬性和Caption屬性均分別設(shè)置為“重置窗口”、“輸入新記錄”、“修改記錄”和“刪除記錄”。
在窗體的右下角插入一個(gè)命令按鈕,其名稱屬性和Caption屬性均設(shè)置為“關(guān)閉窗口”,Cancel屬性設(shè)置為True。
1)首先定義如下的模塊級(jí)變量:
dim cnn as New ADODB.Connection
Dim myArray As Variant
2)為用戶窗體設(shè)置Initialize事件,當(dāng)啟動(dòng)窗體時(shí),建立與SQL Server數(shù)據(jù)庫(kù)服務(wù)器的“研究生管理”數(shù)據(jù)庫(kù)的連接,查詢獲取該數(shù)據(jù)庫(kù)數(shù)據(jù),然后將這些院系名和導(dǎo)師名設(shè)置給TreeView1控件,并顯示出來(lái)。程序代碼如下:
Private Sub UserForm_Initialize()
myarray = Array("導(dǎo)師編號(hào)", "姓名", "性別","職稱", "院系編號(hào)")
'建立與指定SQL Server數(shù)據(jù)庫(kù)的連接
cnn.ConnectionString = "Provider=SQLOLEDB;" _
& "User ID=sa;" _
& "password=11111;" _
& "Data Source=THTFCOMPUTER;" _
& "Initial Catalog=研究生管理"
cnn.Open
Call 設(shè)置節(jié)點(diǎn)
End Sub
這里,子程序“設(shè)置節(jié)點(diǎn)”的功能是查詢“院系”數(shù)據(jù)表和“導(dǎo)師”數(shù)據(jù)表,為TreeView1控件設(shè)置節(jié)點(diǎn),程序代碼如下:
Public Sub 設(shè)置節(jié)點(diǎn)()
Dim rsx As New ADODB.Recordset
Dim rs1 As New ADODB.Recordset
Dim n As Integer
Dim mySchool As String, SQL As String
'查詢?cè)合稻幪?hào)和名稱
Set rsx = cnn.Execute("院系")
'設(shè)置TreeView1控件的有關(guān)屬性
With TreeView
.Nodes.Clear '清除所有節(jié)點(diǎn)
.LineStyle = tvwrootlines '顯示節(jié)點(diǎn)之間的樹形線
.Style = tvwtreelinesplusminuspicturetext '顯示"+","-"號(hào)
.Indentation = 20 '間距20
End With
'為TreeView1控件添加一級(jí)節(jié)點(diǎn)(數(shù)據(jù)庫(kù)名稱)
TreeView1.Nodes.Add , , "key0", "院系"
'為TreeView1控件添加二級(jí)節(jié)點(diǎn)(數(shù)據(jù)庫(kù)名稱)
n= 1
Do While Not rsx.EOF
TreeView1.Nodes.Add "key0",4,"key" _
& trim(str(n)),_
Trim (rsx.Fields("院系名")) & "(" &Trim(rsx.Fields("院系編號(hào)")) & ")"
'查詢每個(gè)數(shù)據(jù)庫(kù)的所有數(shù)據(jù)表
pn = n
n = n + a
'查詢獲取每個(gè)院系的所有導(dǎo)師名單,并設(shè)置為三級(jí)節(jié)點(diǎn)
mySchool = Trim(TreeView1.Nodes(n).Text)
mySchool = Mid(mySchool, InStr(mySchool, "(") + 1)
mySchool = Left(mySchool, Len(mySchool) - 1)
SQL = "select * from 導(dǎo)師 where 院系編號(hào)='" & mySchool & "' order by 導(dǎo)師編號(hào)"
Set rs1 = cnn.Execute(SQL)
Do While Not rs1.EOF
TreeView1.Nodes.Add "key" & Trim(Str(pn)), 4, _
"key" &Trim(Str(n)), Trim(rs1.Fields("姓名"))_
& "(" &Trim(rs1.Fields("導(dǎo)師編號(hào)")) & ")"
n = n + 1
rs1.MoveNext
rsx.MoveNext
'展開二級(jí)節(jié)點(diǎn)
treeveiw1.Nodes(1).Expanded = True
Set rs = Nothing
Set rsx = Nothing
End Sub
3)為TreeView1控件設(shè)置NodeClick事件,當(dāng)單擊其中的某個(gè)導(dǎo)師名稱時(shí),就在窗體右邊的文本框中顯示該導(dǎo)師的基本信息數(shù)據(jù)。程序代碼如下:
Private Sub TreeView1_NodeClick(ByVal nodeAs MSComctlLib.node)
On Error Resume Next
Dim rs2 As New ADODB.Recordset
Dim i As Integer
Dim SQL As String, mySchool As String, myTeacher As String
'查詢選定的數(shù)據(jù)表
mySchool = Trim(node.Parent.Text)
mySchool = Mid(mySchool, Istr(mySchool, "(") + 1)
mySchool = Left(mySchool, Len(mySchool) - 1)
myTeacher = Trim(node.Text)
myTeacher = Mid(myTeacher, InStr(myTeacher, "(") + 1)
myTeacher = Left(myTeacher, Len(myTeacher) - 1)
SQL = "select * from 導(dǎo)師" _
& "where 院系編號(hào)='" & mySchool & "' and 導(dǎo)師編號(hào)='" & myTeacher & "'"
rs2.Open SQL, cnn, adOpenDynamic, adLockOptimistic
'在ListView1控件中顯示選擇數(shù)據(jù)表的全部記錄數(shù)據(jù)
If rs2.BOF And rs2.EOF Then Exit Sub
For i = 0 To UBound(myArray)
If inmull(rs2.Fields(i)) Then
Me.Controls(myArray(i)).Value = ""
Else
Me.Controls(myArray(i)).Value = Trim(rs2.Fields(i))
End If
Next i
rs2.Close
Set rs2 = Nothing
End Sub
4)為【重置窗口】按鈕設(shè)置Click事件,當(dāng)單擊此按鈕,就清空文本框中的數(shù)據(jù)。程序代碼如下:
Private Sub 重置窗口_Click()
Dim i As Integer
For i = 0 To UBound(myArray)
Me.Controls(myArray(i)).Value = ""
Next i
End Sub
5)為【輸入新記錄】按鈕設(shè)置Click事件,當(dāng)單擊此按鈕,就將文本框中的導(dǎo)師記錄保存到數(shù)據(jù)庫(kù)中。在保存數(shù)據(jù)之前,系統(tǒng)將檢查是否在文本框中都已經(jīng)輸入了數(shù)據(jù),以及輸入的數(shù)據(jù)長(zhǎng)度是否超過(guò)了數(shù)據(jù)庫(kù)規(guī)定的長(zhǎng)度,此外,系統(tǒng)還將檢查在數(shù)據(jù)庫(kù)中是否已經(jīng)存在了指定的導(dǎo)師編號(hào)。保存數(shù)據(jù)后,系統(tǒng)將刷新TreeView1控件的節(jié)點(diǎn)。程序代碼如下:
Private Sub 輸入新記錄_Click()
Dim i As Integer
Dim myNo As String, SQL As String, myStr As String
Dim rs As ADODB.Recordset
'判斷是否在文本框中輸入了數(shù)據(jù)
For i = 0 To UBound(myArray)
If Me.Controls(myArray(i)).Value = "" Then
MsgBox Me.Controls(myArray(i)).Name & " 不能為空!", vbCritical, "警告"
Exit Sub
End If
Next i
'判斷輸入的數(shù)據(jù)長(zhǎng)度是否超過(guò)了規(guī)定的長(zhǎng)度
Set rs = cnn.Execute("導(dǎo)師")
For i = 0 To rs.Fields.Count - 1
If Len(Me.Controls(myArray(i)).Value) >rs.Fields(i).DefinedSize Then
MsgBox "字段<" &Me.Controls(myArray(i)).Name _
& ">的長(zhǎng)度已經(jīng)進(jìn)過(guò)了數(shù)據(jù)庫(kù)規(guī)定的長(zhǎng)度!" _
& "下面將自動(dòng)截短!", vbCritical
Me.Controls(myArray(i)).Value = Left(Me.Controls(myArray(i)).Value, _
rs.Fields(i).DefinedSize)
Exit Sub
End If
Next i
'判斷該導(dǎo)師編號(hào)是否已經(jīng)存在
myNo = 導(dǎo)師編號(hào).Value
SQL = "select 導(dǎo)師編號(hào) from 導(dǎo)師 where 導(dǎo)師編號(hào)='" & myNo & "'"
Set rs = cnn.Execute(SQL)
If rs.EOF And rs.BOF Then
MsgBox "下面將把該導(dǎo)師數(shù)據(jù)保存到數(shù)據(jù)庫(kù)!", vbExclamation
myStr = "values("
myStr = myStr & "'" & 導(dǎo)師編號(hào).malue& "','" & 姓名.Value _
& "','" & 性別.Value& "','" & 職稱.Value & "','" & 院系編號(hào).Value & "')"
SQL = "insert into 導(dǎo)師" & myStr
cnn.Execute SQL
MsgBox "數(shù)據(jù)添加成功!", vbInformation
Else
MsgBox "該導(dǎo)師編號(hào)已經(jīng)存在!請(qǐng)重新設(shè)置編號(hào)!", vbCritical, "警告"
End If
Set rs = Nothing
Call 設(shè)置節(jié)點(diǎn)
Call 重置窗口_Click
End Sub
6)為【修改記錄】按鈕設(shè)置Click事件,當(dāng)單擊此按鈕,就將文本框中的導(dǎo)師記錄作為修改后的數(shù)據(jù)保存到數(shù)據(jù)庫(kù)中。修改數(shù)據(jù)后,系統(tǒng)將刷新TreeView1控件的節(jié)點(diǎn)。程序代碼如下:
Private Sub 修改記錄_Click()
Dim myNo As String, SQL As String, myStr As String
If MsgBox("下面將把該導(dǎo)師數(shù)據(jù)保存到數(shù)據(jù)庫(kù)!是否進(jìn)行修改?", _
vbQuestion + vbYesNo) = vbYes Then
SQL = "update 導(dǎo)師 set" _
& "導(dǎo)師編號(hào)='" & 導(dǎo)師編號(hào).Value & " '," _
& "姓名='" & 姓名.Value & "'," _
& "性別='" & 性別.Value & "'," _
& "職稱='" & 職稱.Value & "'," _
& "院系編號(hào)='" & 院系編號(hào).Value & "'," _
& "where 導(dǎo)師編號(hào)='" & 導(dǎo)師編號(hào).Value & "'"
cnn.Execute SQL
MsgBox "數(shù)據(jù)修改成功!", vbInformation
Else
MsgBox "修改數(shù)據(jù)操作被取消!", vbExclamation
End If
Call 設(shè)置節(jié)點(diǎn)
Call 重置窗口_Click
End Sub
7)為【刪除記錄】按鈕設(shè)置Click事件,當(dāng)單擊引按鈕,就將文本框中的指定的導(dǎo)師編號(hào)記錄從數(shù)據(jù)庫(kù)中刪除。刪除數(shù)據(jù)后,系統(tǒng)將刷新TreeView1控件的節(jié)點(diǎn)。程序代碼如下:
Private Sub 刪除記錄_Click()
Dim myNo As String, SQL As String, myStr As String
If MsgBox("下面將把該導(dǎo)師數(shù)據(jù)從數(shù)據(jù)庫(kù)中刪除!是否刪除?", _
vbQuestion + vbYesNo) = vbYes Then
SQL = "delete from 導(dǎo)師 where 導(dǎo)師編號(hào)='"& 導(dǎo)師編號(hào).Value & " '"
cnn.Execute SQL
MsgBox "數(shù)據(jù)刪除成功!", vbInformation
Else
MsgBox "刪除數(shù)據(jù)操作被取消!", vbExclamation
End If
Call 設(shè)置節(jié)點(diǎn)
Call 重置窗口_Click
End Sub
8)為【關(guān)閉窗口】按鈕設(shè)置Click事件,當(dāng)單擊此按鈕時(shí),就關(guān)閉窗體,程序代碼如下:
Private Sub 關(guān)閉窗口_Click()
cnn.Close
Set cnn = Nothing
Unload uwerform1
End Sub
1)啟動(dòng)窗體,如圖14-7所示。
2)單擊窗體左邊TreeView1控件中的院系下的某個(gè)導(dǎo)師名稱,就在窗體右邊的文本框中顯示該導(dǎo)師的基本信息數(shù)據(jù),如圖14-8所示。
3)單擊【重置窗口】按鈕,清除文本框的數(shù)據(jù),然后輸入新的導(dǎo)師信息數(shù)據(jù),如圖14-9所示,單擊【輸入新記錄】按鈕,就將該導(dǎo)師的信息數(shù)據(jù)保存到數(shù)據(jù)庫(kù)中,如圖14-10所示。
4)通過(guò)單擊窗體左邊TreeView1控件中的院系下的某個(gè)導(dǎo)師名稱,在窗體右邊的文本框中顯示該導(dǎo)師的基本信息數(shù)據(jù),然后對(duì)需要的數(shù)據(jù)進(jìn)行修改,單擊【修改記錄】按鈕,就可以對(duì)數(shù)據(jù)庫(kù)中指定編號(hào)的導(dǎo)師記錄進(jìn)行修改。
5)通過(guò)單擊窗體左邊TreeView1控件中的院系下的某個(gè)導(dǎo)師名稱,在窗體右邊的文本框中顯示出該導(dǎo)師的基本信息數(shù)據(jù),然后單擊【刪除記錄】按鈕,就可以從數(shù)據(jù)庫(kù)中將該編號(hào)的導(dǎo)師記錄刪除。
聯(lián)系客服