柚子快報激活碼778899分享:【數(shù)據(jù)庫】實驗指導
柚子快報激活碼778899分享:【數(shù)據(jù)庫】實驗指導
實驗1? SQL Server的安裝及其管理工具的使用
目的與要求
??? (1) 掌握 SQL Server服務(wù)器的安裝。
??? (2) 掌握企業(yè)管理器的基本使用方法。
??? (3) 掌握查詢分析器的基本使用方法。
??? (4) 了解數(shù)據(jù)庫及其對象。
實驗內(nèi)容
(1)安裝 SQL Server 2000
(2)利用企業(yè)管理器訪問系統(tǒng)自帶的pubs數(shù)據(jù)庫
(3)查詢分析器的使用
實驗步驟
??? 1.安裝 SQL Server 2000
??? 根據(jù)軟硬件環(huán)境,選擇一個合適版本的 SQL Server 2000。安裝步驟請參照 教材第1.33節(jié)。
??? 2.利用企業(yè)管理器訪問系統(tǒng)自帶的pubs數(shù)據(jù)庫
??? (l)啟動 SQL Server服務(wù)管理器。
??? (2)以系統(tǒng)管理員身份登錄到企業(yè)管理器并訪問pubS數(shù)據(jù)庫。
??? (3)在企業(yè)管理器的目錄樹中展開文件失一展開pubS數(shù)據(jù)庫圖標,則將列出該數(shù)據(jù)庫的、所有對象,如表、視圖、存儲過程,默認、規(guī)則等。
??? (4)選中pubs下的“表”圖標,將列出pubs數(shù)據(jù)庫所有的表(系統(tǒng)表和用戶表),在此以用戶表Publishers為例,打開該表,查看其內(nèi)容。
??? (5)在表的尾部插入記錄(9943, zhang, null, china)和( 1408, li, shanghai, NULL china),會發(fā)生什么情況?
??? (6)在表中刪除步驟(5)插入的記錄。
??? 3.查詢分析器的使用
?(l) 在查詢分析器對象瀏覽器的目錄樹中展開pubs數(shù)據(jù)庫圖標,則將列出該數(shù)據(jù)庫的所有對象,如表、視圖、存儲過程等。
?(2) 以pubs數(shù)據(jù)庫的用戶表anthors為例,選中該表的圖標,單擊鼠標右鍵,出現(xiàn)一快捷菜單,執(zhí)行“打開”菜單項,打開該表,查看其內(nèi)容。
(3)在表的尾部插入一記錄。
(4)在查詢分析器的輸入窗口,輸入如下 T-SQL語句:
????????? use pubs
??????????? select * from authors
??????????? go
看看執(zhí)行結(jié)果是什么?
思考與練習:
用查詢分析器查詢pubs數(shù)據(jù)庫publishers表的所有記錄。
實驗2? 創(chuàng)建數(shù)據(jù)庫和表?????????????????????????????????
目的和要求
(l) 了解 SQL Server數(shù)據(jù)庫的邏輯結(jié)構(gòu)和物理結(jié)構(gòu)。
(2) 了解表的結(jié)構(gòu)特點。
(3) 了解 SQL Servr的基本數(shù)據(jù)類型.
(4) 了解空值概念。
(5) 學會在企業(yè)管理器中創(chuàng)建數(shù)據(jù)庫和表。
(6) 學會使用 T-SQL語句創(chuàng)建數(shù)據(jù)庫和表。
實驗內(nèi)容
(1) 在企業(yè)管理器中創(chuàng)建數(shù)據(jù)庫YGGL
(2) 在企業(yè)管理器中刪除創(chuàng)建的YGGL數(shù)據(jù)庫
(3) 使用T-SQL語句創(chuàng)建數(shù)據(jù)庫YGGL
(4) 在企業(yè)管理器中分別創(chuàng)建表 Employees、Departments和 Salary
(5) 在企業(yè)管理器中刪除創(chuàng)建的Employees、Departments和Salary表
(6) 使用 T-SQL語句創(chuàng)建表 Employees、 Departments和 Salary
(7) 表數(shù)據(jù)的添加、修改、刪除
實驗步驟??
?1.實驗準備
??? 創(chuàng)建用于企業(yè)管理的員工管理數(shù)據(jù)庫,數(shù)據(jù)庫名為YGGL,包含員工的信息、部門信息以及員工的薪水信息。數(shù)據(jù)庫YGGL包含下列3個表:
??? (l)Employees;員工信息表。
??? (2)Department:部門信息表。
??? (3) Salary;員工薪水情況表。
各表的結(jié)構(gòu)分別如表1、表2和表3所示。
表1? Employees表結(jié)構(gòu)
列名 數(shù)據(jù)類型 長度 是否允許為空值 說明 EmployeeID Char 6 ′ 員工編號,主鍵 Name Char 10 ′ 姓名 Birthday Datetime 8 ′ 出生日期 Sex Bit 1 ′ 性別 Address Char 20 √ 地址 Zip Char 6 √ 郵編 PhoneNumber Char 12 √ 電話號碼 EmailAddress Char 30 √ 電子郵件地址 DepartmentID Char 3 ′ 員工部門號,外鍵
表2? Departments表結(jié)構(gòu)
列名 數(shù)據(jù)類型 長度 是否允許為空值 說明 DepartmentID Char 3 ′ 部門編號,主鍵 DepartmentName Char 20 ′ 部門名 Note text 16 √ 備注
表3? Salary表結(jié)構(gòu)
列名 數(shù)據(jù)類型 長度 是否允許為空值 說明 EmployeeID Char 6 ′ 員工編號,主鍵 InCome Float 8 ′ 收入 OutCome float 8 ′ 支出
??? 首先要明確,能夠創(chuàng)建數(shù)據(jù)庫的用戶必須是系統(tǒng)管理員,或是被授權(quán)使用CREATEDATABASE語句的用戶。??? 其次創(chuàng)建數(shù)據(jù)庫必須要確定數(shù)據(jù)庫名、所有者(即創(chuàng)建數(shù)據(jù)庫的用戶)、數(shù)據(jù)庫大小(最初的大小、最大的大小、是否允許增長及增長方式)和存儲數(shù)據(jù)庫的文件。
??? 然后,確定數(shù)據(jù)庫包含哪些表,以及所包含的各表的結(jié)構(gòu),還要了解SQL Server的常用數(shù)據(jù)類型,以創(chuàng)建數(shù)據(jù)庫的表。
此外還要了解兩種常用的創(chuàng)建數(shù)據(jù)庫、表的方法,即在企業(yè)管理器中創(chuàng)建和使用T-SQL語句創(chuàng)建。
???2.在企業(yè)管理器中創(chuàng)建數(shù)據(jù)庫YGGL
??? 要求:數(shù)據(jù)庫YGGL初始大小為 10 MB,最大大小為50 MB,數(shù)據(jù)庫自動增長,增長方式是按 5%比例增長;日志文件初始為 2 MB,最大可增長到 5 MB(默認為不限制),按 1MB增長(默認是按5%比例增長)。數(shù)據(jù)庫的邏輯文件名和物理文件名均采用默認值,分別為YGGL-data和e:\sql\data\MSSQL\Datar\YGGL.mdf,其中 e:\sql\data\MSSQL為 SQL Server的系統(tǒng)安裝目錄;事務(wù)日志的邏輯文件名和物理文件名也均采用默認值,分別為YGGL_LOG和e:\sql\data\MSSQL\Data\YGGL_log.ldf。
??? 以系統(tǒng)管理員 Administrator或被授權(quán)使用 CREATE DATABASE語句的用戶登錄 SQLServer服務(wù)器,啟動企業(yè)管理器-->在服務(wù)器上單擊鼠標右鍵-->新建數(shù)據(jù)庫-->輸入數(shù)據(jù)庫名“ YGGL”-->選擇“數(shù)據(jù)文件”選項卡-->設(shè)置增長方式和增長比例-->選擇“事務(wù)日志”選項卡-->設(shè)置增長方式和增長比例。
??? 注意:在“數(shù)據(jù)文件”選項卡和“事務(wù)日志”選項卡中,可以分別指定數(shù)據(jù)庫文件和日志文件的物理路徑等補性。
??? 3.在企業(yè)管理器中刪除創(chuàng)建的YGGL數(shù)據(jù)庫
??? 在企業(yè)管理器中選擇數(shù)據(jù)庫YGGL-->在YGGL上單擊鼠標右鍵則刪除。
??? 4.使用T-SQL語句創(chuàng)建數(shù)據(jù)庫YGGL
??? 按照上述要求創(chuàng)建數(shù)據(jù)庫YGGL。
??? 啟動查詢分析器-->在“查詢”窗口中輸入如下T-SQL語句:
? CREATE DATABASE YGGL
ON
(? NAME='YGGL_DATA',
??? ??FILENAME='e:\YGGL.MDF',
????? SIZE=10MB,
????? MAXSIZE=50MB,
????? FILEGROWTH=5%)
LOG ON
????? (NAME='YGGL_Log',
?????? FiLENAME='e:\YGGL_Log.ldf',
?????? SIZE=2MB,
?????? MAXSIZE=5MB,
?????? FILEGROWTH=1MB)
????? GO
??? 單擊快捷工具欄的執(zhí)行圖標執(zhí)行上述語句,并在企業(yè)管理器中查看執(zhí)行結(jié)果。
??? 4.在企業(yè)管理器中分別創(chuàng)建表 Employees、Departments和 Salary
??? 在企業(yè)管理器中選擇數(shù)據(jù)庫YGGL-->在YGGL上單擊鼠標右鍵-->新建-->表時輸入Employees表各字段信息則單擊保存圖標叫輸入表名 Employees,即創(chuàng)建了表 Employees。按同樣的操作過程創(chuàng)建表Departments和Salary。
??? 5.在企業(yè)管理器中刪除創(chuàng)建的Employees、Departments和Salary表
??? 在企業(yè)管理器中選擇數(shù)據(jù)庫YGGL的表Employees-->在Employees上單擊鼠標右鍵-->刪除,即刪除了表Employees。按同樣的操作過程刪除表Departments和Salary。
??? 6.使用 T-SQL語句創(chuàng)建表 Employees、 Departments和 Salary
啟動查詢分析器-->在“查詢”窗口中輸入以下T-SQL語句:
USE YGGL
CREATE TABLE Employees
?????????? (?? EmployeeID char(6) primary key,
??????????????? Name char(10) NOT NULL,
??????????????? Birthday datetime NOT NULL,
??????????????? Sex bit NOT NULL,
?????????????? Address char(20) NOT NULL,
?????????????? Zip Char(6) NULL,
?????????????? PhoneNumber char(12) NULL,
?????????????? EmailAddress char(20) NULL,
?????????????? DepartmentID char(3) NOT NULL,
?????????? )
?????????? GO
單臺快捷工具欄的執(zhí)行圖標,執(zhí)行上述語句,即可創(chuàng)建表 Employees。
按同樣的操作過程創(chuàng)建表 Departments和 Salary,并在企業(yè)管理器中查看結(jié)果。
7. 在企業(yè)管理器中向數(shù)據(jù)庫YGGL表加入數(shù)據(jù)
(1)在企業(yè)管理器中向表Employees中加入如表1所示的記錄。
表1?? Employees表記錄
編號 姓名 地址 郵編 電話 電子郵件 部門號 出生日期 性別 000001 王林 中山路 210003 3355668 NULL 2 1956-1-23 1 010008 伍容華 北京東路l00-2 210001 3321321 NULL 1 1966-3-28 1 020010 王向客 四牌樓10-10-108 210006 3792361 NULL 1 1972-12-9 1 020018 李麗? 中山東路102.2 210002 3413301 lili@sina.com 1 1950-7-30 0 102201 劉明 虎距路100-2?? 210013 3606608 NULL 5 1962-10-18 1 102208 朱俊 牌樓巷5.3-1806 210004 4708817 zhujun@sina.com 5 1955-09-28 1 108991 鐘敏 中山路108-3-105 210003 3346722 Zhongmin@sohu.com 3 1969-08-10 0 111006 張石兵 解放路34-9-1.203 210010 4563418 Zhang@china.com 5 1964-10-01 1 210678 林濤 中山北路247.2.305 210008 3467336 NULL 3 1967-04-2 1 302566 李玉艱 熱和路209.3?? 210018 8765991 liyumin@jlonline.com 4 1958-09-20 1 308759 葉見 北京西路3-7-502 210001 3308901 NULL 4 1968-11-18 1 504209 陳林琳 漢中路120-4-102 210002 4468158 NULL 4 1959-09-03 0
在企業(yè)管理器中選擇表employees-->在其上單擊鼠標右鍵-->選“返回所有行”-->逐字段輸入各記錄值,輸入完后,關(guān)閉表窗口。
(2)在企業(yè)管理器中向表Departments插入如表 2所示的記錄。
表2?? Departments表記錄
編號 部門名稱 備注 1 財務(wù)部 NULL 2 人力資源部 NULL 3 經(jīng)理辦公室 NULL 4 研發(fā)部 NULL 5 市場部 NULL
(3)在企業(yè)管理器中向表Salary插入如表3所示的記錄。
表3?? Departments表記錄
編號 收入 支出 000001 2100.8 123.09 010008 1582.62 88.03 102201 2569.88 185.65 111006 1987.01 79.58 504209 2066.15 108.0 302566 2980.7 210.2 108991 3259.98 281.52 020010 2860.0 198.0 020018 2347.68 180.0 308759 2531.98 199.08 210678 2240.0 121.0 102208 1980.0 100.0
8.在企業(yè)管理器中修改數(shù)據(jù)庫YGGL表數(shù)據(jù)
(1)在企業(yè)管理器中刪除表 Employees的第 2、 8行和 Salary的第2、11行。注意進行刪除操作時,作為兩表主鍵的EmployeeID的值,以保持數(shù)據(jù)完整性。
??? 在企業(yè)管理器中選擇表Employees-->在其上單擊鼠標右鍵、選“返回所有行”-->選擇要刪除的行-->單擊鼠標右鍵-->刪除-->關(guān)閉表窗口。
(2)在企業(yè)管理器中刪除表 Department的第2行,同時也要刪除表Employees的第2行。操作方法同上。
(3)在企業(yè)管理器中將表Employees中編號為020018的記錄的部門號改為4。
??? 在企業(yè)管理器中選擇表 Employees-->在其上單擊鼠標右鍵-->選“返回所有行”-->將光標定位至編號為020018的記錄的DepartmentID字段,將值1改為4。
9.使用T-SQL命令修改數(shù)據(jù)庫YGGL表數(shù)據(jù)
(l)使用T-SQL命令分別向YGGL數(shù)據(jù)庫的Employees、Departments和Salary表中插入一行記錄。???
啟動查詢分析器-->在“查詢”窗口中輸入如下T-SQL語句:
????? USE YGGL
????? INSERT INTO Employees??? VALUES('011112','羅林','1973-5-3',1,'解放路100號', 210002,4055663,NULL,5)
????????? GO
????????? INSERT INTO Departments
?????????????? VALUES('2','人力資源部',NULL)
????????? GO
????????? INSERT INTO Salary
?????????????? VALUES('011112',1200.95,50)
?????????? GO
??????? 單擊快捷工具欄的執(zhí)行圖標,執(zhí)行上述語句。
????? 注意:在企業(yè)管理器中分別打開YGGL數(shù)據(jù)庫的Employees、 Departmenta和Salary表, 觀察數(shù)據(jù)變化。
(2)使用T-SQL命令修改表Salary中的某個記錄的字段值。?
啟動查詢分析器-->在“查詢”窗口中輸入如下T-SQL語句:
????????????? USE YGGL
????????????? UPDATE Salary
?????????????????? SET InCome= 2890
?????????????????? WHERE EmployeeID='01lll2'
????????????? GO
????? 單擊快捷工具欄的執(zhí)行圖標,執(zhí)行上述語句,將編號為0llllZ的職工收入改為2890。
????? 注意:在企業(yè)管理器中打開YGGL 數(shù)據(jù)庫Salary表,觀察數(shù)據(jù)變化。
(3)修改表Employees和Departments的記錄值,仍要注意完整性。操作過程同上。
(4)使用T-SQL命令修改表Salary中的所有記錄的字段值。
????? 啟動查詢分析器則在“查詢”窗口中輸入如下T-SQL語句:
??????????????? USE YGGL
????????????? UPDATE Salary
??????????????????? SET InCome= InCome+100
????????????????? Go
????? 單擊快捷工具欄的執(zhí)行圖標,執(zhí)行上述語句,將所有職工的收入增加 100。
????? 可見,使用T-SQL語句操作表數(shù)據(jù)比在企業(yè)管理器中操作表數(shù)據(jù)更為靈活。
????? 注意:? ?輸入T-SQL語句? SELECT *? FROM Salary,觀察數(shù)據(jù)變化。
(5)使用TRANCATE TABLE語句刪除表中所有行。
????? 啟動查詢分析器-->在"查詢"窗口中輸入如下T-SQL語句:
??????????????? USE YGGL
????????????????? TRANCATE TABLE Salary
??????????????? GO
????? 單擊快捷工具欄的執(zhí)行圖標,執(zhí)行上述語句,將刪除Salary表中的所有行。
????? 注意:實驗時一般不要輕易執(zhí)行這個操作,困為后面實驗還要用到這些數(shù)據(jù)。如要添該命令的效果,可創(chuàng)建一個臨時表,輸入少量數(shù)據(jù)后進行。
實驗3? 數(shù)據(jù)庫的查詢
實驗?zāi)康?/p>
??? (1)掌握SELECT語句的基本語法。
??? (2)掌握子查詢的表示。
??? (3)掌握連接查詢的表示。
??? (4)掌握數(shù)據(jù)匯總的方法。
??? (5)掌握 SELECT語句的 GROUP BY子句的作用和使用方法。
??? (6)掌握 SELECT語句的 ORDER BY子句的作用和使用方法。
實驗準備
??? (1)了解SELECT語句的基本語法格式。
??? (2)了解SELECT語句的執(zhí)行方法。
??? (3)了解子查詢的表示方法。
??? (4)了解連接查詢的表示。
??? (5)了解數(shù)據(jù)匯總的方法。
??? (6)了解 SELECT語句的 GROUP BY子句的作用和使用方法。
??? (7)了解 SELECT語句的 ORDER BY子句的作用。
實驗內(nèi)容
1.SELECT語句的基本使用
??? (l)對于實驗2給出的數(shù)據(jù)庫表結(jié)構(gòu),查詢每個雇員的所有數(shù)據(jù)。在查詢分析器的編輯窗口輸入如下語句并執(zhí)行:
??????????? USE YGGL
??????????? SELECT *? FROM Employees
??????????? GO
??? 思考與練習:用SELECT語句查詢Departments和Salary表的所有記錄。
??? (2)查詢每個雇員的地址和電話。在查詢分析器的編輯窗口輸入如下語句并執(zhí)行:
????????? USE YGGL
????????? SELECT Address,PhoneNumber
????????????? FROM Employees
????????? GO
??? 思考與練習:用SELECT語句查詢Departments和Salary表的一列或若干列。
??? (3)查詢EmployeeID為000001的雇員的地址和電話。在查詢分析器的編輯窗口輸入如下語句并執(zhí)行:
??????? USE YGGL
SELECT Address, PhoneNumber
????????????? FROM Employees
????????????? Where EmployeeID='000001'
?????? GO
??? 思考與練習:用 SELECT語句查詢 Departments和Salary表中滿足指定條件的一列或若干列。
??? (4)查詢Employees表中女雇員的地址和電話,使用AS子查詢將結(jié)果中各列的標題分別指定為地址、電話。在查詢分析器的編輯窗口輸入如下語句并執(zhí)行:
????????? USE YGGL
????????? SELECT Address AS地址, PhoneNumber AS 電話
????????????? FROM Employees
????????????????? WHERE sex= 0
???????????? GO
??? 注意:使用AS子句可指定目標列的標題。
??? (5)計算每個雇員的實際收入。在查詢分析器的編輯窗口輸入如下語句并執(zhí)行:
???????? USE YGGL
???????? SELECT EmployeeID, 實際際收入=InCome-OutCome
????????????? FROM Salary
???????? GO
(6) 找出所有姓”王”的雇員的部門號。在查詢分析器的編輯窗口輸入如下語句并執(zhí)行:
USE YGGL
SELEC DepartmentID
????????????? FROM Employees
??????????????? WHERE name LIKE '王%'
???????? GO
??? 思考與練習:找出所有地址中含有“中山”的雇員的號碼及部門號。
??? (7)找出所有收入在2000~3000元之間的雇員編號。在查詢分析器的編輯窗口輸入如下語句并執(zhí)行:
????????? USE YGGL
????????? SELECT EmployeeID
??????????????? FROM Salary
????????????????? WHERE InCome BETWEEN 2000 AND 3000
????????? Go
??? 思考與練習:找出所有在財務(wù)部和人力資源部工作的雇員的編號。
??? 注意:在SELECTT語句中 LIKE、 BETWEEN…AND、 IN、 NOT及CONTAIN謂詞的作用。
2.子查詢的使用
??? (1)查找在財務(wù)部工作的雇員的情況。在查詢分析器的編輯窗口輸入如下語句并執(zhí)行:
??????????? USE YGGL
??????????? SELECT *
????????????? FROM Employees
????????????? WHERE DepartmentID=
????????????????? ( SELECT DepartmentID
????????????????????? FROM Departments
????????????????? WHERE DepartmentName='財務(wù)部')
??????????? GO
??? 思考與練習:用子查詢的方法查找所有收入在 2500元以下的雇員的情況。
??? (2)查找財務(wù)部年齡不低于研發(fā)部雇員年齡的雇員的姓名。在查詢分析器的編輯窗口輸入如下語句并執(zhí)行:
??????????? USE YGGL
??????????? SELECT Name
????????????? FROM Employees
????????????? WHERE DepartmentID IN
??????????????? ( SELECT DeptmentID
?????????????????? FROM Departments
????????????????? WHERE DepartmentName='財務(wù)部')
????????????????? AND Birthday>ALL(SELECT Birthday
??????????????????????????? FROM Employees
??????????????????????????? Where DepartmentID IN
????????????????????????????? ( SELECT DepartmentID
????????????????????????????????????? FROM Dapartments
?????????????????????????????????? where DepartmentName='研發(fā)部'))
??????????? Go
??? 思考與練習:用于查詢的方法查找研發(fā)部比所有財務(wù)部雇員收入都高的雇員的姓名。
??? (3)查找比所有財務(wù)部的雇員收入都高的雇員的姓名。在查詢分析器的編輯窗口輸入如下的語句并執(zhí)行:
??????? USE YGGL
??????? SELECT Name
??????????? From? Employees
??????????? WHERE??? EmployeeID IN
???????????? (SELECT EmployeeID
????????????????????? FROM Salary
??????????????????????????? WHERE InCome>
??????????????????????? ALL( SELECT InCome
??????????????????????????????? FROM Salary
??????????????????????????????? WHERE EmployeeID IN
????????????????????????????????? ( SELECT EmalpoyeeID
????????????????????????????????????????? FROM Employees
????????????????????????????????????????? WHERE DepartmentID=
??????????????????????????????????????????????? (SELECT DEPARTMENTID
?????????????????? ???????????????????????????????FROM Departmnts
??????????????????????????????????????????? WHERE DepartmentName='財務(wù)部'))))
??????????????? GO
????? 思考與練習:用于查詢的方法查找所有年齡比研發(fā)部雇員年齡都大的雇員的姓名。
3.連接查詢的使用
????? (1)查詢每個雇員的情況及其薪水的情況。在查詢分析器的編輯窗口輸入如下的語句并執(zhí)行:
??????????????? USE YGGL
??????????????? SELECT EmPloyees.*,? Salar.*
??????????????????? FROM Employees,? Salary
??????????????????? WHERE Emgloyees.EmployeeID=SalaryEmployeeID
??????????????? GO
????? 思考與練習:查詢每個雇員的情況及其工作部門的情況。
????? 間查找財務(wù)部收入在2200元以上的雇員姓名及其薪水詳情。在查詢分析器的編輯窗口輸入如下語句并執(zhí)行:
??????????? USE YGGL
??????????? SELECT Name, InCome, OutCome
??????????????? FROM Employees, Salary,? Departments
??????????????? WHERE Employees.EmployeeID=Salary.EmployeeID AND Employees.DepartmentID
????????????? = Departments.DEpartmentID AND DepartmentName='財務(wù)部' AND InCome>2000
???????????? GO
????? 思考與練習:查詢研發(fā)部在1966年以前出生的雇員姓名及其薪水詳情。
4數(shù)據(jù)匯總
(l)求財務(wù)部雇員的平均收入。在查詢分析器的編輯窗口輸入如下語句并執(zhí)行:
??????????? USE YGGL
??????????? SELECT AVG(InCome) AS?? '財務(wù)部平均收入'
WHERE EmployeeID IN
???????????????????? ( SELECT EmployeerID
????????????????????????? FROM Employees
????????????????????????? WHERE? DepartmentID=
?????????????????????????? ( SELECT DepartmentID
??????????????????????????????? FROM Departments
?????????????????????????????? WHERE DepartmentName='財務(wù)部'))
????????? GO
? 思考與練習:查詢財務(wù)部雇員的最高和最低收入。
(2)求財務(wù)部雇員的平均實際收入。在查詢分析器的編輯窗口輸入如下的語句并執(zhí)行:
??????? USE YGGL
??????? SELECT AVG(InCome-OutCome) AS '財務(wù)部平均實際收入'
??????????? FROM Salary
??????????? WHERE EmployeeID IN
????????????? ( SELECT EmployeeID
??????????????????? FROM Employees
??????????????????? WHERE DepartmentID=
????????????????????? ( SELECT DepartmentID
??????????????????????????? FROM DePartments
??????????????????????? WHERE DepartmentName='財務(wù)部'))
??????????? GO
? 思考與練習:查詢財務(wù)部雇員的最高和最低實際收入。
(3)求財務(wù)部雇員的總?cè)藬?shù)。在查詢分析器的編輯窗口輸入如下的語句并執(zhí)行:
??????? USE YGGL
??????? SELECT Count(EmgloyeeID)
??????????? FROM Employees
??????????? WHERE DepartmentID=
????????????? ( SELECT DepartmentID
??????????????????? FROM Departments
????????????????? WHERE DepartmentName ='財務(wù)部')
????????? GO
? 思考與練習:統(tǒng)計財務(wù)部收入在 2 500以上雇員的人數(shù)。
5. GROUP BY、? ORDER BY子句的使用
? (l)求各部門的雇員數(shù)。在查詢分析器的編輯窗口輸入如下的語句并執(zhí)行:
??????? USE YGGL
??????? SELECT COUNT(EmployeeID)
??????????? FROM Employees
????????????? GROUP BY DepartmentID
?????? GO
思考與練習:統(tǒng)計各部門收入在2000以上雇員的人數(shù)。
??? (2)將各雇員的情況按收入由低到高排列。在查詢分析器的編輯窗口輸入如下的語句并執(zhí)
行:
????????? USE YGGL
????????? SELECT Employees.*, Salary.*
????????????? FROM Employees, Salary
????????????? WHERE Employees.EmployeeID=Salary.EmployeeID
????????????? ORDER BY InCome
????????? GO?????????????
??? 思考與練習:將各雇員的情況按出生時間先后排列。
實驗4? T-SQL編程
實驗?zāi)康?/p>
(l) 進一步鞏固第2章至第4章所學的內(nèi)容。
(2) 掌握用戶自定義類型的使用。
(3) 掌握變量的分類及其使用。
(4) 掌握各種運算符的使用。
(5) 掌握各種控制語句的使用。
(6) 掌握系統(tǒng)函數(shù)及用戶自定義函數(shù)的使用。
實驗內(nèi)容
(1)自定義數(shù)據(jù)類型的使用
(2)自定義函數(shù)的使用
實驗步驟
1.自定義數(shù)據(jù)類型的使用
(l)對于實驗2給出的數(shù)據(jù)庫表結(jié)構(gòu),再自定義一數(shù)據(jù)類型ID_Type,用于描述員工編號。
在查詢分析器編輯窗口輸入如下程序并執(zhí)行:
????????? USE YGGL
????????? EXEC sp_addtype 'ID_Type','char(6)','not null'
????????? GO
??? 注意:不能漏掉單引號。
(2)重新創(chuàng)建 YGGL數(shù)據(jù)庫的 Employees表。在查詢分析器編輯窗口輸入如下程序并執(zhí)行:
????????? USE YGGL
????????? IF EXISTS(SELECT name FROM sysobjects
????????????????? WHERE type='U' and name='Employees')
/*首先在系統(tǒng)表中查看 Employees表是否存在,若存在,刪除該表*/
????????????? DROP table employees??????
????????? CREATE TABLE Eoployees
??????????? (? EmployeeID ID_type, /*定義字段EmployeeID的類型為 ID_type*/
??????????????? Name char(10) NOT NULL,
??????????????? Birthday datetime NOT NULL,
??????????????? Sex bit NOT NULL,
??????????????? Address char(20) NOT NULL,
ZIP char(6) NULL,
??????????????? PhoneNumber Char(12) NULL,
??????????????? EmailAddress char(20) NULL,
??????????????? DepartmentID char(3) NOT NULL
??????????? )
??????? GO
2.自定義函數(shù)的使用
??? (l)定義一函數(shù)實現(xiàn)如下功能:對于一給定的DepartmentID之值,查詢該值在Departments表中是否存在,若存在返回0, 否則返回-1。
??? 在查詢分析器的編輯窗口輸入如下程序并執(zhí)行。
??????? USE YGGL
??????? CREATE FUNCTION CHECK_ID (@departmentID char(3))
?????? RETURNS integer
AS
begin
? ????????declare @num int
IF EXISTS(SELECT departmentID FROM departmnts WHERE @departmentid=departmentID)
????? ??????select @num=0
? ELSE
?????? ????select @num=-1
?? return @num
end
???????? GO
??? (2)寫一段T-SQL腳本程序調(diào)用上述函數(shù)。當向Employees表插入一記錄時,首先調(diào)用函數(shù)CHECK_ID,檢察該記錄的DepartmentID值在表Departments的DepartmentID字段中是否存在對應(yīng)值,若存在,則將該記錄插入 Employeess表。
??? 在查詢分析器編輯窗口輸入如下程序并執(zhí)行:
????????? USE YGGL
????????? declare @num int
????????? select @num=dbocheck_id('2')
????????? if @num=e
????????????? insert employees
????????????????? values('990210', '張文', '1982-03-24', 0,? '南京鎮(zhèn)江路2號', '2100009', '3497534','zhang@jlonlne.com','2')
???????? GO
思考與練習:
??? 編寫如下程序:
(l)自定義一數(shù)據(jù)類型,用于描述YGGL數(shù)據(jù)庫中的DepartmentID字段,然后編寫代碼重新定義數(shù)據(jù)庫的各表。
(2)當對Departments表的DepartmentID字段值修改時,對Employees表中對應(yīng)的DepartmentID字段值也進行相應(yīng)修改。
(3)對Employees表進行修改時,不允許對DepartmentID字段值進行修改。
實驗5? 索引、存儲過程和觸發(fā)器的使用
實驗?zāi)康?/p>
(l) 掌握索引的使用方法。
(2) 掌握存儲過程的使用方法。
(3) 掌握觸發(fā)器的使用方法。
實驗內(nèi)容
(1)建立索引
(2)創(chuàng)建觸發(fā)器
(3)創(chuàng)建存儲過程
(4)調(diào)用存儲過程
實驗步驟
1.建立索引
??? 對 YGGL數(shù)據(jù)庫的 EInplyees表中的 DepartmentID列建立索引。在查詢分析器編輯窗口輸入如下程序并執(zhí)行:
????????? USE YGGL
????????? IF EXISTS(SELECT name FROM sysindexes
????????????? WHERE name='depart_ind')
????????? DROP INDEX employees.depart_ind /*應(yīng)使用表名.索引名的形式*/
????????? GO
????????? USE YGGL
????????? CREATE INDEX depart_ind
????????????? ON Employees(departmentID)
2.創(chuàng)建觸發(fā)器
??? 對于YGGL數(shù)據(jù)庫,表Employees的DepallmentID列與表Department的DepartmentID列應(yīng)滿足參照完整性規(guī)則,即:
??? .向Employees表添加一記錄時,該記錄的DepartmentID值在Departments表中應(yīng)存在。
??? .修改Departments表的DepartmntID字段值時,該字段在Employees表中的對應(yīng)值也應(yīng)修改。
??? .刪除Departments表中一記錄時,該記錄DepartmentID字段值在Employees表中對應(yīng)的記錄也應(yīng)刪除。
????? 上述參照完整性規(guī)則,在此通過觸發(fā)器實現(xiàn)。
?在查詢分析器編輯窗口輸入各觸發(fā)器的代碼并執(zhí)行:
??? (l)向Employees表插入或修改一記錄時,通過觸發(fā)器檢查記錄的DepartmentID值在Departments表中是否存在,若不存在,則取消插入或修改操作。
????????? USE YGGL
????????? GO
????????? CREATE TRIGGER EmployeeIns on dbo.Employees
??????????? FOR INSERT,UPDATE
????????????? AS
????????????? BEGIN
??????????????? if ((SELECT ins.DepartmentID from inserted ins) NOT IN
??????????????????? (SELECT departmentId FROM departments))
??????????????????? ROLLBACK???? /*對當前事務(wù)回滾,即恢復(fù)到插入前的狀態(tài)*/
????????????? END
??? (2)修改Departments表的DepartmentID字段值時,該字段在 Employees表中的對應(yīng)值也做相應(yīng)修改。
??????????? USE YGG
??????????? GO
??????????? CREATET TRIGGER DepartmentsUpdate on dbo.Departments
??????????? FOR UPDATE
???????????? AS
??????????? BEGIN
??????????????? IF(COLUMNS_UPDATED()&01)>0
????????????? UPDATE? Employees
????????????????? SET DepartmentID=(SELECT ins.DepartmentID from INSERTED ins)
?????????????????? WHERE? DepartmentID=(SELECT DepartmentID FROM deleted)
????????????? END????????????????????????????????????????????????????????????????????????????????????????????????????????????????
??????????? GO
??? (3)刪除Departments表中一記錄的同時刪除該記錄DepartmentID字段值在Employees表中對應(yīng)的記錄。
??????????? USE YGGL
??????????? GO
??????????? CREATE TRIGGER DepartmentsDetete on dbo.Departments
FOR DELETE? AS
BEGIN
???????????????? DELETE FROM EmpLoyees
???????????????????? WHERE??? DepartmentID=(SELECT DepartmentID FROM deleted)
????????????? END
??????????? GO
3.創(chuàng)建存儲過程
????? 在查詢分析器編輯窗口輸入各存儲過程的代碼并執(zhí)行:
????? (l)添加職員記錄的存儲過程EmployeeAdd。
??????????? USE YGGL
??????????? GO
??????????? CREATE??? PROCEDURE EmployeeAdd
?????????????? (@employeeid char(6), @name char(10), @birthday datetime,
???????????????? @sex bit, @address char(20), @zip char(6), @phonenumber char(12),
???????????????? @emailaddress Char(20), @departmentID Char(3))
???????????? AS
??????????????? BEGIN
????????????????? INSERT INTO Employees
???????????????????? VALUES(@employeeid, @name, @bitthday, @sex, @address,
????????????????????????????? @zip,@phonenumber,@emailaddress, @departmentID
??????????????? END
??????????? RETURN
??????????? GO
????? (2)修改職員記錄的存儲過程EmployeeUpdate。
??????????? USE YGGL
??????????? GO
??????????? CREATE PROCEDURE EmployeeUPdate
????????????? (@empid char(6), @employeeid char(6), @name char(10), @birthday datetime,
????????? ??????@sex bit, @address char(20), @zip char(6), @phonenumber char(12),
??????????????? @emailaddress char(20),@departmentID Char(3))
??????????? AS
??????????????? BEGIN
?????????????????? UPDATE Employees
????????????????????? SET Employeeid=@employeeid,
????????????????????????? Name=@name,
????????????????????????? Birthday=@birthday,
????????????????????????? Sex=@sex,
??????????????????????? Address=@address,
??????????????????????? Zip=@Zip,
??????????????????????? Phonenumber=@phoneNumber,
???? ???????????????????Emailaddress=@emailaddress,
??????????????????????? DepartmmentID=@departmentID
????????????????? WHERE EmployeeID=@empID
????????????? END
???????? RETURN
? (3)刪除職員記錄的存儲過程EmployeeDelete。
????????? USE YGGL
????????? CREATE PROCEDURE EmployDelete
??????????? (@employeeID char(6))
????????? AS
??????????? BEGIN
????????????? DELETE FROM Employees
????????????????? WHERE Emgloyeeid=@employeeid
??????????? END
????????? RETURN
????????? GO
4. 調(diào)用存儲過程
???? USE YGGL
???????? EXEC EmployeeAdd? '990230', '劉朝', '890909',1, '武漢小洪山5號', '', '', '', '3'
???????? USE YGGL
???????? EXEC EmployeeUpdate '990230', '990232', '劉平', '890909', l, 武漢小洪山 5號', '','', '', '2'
???????? USE YGGL
???????? EXEC EmployeeDelete '990232'
???????? GO
??? 分析一下此段程序執(zhí)行時可能出現(xiàn)哪幾種情況。
思考與練習:
??? 編寫如下 T-SQL程序:
??? (l)自定義一數(shù)據(jù)類型,用于描述YGGL數(shù)據(jù)庫中的DepartmentID字段,然后編寫代碼,重新定義數(shù)據(jù)庫各表。
??? (2)對于 YGGL數(shù)據(jù)庫,表Employees的EmployeeID列與表Salary的EmployeeID列應(yīng)滿足參照完整性規(guī)則,請用觸發(fā)器實現(xiàn)兩個表間的參照完整性。
??? (3)編寫對數(shù)據(jù)庫YGGL各表進行插入、修改、刪除操作的存儲過程,然后編寫一段程序調(diào)用這些存儲過程。
實驗6? VB人員信息管理系統(tǒng)
項目1? 連接數(shù)據(jù)庫及調(diào)用存儲過程
實驗?zāi)康?/p>
??? (l) 掌握在 SQL Server中創(chuàng)建數(shù)據(jù)庫、表、觸發(fā)器、存儲過程的方法。
??? (2) 掌握在VB中通過數(shù)據(jù)視圖窗口查看數(shù)據(jù)庫對象及創(chuàng)建觸發(fā)器和存儲過程的方法。
??? (3) 掌握通過代碼建立數(shù)據(jù)庫連接及訪問表記錄的方法。
??? (4) 掌握VB中調(diào)用存儲過程對表數(shù)據(jù)進行操作的方法。
實驗內(nèi)容
(1) 創(chuàng)建數(shù)據(jù)庫及其表
(2)在 VB 6.0中查看數(shù)據(jù)庫對象
(3)設(shè)計窗體界面
(4)設(shè)計應(yīng)用程序代碼
(5)運行
實驗步驟
??? 1.創(chuàng)建數(shù)據(jù)庫及其表
??? 在 SQL Server中新建個人信息管理系統(tǒng)數(shù)據(jù)庫“PInformation”,創(chuàng)建該數(shù)據(jù)庫下的表Contacts、 ContactPhones、 Reminders。數(shù)據(jù)庫PInformation的表及其結(jié)構(gòu)如下:
(l)聯(lián)系人表(Contacts)。Contacts表的結(jié)構(gòu)如表l所示。
表1 Contacts表結(jié)構(gòu) 字段名 字段類型 主鍵 標識列 說明 ContactID Int √ √ 聯(lián)系人姓名 Name Varchar(50) 聯(lián)系人名稱 Address Varchar(100) 聯(lián)系人所在城市 ZipCode Varchar(20) 郵編 EmailAddress Varchar(50) 電子信箱 ContactNote Varchar(100) 備注
(2) 聯(lián)系人電話表 (contactphone)。? contactphones表結(jié)構(gòu)如表2所示.
表2 Contactphones表結(jié)構(gòu) 字段名 字段類型 主鍵 標識列 說明 ContactPhoneID Int √ √ 聯(lián)系人電話編號 ContactID Int 聯(lián)系人編號 PhoneType Varchar(50) 電話類型 PhoneNumber Varchar(50) 電話號碼
(3) 提示信息表(Reminders)。Reminders表結(jié)構(gòu)如表3所示:
表3 Reminders表結(jié)構(gòu) 字段名 字段類型 主鍵 標識列 說明 RemainderID Int √ √ 提示編號 AlarmOn bit 報警標志 AlarmTime Datetime 報警時間 ReminderNote Varchar(1000) 提示內(nèi)容
?? ?注意:定義為標識列的字段的值是根據(jù) “種子”的值自動生成的。
??? 在VB中也可創(chuàng)建數(shù)據(jù)庫的表,可自己試一試。
?? ?2.在 VB 6.0中查看數(shù)據(jù)庫對象
第1步? 新建工程“Projectl”,在? VB界面中,執(zhí)行“視圖”菜單的“數(shù)據(jù)視圖窗口”菜單項,出現(xiàn)如圖l所示的界面。
圖1 VB中的數(shù)據(jù)窗口視圖
第2步 在圖.l所示的界面中,選中“數(shù)據(jù)鏈接”文件夾,單擊鼠標石鍵,出現(xiàn)一快捷菜單,執(zhí)行菜單項“添加數(shù)據(jù)鏈接”,出現(xiàn)如圖2所示的界面。在“提供者”選項卡中選擇 OLE DB提供者為“Mcrosoft OLE DB ProVider for SQL Server”(或 Microsoft OLE DBPrOvider for ODBC Drivers)。
圖2 設(shè)置數(shù)據(jù)庫連接方式的“提供者”界面
第3步 在圖2所示的界面中,選擇“連接”選項卡,出現(xiàn)如圖3所示的界面,輸入“數(shù)據(jù)庫服務(wù)器名”、用戶登錄名、密碼及登錄的數(shù)據(jù)庫。
圖3 設(shè)置數(shù)據(jù)庫連接方式的“連接”界面
第4步 在圖3所示的界面中,選擇“確定”按鈕,出現(xiàn)如圖4所示的界面。從此界面中可看出,在數(shù)據(jù)窗口視圖中,新創(chuàng)建了一個數(shù)據(jù)鏈接“DataLink1”。在該數(shù)據(jù)鏈接上,通過相應(yīng)的快捷菜單可創(chuàng)建存儲過程和觸發(fā)器。
圖4 數(shù)據(jù)視圖窗口
? ??3.設(shè)計窗體界面
設(shè)計窗體界面,如圖5和圖6所示。
圖5 設(shè)計應(yīng)用程序主窗口form1
圖6 設(shè)計聯(lián)系人窗口form2
4.設(shè)計應(yīng)用程序代碼
(l)模塊Modulel的設(shè)計。
??????? Option Explicit
??????? Public SQLUserName As String?? '存放 SQL Server的用戶登錄賬號
??????? Public SQLPassword As String??? ’存放SQL Server的用戶登錄密碼
????? Public MyConnection As New ADODB.Connection'用于建立與數(shù)據(jù)庫的連接
(2)應(yīng)用程序主窗口forml的代碼設(shè)計。
主窗口forml的LOAD事件驅(qū)動程序:
??????? Private Sub Form_Load()
???????? MyConnection.ConnctionString="driver={SQL Server};"_? ' 驅(qū)動程序名
????????????? &"serve=dlgc-pooly1rw4;uid="&SQLUserName_ "服務(wù)器名及用戶登錄賬號
????????????? &";pwd="&SQLPassword&";"_????????????? '用戶登錄密碼
??????????????? &"database=Pinformation"??????????????? '連接的數(shù)據(jù)庫
??????????? MyConnection.Open?????????????????? '建立連接
??????????? End Sub
? 功能:加載主窗口 forml時,通過代碼建立與數(shù)據(jù)庫Pinformation的連接。
“下一步”按鈕的Click事件驅(qū)動程序:
??????? Private Sub COmmand1_Click()
????????????????? Form2.Show
??????????????? Unload Me
??????????? End Sub
? 功能:加載聯(lián)系人窗口 form2,卸載主窗口 forml。
(3)對Contacts表進行操作的存儲過程的定義。
在 SQL Server中或通過 VB的數(shù)據(jù)視圖窗口創(chuàng)建如下存儲過程:?? .
在 COntacts表中添加一條記錄:
????????? CREATE PROCEDURE contactadd
????????????? @name varchar(50),@Address varchar(100),
??????????? @ZIPCode varchar(2),@EmailAddress varchar(50)
????????????? @ContactNote Varchar(50)
????????? As
??????? begin
???????????? insert into contacts
??????????????? (name,Address,ZipCode,EmailAddress,ContactNote) values
??????????????? (@name,@Address,@ZIPCode,@EmailAddress, @ContactNote)
??????????? Select @@identity as TheNewID
????????? end
??????????? return
在contacts表中查詢聯(lián)系人編號和姓名:
??????? CREATE PROCEDURE colllactlist
????????? As
??????? begin
??????????? select contactID, name from contacts order by name
??????????? end
??????????? return
在contacts表中查詢聯(lián)系人的一條記錄:
CREATE PROCEDURE? contactrecord
@contactID integer
AS begin
????? if @ContactID=0
??????????? begin
??????????????? select * from contacts? where contactID=(select Min(contactid)? from contacts)
??????????? end
??????? else
???????????? begin
??????????????? select *? from contacts where contactID=@contaCtID
???????????? end
????? end
?return
在contacts表中對一條記錄進行更改:
???? CREATE PROCEDURE contactupdate
??????????????? @ContactID integer,@name varchar(50),
??????????????? @Address varchar(100),@ZIPCode varchar(20),
????????????????? @EmailAddress varchar(50), @ContactNote varchar(500)
???????????? ???As
? ???begin
????????? update contacts set
??????????????????????? name=@name,Address=@Address,
?????????????????????????? ZipCode=@ZipCode,EmailAddress=@EmailAddress,
???????????????????????????? ContactNote=@ContactNote
????????????????????? where?? ContactID=@ContactID
? ?????end
return
在Ccontacts表中刪除一條記錄:
???????? CREATE PROCEDURE deltecontact
??????????????? @ContactID integer
??????????????? As
??????????? begin
????????????????? delete from contacts
????????????????????????? where?? ContactID=@ContactID
??????????????? end
???? return
(4)對 contactphones表進行操作的存儲過程的定義。
在表contactphone中添加一條電話記錄:
??????? CREATE PROCEDURE contactPhoneadd
??????????? @contactID integer,
??????????? @Phonetype varchar(50),
??????????? @phonenumber Varchar(50)
????????? As
? begin
??????????? insert into contactphones
????????????????? (contactID,PHoneType,phonenumber)? values
??????????????? (@contactID,@PhoneType,@phonenumber)
????????? end
?? return? ??????
在表contactphones中刪除一條電話記錄:
??????? CREATE PROCEDURE???? contactphonedelete
??????????? @contactPhoneID integer
??????????? As
??????? begin
????????????? delete from contactphones
??????????? where contactphoneID=@contactphoneID
????????? end
????????????? return
在表contactPhones中查詢電話記錄:
?????? CREATE PROCEDURE contactphonelist
???????????? @contactID integer
??????????? As
??????? begin
????????????? Select contactphoneID,PhoneType+"- "+PhoneNumber as ThePhone
????????????????? from contactphones where contactID=@contactID
????????????????? order by PhoneType+"- "+PhoneNumber
????????? end
????????????? return
???
(5)DeleteContacts觸發(fā)器的定義。
????????? Trigger deleteContacts
????????????????? On dbo.Contacts
????????????????? afterDelete
????????? As
??????????? begin
?????????????? delete from contactphones
????????????????????? where contactID=(select contactID from deleted)
???????????? end
????? 功能:當用戶刪除一條聯(lián)系人記錄時,通過該觸發(fā)器刪除該聯(lián)系人的所有電話號碼。
(6)聯(lián)系人窗口form2的代碼設(shè)計。
變量和子程序的定義:
????????? Option Explicit
????????? Private currentID As Long '存放當前聯(lián)系人編號
??????????? Public Sub DisplayContact(ID2Use as long) '顯示一條聯(lián)索人的記錄
??????????????? Dim RSContact As ADODB.Recordset
????????????? Set RSContact= MyCOnnection.Execute("Exec ContactRecord"_
??????????????? &ID2Use)???? '調(diào)用 ContatReeord存儲過程
??????????????? If RSContact.EOF Then
????????????????????? Command4_Click
????????????????? else
??????????????????? currentID= RSContact(”ContactID”)
????????????????????? Text2.Text= RSContact(”Name”)
??????????????????? TexI3.Text= RSContact("Address”)
??????????????????? Text4.Text= RSContactt(”ZipCode”)
??????????????????? Text5.Text= RSContact(”Emailaddress”)
????????????????????? Text6.Text= RSContact(”ContactNote”)
????????????????? DisplayPhoneList????????????? '顯示該聯(lián)系人的電話號碼。
????????????????? End if
End Sub
?? 功能:如果存儲過程調(diào)用返回文件結(jié)束標識,則調(diào)用“清除”按鈕的CliCk程序,清除界面上的數(shù)據(jù),否則顯示一條記錄。
??????? Public Sub UpdateNameCombo()
????????????? Dim RSNames As ADODB.Recordset? ' 定義一記錄集變量
?????????????????????????????????????????????? ' 通過連接變量執(zhí)行存儲過程
????????????? Set RSnames=Myconnection.Execute("Exec ContactList")
????????????????? Cmbecontacts.clear
????????????????? Do Until RSNames.EOF
??????????????????? Cmbcontacts.AddItem? RSNames(”Name”)
??????????????? Cmbcontacts.itemData(Cmbcontacts.NewIndex)=_
?????????????? RSNames(”ContactID”)
????????????? RSNames.MoveNext
Loop
????????? end sub
??? 功能:調(diào)用ContactRecord存儲過程查詢聯(lián)系人姓名和編號,然后加入到下拉列表Cmbcontacts中。
??????? Public Sub DisplayPhoneList()
???????????????? Dim RSPhoneList As ADODB.Recordset
?????? LstPhoneNumbers.Clear
?????? Set RSPhoneList = MyConnection.Execute("EXEC ContactPhoneList " & currentID)
?????? Do Until RSPhoneList.EOF
????????? LstPhoneNumbers.AddItem RSPhoneList("ThePhone")
????????? LstPhoneNumbers.ItemData(LstPhoneNumbers.NewIndex) = RSPhoneList("COntactPhoneID")
????????? RSPhoneList.MoveNext
????? Loop????????????????????????????????????
End Sub
??? 功能:通過調(diào)用存儲過程ContactPhoneLst,讀取聯(lián)系人對應(yīng)的電話號碼,然后將其加入列表框ListPhoneNumbers中。
form2各控件的事件驅(qū)動程序:
????? Private Sub Cmbcontacts_click()????? ‘cmbcontacts下拉表 Click事件驅(qū)動程序
DisplayContact Cmbcontact.ItemData(Cmbcontacts.ListIndex)
????? End Sub
??? 功能:調(diào)用DisplayContact子程序來顯示Cmbcontacts下拉表中被選項目對應(yīng)的記錄。
??????
?Private Sub Command1_Click()????????? ’聯(lián)系人添加按鈕的驅(qū)動程序
????????????????? Dim RSAddNew As ADODB.Recordset
??????????????????? Set RSAddNew=MyConnection.Execute("Exec ContactAdd "_?????????????
??????????????????????? &"'"& TextZ.text&"',"
??????????????????? &"'"&Text3.Text&"',"
????????????????????? &"'"&Text4.Text&
??????????????????????? &"'"& Text5.Text&"',"
????????????????????? &”’”& Text6.Text&”’”)
??????????????????? currentID=RsAddNew("TheNewID")
??????????????????? Cmbcontacts.AddItem Text2.text
??????????????????? Cmbcontact.ItemData(Cmbcontacts.NewIdex)=_
??????????????????? RSAddNew(”TheNewID”)
????????????? End Sub
???? 功能:調(diào)用ContactAdd存儲過程,添加一條記錄至contactS表中,同時,將該記錄聯(lián)系人編號和聯(lián)系人姓名加入Cmbeontacts下拉表中。
????????
Private Sub CommandZ_Click()????? ’聯(lián)系人修改按鈕的驅(qū)動程序
??????????????????? If currentID=O Then
????????????????????????? Command1_Click
??????????????????? else
???????????????????? MyConnection.execute "ExeC ContactUpdate "_
????????????????????? &CurrentID &”,”&_
??????????????????????????? &"'" & Text2.Text &"’,"
????????????????????????????? &"'"&Text3.Text&"’,"
????????????????????????????? &"'"& Text4.Text &"’,"
??????????????????????????? &"'"& Text5.Text&"’,"
??????????????????????????? &"'"&Text6.Text&"'"
??????????????????? Endif
??????????????? UpdateNameCombo
????????????? End Sub
??? 功能:如果currentID=0,調(diào)用添加按鈕的Click事件驅(qū)動程序,添加一條記錄至contacts表,否則,調(diào)用存儲過程ContactUpdate對當前聯(lián)系人的記錄進行修改,最后將添加或修改記錄的聯(lián)系人編號和聯(lián)系人姓名加入Cmbcontacts下拉表中。
????????? Private Sub Command3_Click()????????? '聯(lián)系人刪除按鈕的事件驅(qū)動程序
????????????? If currentID = 0 Then
?? Command4_Click
Else
?? MyConnection.Execute "Exec DeleteContact " & currentID
?? UpdateNameCombo
?? DisplayConcact 0
?End If
??????????? End Sub
??? 功能:調(diào)用存儲過程DeleteContact刪除當前記錄,修改下拉表中的信息并在窗口顯示下一條信息。
??????? Private Sub Command4_Click() ’聯(lián)系人清除按鈕的事件驅(qū)動程序
? currentID = 0
? Text2.Text = ""
? Text3.Text = ""
? Text4.Text = ""
? Text5.Text = ""
? Text6.Text = ""
??????? End Sub
? 功能:清除當前窗口信息。
????
?Privite Sub Command5_ClicK()???? ’退出按鈕的 Click事件驅(qū)動程序
??????????????? Unload Me
? End Sub
? 功能:卸載當前窗口。
?Privite Sub Command7_Click()??? ’電話號碼”添加”按鈕 Click事件驅(qū)動程序
???????? Dim PhoneType As String
?Dim PhoneNumber As String
?If currentID = 0 Then
??????? MsgBox "優(yōu)保存當前記錄,然后擇一個已存在的聯(lián)系人記錄添加電話號碼"
Else
??? PhoneType = InputBox("輸入電話類型:")
??? PhoneNumber = InputBox("輸入新電話號碼:")
??? If PhoneType <> "" And PhoneNumber <> "" Then
?????? MyConnection.Execute "Exec ContactPhoneAdd " & currentID & "," & "'" & PhoneType & " ," & "'" & PhoneNumber & "'"
?????? DispaysPhoneList
??? End If
End If
End Sub
? 功能:對于一個已存儲的聯(lián)系人記錄添加電話號碼有關(guān)的信息。
??
Private Sub Conmand8_click()???????? ’電話號碼’刪除”按鈕 Click事件驅(qū)動程序
? If LStphneNumbers.ListIndex = -1 Then
????? MsgBox "優(yōu)選中需刪除的號碼,然后單擊刪除按鈕"
Else
??? MyConnection.Execute "Exec ContactPhoneDelete " & lstPhoneNumber.ItemData(lstPhoneNumber.ListIndex)
??? DisplayPhoneList
End If
End sub
? 功能:對于一個已存儲的聯(lián)系人記錄刪除一條電話號碼記錄。
?Private Sub Form_Load()???????? 'form2的加載程序
????????????? DisPlayContact? 0
????????????? UpdateNameCombo
???? End Sub
功能:調(diào)用于程序DisplayContact顯示contacts表中第一條記錄,然后調(diào)用UpdateNameCombo將contacts表中記錄聯(lián)系人編號和聯(lián)系人姓名加入Cmbcontacts下拉表。
? ??4. 運行
運行結(jié)果如圖7和圖8所示。
圖7 應(yīng)用程序的主窗口form1
圖8 應(yīng)用程序運行的聯(lián)系人窗口form2
???
項目2? 創(chuàng)建數(shù)據(jù)庫數(shù)據(jù)報表
目的與要求
掌握在 VB 6.0中利用 SQL Server數(shù)據(jù)庫數(shù)據(jù)創(chuàng)建報表的方法。
實驗內(nèi)容
在實驗6項目1的基礎(chǔ)上通過報表列出聯(lián)系人的詳細信息。
(1)添加數(shù)據(jù)環(huán)境設(shè)計器和數(shù)據(jù)報表設(shè)計器
(2)編寫程序代碼
(3)運行
實驗步驟
?? ?1.添加數(shù)據(jù)環(huán)境設(shè)計器和數(shù)據(jù)報表設(shè)計器
??? 第1步 在實驗6項目1的基礎(chǔ)上添加數(shù)據(jù)環(huán)境設(shè)計器DataEnvironmentl,并對該環(huán)境設(shè)計器下的連接對象Connectionl設(shè)置連接屬性如下:
??? (l)連接數(shù)據(jù)庫的驅(qū)動程序:?? Microsoft OLE DB Provider for SQL Server;
??? (2)連接數(shù)據(jù)庫: Rinformation;
??? (3)登錄方式:?? SQL Server認證方式;
??? (4)登錄賬號:sa(系統(tǒng)管理員)。
??? 第2步 在Connectionl下添加Connnandl命令對象,并對Conunandl設(shè)置關(guān)聯(lián)的數(shù)據(jù)庫對象為dbo.Contactreport存儲過程,再設(shè)置分組選項卡的各項參數(shù),如圖9和圖10所示。
?
圖9 命令對象“通用”選項卡
圖10 命令對象“分組”選項卡
?第3步 在工程中添加數(shù)據(jù)報表設(shè)計器,將Commandl命令對象的各字段拖放到數(shù)據(jù)報表設(shè)計器,并根據(jù)需要做相應(yīng)的修改。數(shù)據(jù)報表設(shè)計器如圖11所示。
圖11? 數(shù)據(jù)報表設(shè)計器
??? 2.程序代碼
??? (l)對數(shù)據(jù)庫Pinformation創(chuàng)建下列存儲過程contactreport。
??????? CREATE PROCEDURE contactreport?
??? @contactID integer
As
? ???select contacts.name, contacts.Address, contacts.ZIPCode, contacts.EmailAddress
????????????? ,contacts.ContactNote, contactphones.PhoneType, contactphones.PhoneNumber
????????????? from contacts left outer join contactphones on
????????????? contacts.contactID=contactphones.contactID
????????????????? Where contacts.ContactID=@ContactID
?return
??? 功能:通過連接操作在 contacts 和 contactphones表中檢索聯(lián)系人的信息。
??? (2)對圖16所示界面中的“報表”按鈕的Click事件添加驅(qū)動程序。
????????? Private Sub Command6_Click()
????????????? DataEnvironment1.Commands(1).Parameters(1).value=currentID
????????????? DataReport1.Show 1
???????????? set DataEnvironment1=nothing
??????????? End Sub
??? 功能:當用戶單擊“報表”按鈕,則顯示當前聯(lián)系人的所有信息。在此,數(shù)據(jù)報表使用Comnmand1對象調(diào)用存儲過程contactreport時需將currentID作為入口參數(shù),以顯示正確的記錄,因此有語句:?? DataEnvironmentl.Commands(1).Parameters(1).value=currentID
??? 當用戶關(guān)閉報表時通過語句 Set DataEnvironment1= Nothing釋放所有資源。
3.運行
運行結(jié)果如圖12所示。
圖12 數(shù)據(jù)報表顯示結(jié)果
項目3?? 數(shù)據(jù)庫視圖應(yīng)用
實驗?zāi)康?/p>
??? 掌握 SQL Server數(shù)據(jù)庫視圖的應(yīng)用方法。
實驗內(nèi)容
在實驗6項目2的基礎(chǔ)上增加提示信息功能。
(1)界面設(shè)計
(2)添加命令對象和數(shù)據(jù)報表設(shè)計器
(3)代碼設(shè)計
(4)運行
實驗步驟
??? 在實驗6項目2的基礎(chǔ)上增加提示信息功能。
??? 1.界面設(shè)計
添加功能選擇窗口 form4,并添加相應(yīng)的控件,如圖13所示。在此界面中加入了一計時器控件,用于定時顯示提示信息。添加信息提示窗口 form5,如圖 14所示。
圖13 功能選項窗口form4
圖14 提示信息窗口form5
??????? 將實驗6中聯(lián)系人窗口form2如圖6所示)的“退出”按鈕改為“返回”按鈕。
??? 2.添加命令對象和數(shù)據(jù)報表設(shè)計器
在數(shù)據(jù)環(huán)境設(shè)計器DataEnvironment1的連接對象Connection1下添加命令對象Command2,并設(shè)置其屬性(關(guān)聯(lián)的數(shù)據(jù)庫對象為視圖VIEW2),如圖15所示。
圖15 命令對象command2的屬性設(shè)置
在工程中添加數(shù)據(jù)報表設(shè)計器DataRport2,并將數(shù)據(jù)環(huán)境設(shè)計器中命令對象Command2的各字段拖放至報表設(shè)計器DataReport2中,如圖 16所示。
圖16 數(shù)據(jù)報表設(shè)計器窗口
?3.代碼設(shè)計。
??? (l)存儲過程定義。
在 Reminders表中添加一條記錄。?????????????
???????? CREATE PROCEDURE reminderadd
????? @AlarmOn bit, @AlarmTime datetime,
????? @ReminderNote varchar(500)
As
? begin
???? insert into Reminders (AlarmOn,AlarmTime, ReminderNote) values
???????????? (@AlarmOn,@AlarmTime,@ReminderNote)
?? ?select @@identity as theNewID
end
return
在Remainders表中刪除一條記錄:
????? CREATE PROCEDURE reminderdelete
????????????????? @reminderID int
As
??? begin
?????? delete from Remainders
?????????? where remainderID=@reminderID
??? end
return
在Reminders表中查詢提示信息編號和提示信息的前15個字符:
???????? CREATE Procedure remainderlist
As
begin???????????????
?? select reminderID,left(reminderNote,15) as TheNote
???????? from?? reminders?? Order By reminderNote
end
return
在Reminders表中查詢一條提示信息記錄:
??????? CREATE Procedure reminderrecord
????????????? @reminderID int
? As
????? begin
??????? if @reminderID=0
????????? begin
??????????? select * from reminders
????????????????? where reminderID=(select min(reminderID) from reminders)
????????? end
?????? else
????????? begin
??????????? select * from reminders where reminderID=@reminderID
????????? end
??? end
return
修改Remainders表中的一條記錄:
??????? CREATE Procedure reminderUpdate
??????????????? @reminderID int,
????????????? ??@AlarmOn bit,
??????????????? @AlarmTime datetime,
????????????? @ReminderNote varchar(500)
? As
??? begin
???? update?? reminders set
?????????????? AlarmOn=@AlarmOn,
?????????????? AlarmTime=@AlarmTime,
?????????????? ReminderNote=@reminderNote
??????? where reminderID=@reminderID
?end
return
? (2)視圖的定義(視圖定義應(yīng)在其使用之前)。
根據(jù)Reminders表中信息創(chuàng)建VIEW1視圖:
?????? CREATE VIEW dbo.VIEW1
AS
SELECT AlarmTime, ReminderNote
FROM dbo.Reminders
WHERE (AlarmTime <= GETDATE()) AND (AlarmOn = 1)
根據(jù)Reminders表中信息創(chuàng)建VIEW2視圖:
CREATE VIEW dbo.VIEW2
AS
SELECT AlarmTime, ReminderNote
FROM dbo.Reminders
WHERE (AlarmOn = 1)
(3)模塊Module的代碼同實習? 1項目? 1的代碼?!?/p>
? (4)主窗口 form1及控件的代碼。
主窗口裝載程序:
? Private Sub Form_Load():同實習 1項目? l的代碼。
“下一步”按鈕的Click事件驅(qū)動程序:
Private Sub command 1_Click()
????????????? Form4.Show
????????????? Unload Me
??????? End sub
? (5)功能選擇窗口form及控件代碼。
TimAlarms計時器Timer事件驅(qū)動程序:
????? Private Sub timAlarmns_Time()
??????????????? Dim? RSAlarms As ADODBB.Recordset
??????????? set RSAlarms=MyConnection.Execute(”view1”)
??????????????? Do until RSAlarms.EOF
??????????????? MsgBox”Alarm:”& RSAlarms(”Alarmtime”)
????????????????????????? & vbNewLine&”Note:”& RSAlarms(”ReminderNote”)
??????????????????????? RSAlarms.MoveNext
????????????? Loop
??????????? End Sub
??? 功能:通過Recordset對象打開視圖VIEWI,然后根據(jù)返回的記錄信息提示用戶。
“聯(lián)系人”按鈕的Click事件代碼:
????????? Privite Sub Command1_Click()
??????????????????? Form2.Show
????????????????? Form4.Hide
??????????? End sub
??? 功能:隱藏form4,顯示聯(lián)系人窗口 formZ。
“提示信息”按鈕的Click事件代碼:
???????? private sub command2_click()
?????????????????? Form5.Show
?????????????????? Form4.Hide
??????????? End Sub
??? 功能:隱藏form4,顯示提示信息窗口 form5。
“退出”按鈕的Click事件代碼:
???????? Private Sub Command3_Click()
??????????????? Unuload Me
??????????? End Sub
??? (6)“聯(lián)系人”窗口 form2及控件的代碼。
?“返回”按鈕Command5的Click事件驅(qū)動程序:
????????? Private sub Command5_CliCk()
??????????????? Form4.Show
??????????????????? Unload Me
??????????? end sub
其余同實習回項目1的代碼。
??? (7)“提示信息”窗口 form5及控件的代碼。
變量及子程序的定義:
Option Explicit
Private currentID As Long?? '存放當前的提示信息編號
Public Sub DisplayReminder(ID2Use As Long)? '顯示一條提示信息的記錄
?? Dim RSReminder As ADOOB.Recordset
?? Set RSReminder = MyCnnection.Execute("Exec ReminderRecord" & ID2Use)
?????? If RSReminder.EOF Then
?????????? CmdClear_Click
?????? Else
?????????? currentID = RSReminder("ReminderID")
?????????? ChkAlarmOn.Value = Abs(RSReminder("AlarmOn"))
?????????? txtAlarmTime.Text = RSReminder("AlarmTime")
?????????? txtReminderNote.Text = RSReminder("ReminderNote")
?????? End If
End Sub
Public Sub UpdateReminderCombo()??????? '將提示信息的有關(guān)內(nèi)容加入下拉表
? Dim RSReminders As ADODB.Recordset
? Set RSReminders = MyConnection.Execute("Exec ReminderList")
? cmbReminders.Clear
? Do Until RSReminders.EOF
??????? cmbReminders.AddItem RSReminders("TheNote")
??????? CmbReminders.ItemData(cmbReminders.NewIndex) = RSReminders("ReminderID")
??????? RSReminders.MoveNext
? Loop
End Sub
復(fù)選樞chkAlarmOn的Click事件驅(qū)動程序:
? Private sub chkAlarmON_Click()
??????? ???If chkAlarmOn.Value = 1 Then
?????? ChkAlarmOn.Value = 0
? End If
? End Sub
下拉表cmbRemainders的Click事件驅(qū)動程序:
? Private Sub cmbReminders_Click()
????? DisplayReminder CmbReminders.itemData(cmbRemainders.ListIndex)
? emd sub
提示信息“添加”按鈕cmdAdd的click事件驅(qū)動程序:
? Privide Sub CmdAdd_Click()
??????? Dim RSAddNew As ADODB.Recordset
? ????Set RSAddNew = MyConnection.Execute("Exec ReminderADD" & _
ChkAlarmOn.Value & "," & "'" & txtAlarmTime.Text & _
"'," & "'" & tXtReminderNote.Text & "'")
?? ??currentID = RSAddNew("TheNewID")
??? ?cmbReminders.Additem Left(tXtReminderNote, 30)
? ???cmbReminders.ItemData(cmbReminders.NewIndex) = RSAddNew("TheNeWID")
? End Sub
提示信息“清除”按鈕cmdclear的clcik事件驅(qū)動程序:
????????? Private Sub cmdClear_Click()
????????????? currentID= 0
????????????? chkALarmOn.Value=0
????????????? tXtAlarmTime.Text=""
????????????? txtReminderNote.text=""
??????????? End Sub
提示信息“返回”按鈕cmdclose的click事件驅(qū)動程序:
????????? Private Sub cmdClose_Click()
??????????????? Form4.Show
??????????????? Unload Me
????????? End Sub
?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????
.提示信息“刪除”按鈕cmdDelete的Click事件驅(qū)動程序:
????????? Private Sub cmdDelete_Click()
????????????????? If currentID = 0 Then
??? cmdClear_Click
Else
?? MyConncection.Execute "Exec ReminderDelete " & currentID
?? UpdateReminderCombo
?? DisplayReminder 0
End If
????????? end sub
??? 提示信息“修改”按鈕CmdUpdate的Click事件驅(qū)動程序:
??????????? Private Sub cmdUpdate_Click()
????????????????? If currentID=0 Then
????????????????????????????? cmdAdd_Click
???????????????? else
??????????????????????? MyConnection.Execute "Exec ReminderUpdate"_
??????????????????????????? & currentID &","
????????????????????????? & ChkAlarmOn.Value&","
??????????????????? &"'" & tXtAlarmTime.Text &"',"
????????????????? &"'"&txtReminderNote.Text&"'"
????????????????? UpdateReminderCombo
????????????? End If
??????? End Sub
提示信息“報表”按鈕cmdwViewReport的Click事件驅(qū)動程序:
????? Private Sub cmdViewReport_Click()
????????? DataReport2.Show 1
????????????? Set DataEnvironment1= Nothing
??????? End Sub
.提示信息窗口Load事件的驅(qū)動程序:
????? Private Sub Form_Load()
?????????? DisplayReminder 0
?????????? UpdateRemindercombo
??????? End Sub
4 運行
運行結(jié)果如圖17~22所示。
圖17 主窗口界面 圖18 功能選擇窗口
圖19 “聯(lián)系人”窗口
圖20 提示信息窗口
圖21 “聯(lián)系人”報表
圖22 提示信息報表
實驗6? PB商品信息管理系統(tǒng)
開發(fā)商品信息管理程序,用于對Goods數(shù)據(jù)庫進行操作,實現(xiàn)商品信息管理。
商品信息管理系統(tǒng)數(shù)據(jù)庫(Goods)包含的表及其結(jié)構(gòu)如下:
(l)商品分類表(Gclass)。Gclass表結(jié)構(gòu)如表1所示。
????????????????????????????????? 表 1???? Gclass表結(jié)構(gòu)
字段名 字段類型 主鍵 標識列 說明 ClassID Int √ √ 商品分類編號 clname Varchar(20) 商品分類名稱
(2)商品品牌表(Gbrand)。Gbrand表結(jié)構(gòu)如表2所示。
??????????????????????????????? 表2???? Gbrand表結(jié)構(gòu)
字段名 字段類型 主鍵 標識列 說明 BrandID Int √ √ 品牌編號 Brname Varchar(50) 品牌名稱 Place Varchar(50) 產(chǎn)品
(3)商品信息表(Gdetails)。Gdetails表結(jié)構(gòu)如表3所示。
??????????????????????????????? 表 3?? Gdetails表結(jié)構(gòu)
字段名 字段類型 主鍵 標識列 說明 GoodsID Int √ √ 商品編號 Gname Varchar(20) 商品名稱 ClassID Int 分類編號 BrandID Int 品牌編號 Type1 Varchar(20) 型號 Price Double 單價 Num Int 商品數(shù)量 Information Varchar(500) 商品簡介
注意:定義為標識列的字段的值是根據(jù)‘種子”的值自動生成的。
項目1? 連接數(shù)據(jù)庫及調(diào)用存儲過程、觸發(fā)器
實驗?zāi)康?/p>
(l)掌握對表中標識列數(shù)據(jù)的使用方法。
(2)掌握在PB中調(diào)用 SQL Server數(shù)據(jù)庫存儲過程的方法。
(3)掌握在PB中通過游標訪問 SQL Server數(shù)據(jù)庫的方法。
(4)掌握 SQL Server數(shù)據(jù)庫中觸發(fā)器的使用。
實驗內(nèi)容
(1)根據(jù)表 1~3,在 SQL Server中創(chuàng)建數(shù)據(jù)庫 Goods及其表。
(2)在PB中建立數(shù)據(jù)庫Goods的配置文件文件myfile2,并導出初始化文件myfile2.ini。
(3)在PB中創(chuàng)建應(yīng)用對象及應(yīng)用程序界面。
(4)程序代碼設(shè)計。
實驗步驟
第 1步 根據(jù)表 1~3,在 SQL Server中創(chuàng)建數(shù)據(jù)庫 Goods及其表。
注意:要使各表字段類型與PB支持的數(shù)據(jù)類型相容。
第2步 在PB中建立數(shù)據(jù)庫Goods的配置文件文件myfile2,并導出初始化文件myfile2.ini。
第3步 在PB中創(chuàng)建應(yīng)用對象及應(yīng)用程序界面,如圖1和圖2所示。
圖 1? 應(yīng)用程序主窗口w_l
圖 2? 商品信息窗口w_2
第4步 程序代碼設(shè)計。
1.在 SQL Server中設(shè)計如下存儲過程和觸發(fā)器
對Gclass表進行插入的存儲過程:
CREATE PROCEDURE INSER (@str1 varchar(20))
AS? begin
? insert into gclass(clname) Values(@str1)
end
注意:對含有標識列的表插入記錄時,標識列字段的值是自動生成的。
功能:根據(jù)輸人參數(shù)傳遞的類別名,在Gclass表插入一條記錄。
對Gclass表進行刪除的存儲過程:
??? Create procedure dele(@id integer)
????? As
??? begin
????????? delete from gclass? where ClassID=@id
????? end
??? return
功能:根據(jù)輸入?yún)?shù)傳遞的類別編號,在Gclass表刪除一記錄。
對Gclass表進行修改的存儲過程:
??? CREATE PROCEDURE updateclass
????????? @str1 varchar(20),@str2 varchar(20)
???????? AS
????????? begin
??????????? update gclass set clname=@str2? where clname=@str1
????????? end
?功能:修改當前記錄的類別名。
對表Gclass進行刪除時使用的觸發(fā)器:
??????????? CREATE trigger? deleclass ON [dbo].[Gclass]
????????????? FOR DELETE
????????????? AS
?????????????? begin
??????????????????? delete from? Gdetails
??????????????????? Where? classID=(select classid? from deleted)
????????????? end
功能:為了保證數(shù)據(jù)的完整性,當刪除Gclass表中一條記錄時,同時刪除 Gdetails表中的對應(yīng)記錄。
類似地,可以對Gbrand表添加插入、修改、刪除的存儲過程和刪除觸發(fā)器。請學生們自己做出來。
對GdetailS表進行插入的存儲過程:
??? CREATE PROCEDURE Ginsert
??????? (@Gname varchar(20),@ClassID int,@BrandID int,
??????? @type1 varchar(20),@Price float,@num int,@information Varchar(20))
?AS
?? begin
???? insert into Gdetails(gname,ClassID,BrandID,type1,price,num,information)
????????????? values(@Gname,@ClassID,@BrandID,@type1,@Price,@num,@information)
????? end
?return
??? 功能:根據(jù)參數(shù)指定的商品類別編號、品牌編號、名稱、型號、價格、數(shù)量,在Gdetails
表中插入一條記錄。
對Gdetails表進行修改的存儲過程:
?CREATE PROCEDURE Gupdate
???? (@goodsID int,@Gname varchar(20),@ClassID int,@BrandID int,
??????? @type1 varchar(20),@price float,@num int,@information varchar(20))
AS
?begin
?????? update gdetails set
????????? Gname=@Gname,
????????? type1=@type1,
????????? price=@price,
????????? num=@num,
????????? information=@information
??? where goodsID=@goodSID and ClassID=@ClassID and BrandID=@BrandID
?? end
return
??? 功能:根據(jù)參數(shù)指定的商品類別編號、品牌編號、商品編號。修改Gdetails表中對應(yīng)記錄的商品名稱、型號、價格和數(shù)量。
對Gdetails表進行刪除的存儲過程:
CREATE PROCEDURE Gdelete
?(@GoodsID int,@ClassID int,@BrandID int)
?AS
?? begin
???? delete from gdetais
??????? where??? GoodsID=@GoodSID and classID=@ClassID and BrandID=@BrandID
??? end
?return
??? 功能:根據(jù)參數(shù)指定的商品類別編號、品牌編號、商品編號,刪除Gdetails表中的對應(yīng)記錄。
??? 2.應(yīng)用對象open事件的程序代碼
????????? Open(w_1)
??? 3.定義全局變量
??????? int id,id1,id2??????????? //分別存放商品類別編號、商品品牌編號和商品編號
declare st cursor for????? //定義游標,以便讀取 Gclass表的數(shù)據(jù)
? ????select? Clname,ClassID
???????? from Gclass
???????? ORDER BY ClassID ASC;
declare st1 cursor? for????? //定義游標,以便讀取 Gbrad表的數(shù)據(jù)
??? select Brname,place,BrandID? from Gbrand
??????? ORDER BY BrandID ASC;
declare? st2? cursor? for? //定義游標,以便讀取 Gdetails表的數(shù)據(jù)
???? select goodsID,Gname,type1,price,num,information
????????? from Gdetails
????????? Where ClassID=:id and BrandID=:id1
????????? ORDER BY GoodSID ASC;
??? 4.應(yīng)用程序主窗口“進入系統(tǒng)”按鈕cb_1的click事件驅(qū)動代碼
?sqlca.DBMS=Profilestring("myfile2.ini","database","DBMS","")
?sqlca.Database=ProfileString("myfile2.ini","database","database","")
?Sqlca.ServerName= ProfileString("myfile2.ini","database","servername","")
?Sqlca.logID=sle_1.text
?sqlca.LogPass=sle_2.text
?Sqlca.AutoCommit=false
?Connect using sqlca;
?if sqlca.sqlcode<>0 then
????? MessageBox("cannot connect database",sqlca.sqlerrtext)
?END IF
?open(w_2)
?parent.hide()
??? 功能:先給全局事務(wù)對象sqlca的屬性賦值,并通過Sqlca全局事務(wù)對象建立與數(shù)據(jù)庫的連接,然后進入商品信息窗口。
??? 5.商品信息窗口的程序代碼
商品信息窗口w_2的Open事件驅(qū)動代碼:
??????? string str,place
??????? int itm=1
??????? ddlb_1.reset()????????????????? //清除下拉框ddlb_1中的內(nèi)容
??????? Open st;????????????????? //打開游標
??????? feteh st into :sir,:id;???????? //通過游標 st讀取表 Gclass的記錄
????????? DO WHILE sqlca.sqlcode=d
??????????????? if Sir<>ddlb_1.text(itm)? then
??????????????????? ddlb_1.insertitem(str,itm)
??????????????????? itm=itm+1
??????????????????? end if
??????????? LOOP
????????? ddlb_1.text=ddlb_1.text(1)
????????? ddlb_2.reset()
??????????? itm=1
????????? open st1;
????????? fetch st1 into :str,:place,:id1;
????????? DO WHILE sqlca.SqLCODE=0
??????????????? if str<>ddlb_2.text(itm) then
??????????????????? ddlb_2.insertitem(stritm)
???????????????????????? itm=itm+ 1
????????????????? fetch st1 into :str :place,:id1;
??????????????? end if
??????????? LOOP
?????????? ddlb_2.text=ddbl_2.textt(1)
??????????? stri1=ddlb_1.text
??????????? stri2=ddlb_2.text
????????? Open st2;
??? 功能:
(l)打開游標st, 通過游標獲取Gclass表記錄,并將clname字段的值加入下拉表ddlb_1中。
(2)打開游標stl,通過游標獲取Gbrand表記錄,并將Clname字段的值加入下拉表ddlb_1中。
(3)打開游標st2,為GdetailS表記錄的讀取做準備。
“添加類別”按鈕cb_1的Click事件驅(qū)動程序:
?string str
?int itm=1//,id
?Select gclass.clname?? into :str
????? from? gclass where gClass.clname=:pclass.text; // pclass為輸入新類別的單行編輯框????????
?if str<>"" then
???? messagebox("類型","類型已有。")
?end if
?if pclass.text="" then
?????? messagebox("類型","請輸入新類型名稱!")
?end if
?if str="" and pclass.text<>"" then
??? declare inser1 procedure for inser @str1=:pclass.text;????? //聲明 inserl存儲過程
??? execute inser1;//通過inser1調(diào)用存儲過程 inser1
??? ddlb_1.reset()
??? close st;
??? Open st;
??? fetch St into:Str;
??? Do WHILE sqlca.sqlcode=0
????? if Str<>ddlb_1.text(itm) then
????????? ddlb_1.insertitem(str,itm)
????????? itm=itm+1
????????? fetch st into :str;
????? end if
??? Loop
? end if
? pclass.text=""
??? 功能:首先檢查在編輯握pclass輸入的商品類別在表Gclass中是否已有,若沒有,且編輯框的內(nèi)容不為空,則將新類別插入表中,然后再將表中各記錄的clname字段值加入下拉表(在此之前,下拉表應(yīng)清空)。
“刪除類別”按鈕cb_2的click事件驅(qū)動程序:
?int n
if ddlb_1.text<>""then
??? SELECT Gclass.classID INTO :id
???????????? FROM Gclass
??????????? WHERE clname=:ddlb_1.text;
?? declare dele1 procedure for dele @id=:id;?? //聲明dele1存儲過程??
?? execute dele1;?????????? //通過dele1調(diào)用存儲過程dele
?? n=ddlb_1.finditem(ddlb_1.text,1)
?? ddlb_1.deleteitem(n)
?? ddlb_1.text=ddlb_1.text(1)
end if
??? 功能:若要刪除下拉表中當前選中的一個類別項,則首先根據(jù)該類別名,從Gclass表中獲取其對應(yīng)的類別編號,然后調(diào)用存儲過程dele1來刪除該類別編號對應(yīng)的記錄。
“修改類別”按鈕cb_3的Click事件驅(qū)動程序:
?String str1
int itm=1
if pclass1.text<>"" and ddlb_1.text<>"" then
??????? // pclass1為輸入被修改記錄新類別名的編輯框
???? declare updateclass procedure? for updateclass
???????????? @Str1=:ddlb_1.text, @str2=:pclass1.text; //聲明updateclass存儲過程
???? execute updateclass;????????? //調(diào)用存儲過程
end if
ddlb_1.reset()
Close st;
Open st;
fetch st into :str1,:id;
DO WHILE sqlca.Sqlcode= 0
??? if str1<>ddlb_1.text(itm) then
?????? ddlb_1.insertitem(str1,itm)
?????? itm=itm+1
?????? fetch st into :str1,:id;
??? end if
?LOOP
ddlb_1.text=pclass1.text
pclass1.text=""
????? 功能:當編輯框pclass1的內(nèi)容不為空時,則用該內(nèi)容修改表中對應(yīng)記錄的內(nèi)容,然后再將表中各記錄clname字段值加入下拉表(在此之前,下拉表應(yīng)清空)。
下拉表ddlb_1的 selectionchanged事件驅(qū)動程序:
?string vGname,vtype1,vinformation
?double price???????????????????????
?int num
?stril=ddlb_1.text
?stri2=ddlb_2.text?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????
?close st2;
?open st2;
?fetch st2 into :id2,:vGname,:vtype1,:price,:num,:vinformation;
?if sqlca.sqlcode=0 then
??? pname.text=vGname
??? ptype.text=vtype1
??? pprice.text=string(price)
??? pnum.text=string(num)
??? pinfor.text=vinformation
?end if
????? 功能:隨著商品類別下拉表選擇的變化,商品信息欄也應(yīng)跟著變化。上述代碼根據(jù)當前用戶選中的商品類別和品牌,通過st2 游標讀取對應(yīng)的商品信息記錄。
類似地,可以寫出插入、修改、刪除按鈕的click事件驅(qū)動程序和下拉表ddlb_2的 selectionchanged事件驅(qū)動程序。請學生們自己做出來。
商品信息”下一記錄”按鈕Cb_4的Click事件驅(qū)動代碼:
?string vGname,vtype1,vinformation
?Double price
?int num
stri1=ddlb_1.text
Stri2=ddlb_2.text
?fetch st2 into :id2,:vGname,:vtype1,:price,:num,:vinformation;
?if Sqlca.sqlcode=0 then
??? pname.text=VGname?????????????? // pname顯示商品名稱的單行編輯握
??? ptype.text=vtype1??????????????? //Pname顯示商品型號的單行編輯框
??? Pprice.text=string(price)??????? //pname顯示商品價格的單行編輯框
??? pnum.text=string(num)???????? //pnameo顯示商品數(shù)量的單行編輯框
??? pinfor.text=vinformation???????? // pname顯示商品簡介的多行編輯框
?end if
功能:通過St2讀取GdetailS表中數(shù)據(jù),顯示至界面。
商品信息”上一記錄”按鈕cb_5的click事件驅(qū)動代碼:
string vGname,Vtype1,vinformation
double price
int num
stri1=ddlb_1.text
Stri2=ddlb_2.text
fetch prior st2 into :id2,:VGname,:vtype1,:price,:num,:vinformation;
if sqlca.sqlcode=0 then
?? pname.text=vGname
?? ptype.text=vtype1
?? pprice.text=string(price)
?? Pnum.text=string(num)
?? Pinfor.text=vinformation
end if
商品信息”添加”按鈕Cb_6的Click事件驅(qū)動代碼:
String str1,str2
double vprice
int vnum
Select gclass.ClassID,Gbrand.BrandID into:id,:id1
???? from gclass,Gbrand
???? where gclass.clname=:ddlb_1.text and Gbrand.Brname=:ddlb_2.text;
//根據(jù)當前下拉表ddlb_1中選擇的商品類別名,ddlb_2選擇的商品品牌查詢其對應(yīng)的
??? //類別編號和品牌編號
Select goodsID,gname,type1
?????? into :id1,:str1,:str2
?????? from gdetails
?????? where classid=:id and brandid=:id1 and gname=:pname.text&
????????????? and type1=:Ptype.text;
if str1<>"" and str2<>"" then
??? messageboX("商品","此商品已有")
else
??? vprice=double(pprice.text)
??? vnum=integer(Pnum.text)
??? declare Ginsert1 procedure for Ginsert? //聲明存儲過程 Ginsert
????????? @Gname=:pname.text,@classID=:id,@brandID=:id1,@type1=:ptype.text,
????????? @price=:vprice,@num=:vnum,@information=:pinfor.text;
?? execute Ginsert1;?? //通過 Ginsert1調(diào)用存儲過程Ginsert
?? close st2;÷
?? Open st2;
end if
????? 功能:商品信息的添加是一個多表操作的問題,首先根據(jù)用戶在下拉表ddlb_1中選擇的商品類別和在下拉表ddlb_2中選擇的商品品牌,在表Gclass、Gbrans中查詢其對應(yīng)的編號, 然后根據(jù)編號和用戶輸入的商品信息調(diào)用存儲過程Ginsert,在表Gdetails中插入一條記錄。
商品信息”刪除”按鈕cb_6的Click事件驅(qū)動代碼:
??? string? str1,str2
??? string vGname,vtype1,vinformation
??? double price
??? int num
??? Select gclass.ClassID,Gbrand.BrandID
??????????????? into :id,:id1
??????????????? from gclass,Gbrand
??????????????? where gclass.clname=:ddlb_1.text and Gbrand.Brname=:ddlb_2.text;
???? declare Gdelete1 procedure for Gdelete?? @goodsID=:id2,?? @classID=:id,@brandID=:id1;
? //聲明存儲過程 Gdelete
???? execute Gdelete1;//通過 Gdelete1調(diào)用存儲過程 Gdelete1
???? pname.text=""
???? ptype.text=""
???? pprice.text=""
???? pnum.text=""
???? pinfor.text=""
???? close st2;
???? open st2;
???? fetch st2 into :id2,:VGname,:Vtype1,:price,:num,:vinformation;
???? if sqlca.sqlcode=0 then
????????? pname.text=vGname
????????? PtyPe.text=Vtype1
????????? PPrice.text=string(Price)
????????? Pnum.text=String(num)
????????? Pinfor.text=vinformation
???? end if
????? 功能:商品信息的刪除也是一個多表操作的問題,首先根據(jù)用戶在下拉表ddlb_1中選擇的商品類別和在下拉表ddlb_2中選擇的商品品牌,在表Gclass、Gbrand中查詢其對應(yīng)的編號,然后根據(jù)編號和當前商品信息編號調(diào)用存儲過程Gdelete,在表Gdetails中刪除對應(yīng)記錄。
商品信息”修改”按鈕cb_7的Click事件驅(qū)動代碼。
?????? string str1,Str2
?double vPrice
?int vnum
?select gclass.ClassID,Gbrand.BrandID
??????????????? into :id,:id1
????????????? from gClass,Gbrand
????????????? Where gclass.clname=:ddlb_1.text and Gbrand.Brname=:ddlb_2.text;
? vprice=double(pprice.text)
? vnum=integer(pnum.text)
?declare Gupdate1 procedure for gupdate
???? @goodsID=:id2,? @Gname=:Pname.text,@clasdsID=:id,@brandID=:id1,@type1=:Ptype.text,
???? @price=:vprice,@num=:vnum,@information=:pinfor.text;
? execute Gupdate1;
? close st2;
? open st2;
???? 功能:略。
項目2:數(shù)據(jù)窗口的使用
實驗?zāi)康模?/p>
掌握PB中數(shù)據(jù)窗口和數(shù)據(jù)窗口控件的使用。
實驗內(nèi)容:
(1)創(chuàng)建數(shù)據(jù)窗口。
?(2)創(chuàng)建數(shù)據(jù)窗口控件。
(3)數(shù)據(jù)窗口控件的使用。
實驗步驟:
1.通過DataBase Profiles建立數(shù)據(jù)庫連接
2.創(chuàng)建商品類別的數(shù)據(jù)窗口。
New—DataWindow—Grid—Ok—Quick Select—Next(如圖1),選擇表Gclass,然后點擊Add All選擇它的兩個字段。依次點擊OK,Next,F(xiàn)inish。如圖2所示
?
圖1?????????????????????????????????????? 圖2
保存為dw_gclass.
(2) 同樣為表Gdetails建立一個數(shù)據(jù)窗口dw_gdetails.
(3) 建立一個窗口(window)命名為w_showclass,點擊數(shù)據(jù)窗口控件按鈕(如圖3),建立一個數(shù)據(jù)窗口對象dw_1,設(shè)置其DataObject屬性為dw_gclass,設(shè)置VscrollBar為checked。同樣建立一個數(shù)據(jù)窗口對象dw_2, 設(shè)置其DataObject屬性為dw_gdetails,設(shè)置VscrollBar為checked,HscrollBar為checked。
(4) 雙擊窗口的空白區(qū)域,在代碼窗口輸入如下代碼
dw_1.settransobject(sqlca)? //設(shè)置事務(wù)為當前默認事務(wù)
dw_1.retrieve()???????????? //檢索數(shù)據(jù)填入數(shù)據(jù)窗口對象dw_1
dw_2.settransobject(sqlca)
dw_2.retrieve()
(5)雙擊dw_1,在其clicked事件中添加如下代碼:
dw_2.setfilter('classID='+string(dw_1.GetItemNumber(row,1)))
dw_2.filter()
(6)在w_1窗口中的cb_1的clicked事件中,將語句 open(w_2)改為 open(w_showclass)。
運行程序,如下圖所示點擊上面的類別。
圖3
3.數(shù)據(jù)修改:
在上述窗口上添加如下圖的按鈕。
圖4
在“添加”按鈕的clicked事件中添加如下代碼:
int iRow
iRow=dw_2.InsertRow(0) ??//最后行插入
dw_2.ScrollToRow(iRow)? //滾到新插入的行
dw_2.setfocus()?? //設(shè)置dw_2得到焦點
在“刪除”按鈕的clicked事件中添加如下代碼:
dw_2.deleteRow(dw_2.getSelectedRow(0))
在“保存”按鈕的clicked事件中添加如下代碼:??
dw_2.update()
在“保存”按鈕的clicked事件中添加如下代碼:??
dw_2.ResetUpdate()
dw_2.retrieve()
思考與練習:
為品牌(gbrand)建立類似的數(shù)據(jù)窗口。將上述四個按鈕同時作用于上下兩個數(shù)據(jù)窗口對象,即當在上面的數(shù)據(jù)窗口中操作時,按“插入”可增加一個商品類別,其余類似。
提示:設(shè)置一個Instance Variable(實例變量)來標志當前活動的數(shù)據(jù)窗口對象,在兩個窗口對象的getfocus事件中設(shè)置該變量的值。
實驗7? ASP通用人事管理系統(tǒng)。
??? 實驗7 所設(shè)計的通用人事管理系統(tǒng)是將Web技術(shù)與數(shù)據(jù)庫結(jié)合,將人事信息存儲在數(shù)據(jù)庫系統(tǒng)中,通過動態(tài)Web界面訪問數(shù)據(jù)庫服務(wù)器。系統(tǒng)提供信息測覽、查詢、添加、更新和刪除功能。系統(tǒng)的層次結(jié)構(gòu)如圖1所示。
??
??????????????????????????? 圖1通用人事管理系統(tǒng)的層次結(jié)構(gòu)
項目1? 數(shù)據(jù)庫的設(shè)計
實驗?zāi)康?/p>
?? (l)掌握在 SQL Server中創(chuàng)建數(shù)據(jù)庫、表的方法。
(2)掌握在ASP中訪問數(shù)據(jù)庫的用戶設(shè)置方法。
(3)掌握在 SQL Server中創(chuàng)建存儲過程的方法。。
(4) 掌握在ASP中建立數(shù)據(jù)庫連接及調(diào)用存儲過程對表數(shù)據(jù)進行操作的方法。
實驗內(nèi)容
(1)設(shè)計4個表PERSONEL、DEPART、WORK和USERS,分別存儲入的基本信息、單位情況、人的工作信息和系統(tǒng)用戶信息,數(shù)據(jù)庫名定為PERSON。
(2)建立登錄名和用戶,并且設(shè)置權(quán)限。
(3)創(chuàng)建檢查用戶的存儲過程。
(4)設(shè)計用戶登錄ASP程序。
(5)配置IIS服務(wù)器和主目錄。
(6)程序運行。
實驗步驟
?? 1. 通用人事管理系統(tǒng)設(shè)計4個表PERSONEL、DEPART、WORK和USERS,分別存儲入的基本信息、單位情況、人的工作信息和系統(tǒng)用戶信息,數(shù)據(jù)庫名定為PERSON。這4個表的結(jié)構(gòu)分別如表1~表4所示。???
表 1??? PERSONEL表結(jié)構(gòu)
字段名 數(shù)據(jù)類型 是否可取空值 說明 身份證號 char(18) 否 主鍵 姓名 Varchar(20) 否 性別 Bit 否 出生年月 Smalldatetime 否 籍貫 Varchar(20) 否 民族 Varchar(10) 否 地址 Varchar(30) 否 電話 Varchar(12) 是
?????????????????????????? 表2 DEPART表結(jié)構(gòu)
字段名 數(shù)據(jù)類型 是否可取空值 說明 部門號 char(6) 否 主鍵 部門名 Varchar(30) 否 地址 Varchar(30) 是 電話 Char(12) 是 傳真 char(12) 是 說明 Varchar(10) 是
表 3???? WORK表結(jié)構(gòu)
字段名 數(shù)據(jù)類型 是否可取空值 說明 身份證號 char(18) 否 主鍵 姓名 Varchar(20) 否 部門號 Char(6) 否 職稱 Char(10) 是 職務(wù) char(10) 是 工作時間 Smalldatetime 否 特長 Varchar(50) 是 獎懲記錄 Text 是 基本工資 real 否
表4 USERS表結(jié)構(gòu)
字段名 數(shù)據(jù)類型 是否可取空值 說明 UserID char(18) 否 主鍵,用戶登錄名 Passwd Varchar(20) 否 口令 Authority Bit 否 0:只讀,1:只寫,2:讀寫
? 2.按第2章介紹的方法創(chuàng)建PERSON數(shù)據(jù)庫和上述4個表。另外,在Web頁面中對該數(shù)據(jù)庫的訪問使用一個特定的用戶person_user,在”安全性”文件夾的”登錄”項中通過”新建登錄”創(chuàng)建該用戶,并設(shè)置數(shù)據(jù)庫訪問權(quán)限(如圖2所示)。因需要通過Web向數(shù)據(jù)庫寫入記錄,故將person_user設(shè)置為此db_owner角色。
圖2創(chuàng)建新用戶person_user
3.創(chuàng)建存儲過程check_user。當用戶要使用人事管理系統(tǒng)時,首先要登錄,通過身份認證。用戶登錄程序文件是login.a(chǎn)sp,它通過表單接收用戶輸入的用戶名和口令,查詢USERS表中是否有該用戶且口令是否正確。用戶身份認證可定義為PERSON數(shù)據(jù)庫的存儲過程check_user,其定義如下:
? CREATE PROCEDURE check_user(
??????????? @uname char(8),
??????????? @pass char(20),
??????????? @haveit int=-1 OUTPUT )
AS
????? SELECT @haveit= Authority
????????? FROM USERS
????????? WHERE UserID=@uname AND Passwd=@pass
?GO
??? 存儲過程check_user執(zhí)行的操作是:若參數(shù)指定的用戶名已存在,并且四個正確,則返回該用戶的權(quán)限(大于或等于0)。
4.設(shè)計用戶登錄ASP程序。Login.asp程序如下:
??
<%'讀取各輸入框中的數(shù)據(jù)
usr_name=Request("usrname")
passwd=Request("pass")
IF usr_name="" then
? Response.Write "
請輸入用戶名和密碼!
"ELSE
? Set cn=Server.CreateObject("ADODB.Connection")
? cn.Provider="sqloledb"
? ProvStr="Server=ZHUSANYUAN;Database=PERSON;UID=person_user;PWD=12345;"
? cn.Open ProvStr
? Response.Write "
run to M2!
"? Set cmd=Server.CreateObject("ADODB.Command") '創(chuàng)建 COmlnan對象
? Set cmd.ActiveConnection=cn??? '設(shè)置command對象使用的連接
? cmd.CommandType= adCmdstoredProc
? cmd.CommandText="check_user"?? '指定Command對象執(zhí)行的存儲過程
? cmd.Parameters.Append cmd.CreateParameter("@uname", adChar,,? 8, adParamInput)
? cmd.Parameters.Append cmd.CreateParameter("@pass", adChar,, 20, adParamInput)
? cmd.Parameters.Append cmd.CreateParameter("@haveit", adInteger,? 4,? adParamOutput)
? cmd("@uname")=usr_name
? Cmd("@pass")=passwd
? Set rs=cmd.Execute '執(zhí)行存儲過程, 得到結(jié)果集
? have_it=cmd("@haveit")
? IF have_it>=0 then??? '用戶名和密碼正確
???? Response.Redirect "sc.htm"?? '進入人事管理系統(tǒng)主界面
? ELSE?????????? '表中沒有用戶輸入的用戶名或密碼錯
???? Response.Redirect "relogin.htm"?? '重新登錄
? END IF
END IF??
%>
?
?
![]() | ![]() ?? width=200 height=60> |
該程序運行后生成的用戶登錄界面如圖3所示。若通過了身份驗證, 則進入人事信息管理系統(tǒng)的主界面, 如圖4所示(注:sc.htm頁面目前尚為設(shè)計,實際上當?shù)卿洺晒髮@示找不到頁面sc.htm)。
圖3通用人事管理系統(tǒng)登錄界面
圖4人事信息管理系統(tǒng)的主界面
項目2? 數(shù)據(jù)測覽和查詢程序設(shè)計? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
實驗?zāi)康?/p>
????? (l)掌握在 ASP中對 SQL Server數(shù)據(jù)庫進行瀏覽的方法。
????? (2)掌握在 ASP中對 SQL Server數(shù)據(jù)庫進行查詢的方法。? ? ? ? ? ? ? ? ? ? ?
實驗內(nèi)容
(1)設(shè)計顯示結(jié)果集中的指定頁的ASP程序。
(2)設(shè)計瀏覽用戶自然信息ASP程序。
(3)設(shè)計數(shù)據(jù)查詢程序。
實驗步驟
??? 數(shù)據(jù)測覽程序包括瀏覽用戶的基本信息和工作信息兩個程序, 它們建立與數(shù)據(jù)庫Personel的連接或利用Session保存的連接和結(jié)果信息, 查詢相應(yīng)的表, 返回結(jié)果集并分頁顯示。將顯示結(jié)果集中的一頁的過程ShowPage存在文件showpape.asp中, 以供共享。
??? (l)設(shè)計顯示結(jié)果集中的指定頁的ASP程序showpage.asp。
<%
Sub ShowPage(rs,Page) '顯示結(jié)果集中的一頁
??? Response.Write "
" & rs.Fields(i).Name &" | "
" & rs.Fields(j).Value &" | "
End Sub
%>
(2)設(shè)計瀏覽用戶自然信息ASP程序browse_pop.asp:
<%
? if NOT IsObject(Session("PERSON_cn"))THEN
???? set cn=Server.CreateObject("ADODB.Connection")
???? cn.Provider="sqloledb"
???? ProvStr="Server=ZHUSANYUAN;Database=PERSON;UID=person_user;PWD=12345;"
???? cn.Open Provstr
???? Set Session("PERSON_cn")=cn?? '將cn對象保存在Session對象中
? ELSE
???? Set cn= Session("PERSON_cn")
? END IF
? IF NOT IsObject(Session("PERSONEL_rs")) THEN
???? Set rs=Server.CreateObject("ADODB.Recordset")
???? rs.Open "Select * from PERSONEL",cn,adOpenStatic
???? Set Session("PERSONEL_RS")=rs
? ELSE
???? Set rs= Session("PERSONEL_rs")
? END IF
? %>
?
?
? <% rs.PageSize=5
???? Page=CLng(Request("PageText"))
???? IF Page<1 THEN Page=1
???? IF Page>rs.PageCount THEN Page=rs.PageCount
??????? ShowPage rs,Page
? %>
????
思考與練習:
文件browse_work.asp用于瀏覽工作信息, 該程序與brower_pop.asp設(shè)計思想完全相同, 只要將表名、結(jié)果集名以及相應(yīng)的文件名做一些改動即可, 請讀者自行完成。
??? (3)設(shè)計數(shù)據(jù)查詢程序。數(shù)據(jù)查詢程序是依照用戶提出的要求查找有關(guān)的人事信息。這里設(shè)計接三種方式查詢的程序, 分別是按姓名查詢、按職稱查詢和按單位查詢。無論是按哪種條件查詢, 都是先從相關(guān)的表中列出被查詢的字段值, 經(jīng)用戶選擇后再進行查詢處理。下面給出按姓名查詢的程序, 共有兩個ASP文件, query_name.asp程序從PERSONEL表中提取出所有的人名, 以下拉菜單(select)形式提供給用戶選擇, 用戶選擇要查詢的姓名后提交, 由query_name_handle.asp程序處理。query_name_handle.asp程序查詢指定姓名的用戶的自然信息和工作信息, 并返回瀏覽器顯示。文件query_name.asp的內(nèi)容如下:
<%
? Set cn=Server.CreateObject("ADODB.Connection")
? cn.Provider="Sqloledb"
? ProvStr="Server=ZHUSANYUAN;Database=PERSON;UID=person_user;PWD=12345;"
? cn.Open ProvStr
? Set rs=Server.CreateObject("ADODB.Recordset")
? rs.Open "Select 姓名 from PERSONEL", cn, adOpenStatic
%>
請選擇姓名:
文件query_name_handle.asp的內(nèi)容如下:
<%
? name=Request("sele_name")
? set cn=Server.CreateObject("ADODB.Connection")
? cn.Provider="sqloledb"
? Provstr="Server=ZHUSANYUAN;Database=PERSON;UID=person_user;PWD=12345;"
? cn.Open ProvStr
? Set rs=Server.CreateObject("ADODB.Recordset")
? rs.Open "Select PERSONEL.身份證號, PERSONEL.姓名, 出生年月, 性別, 籍貫, 民族, 部門名, 職稱, 職務(wù), 工作時間 from PERSONEL, WORK, DEPART where PERSONEL.姓名='"& name&"' and WORK.姓名='"&name&"'and WORK.部門號=DEPART.部門號", cn, adOpenStatic
%>
?
?
??? <%
? IF Not rs.EOF THEN %>
?
身份證號: | ?????? <% Response.Write rs.Fields("身份證號").Value %> ??????? ? |
---|---|
姓名: | ?????? <% Response.Write rs.Fields("姓名").Value%> ??????? ? |
出生年月: | ??????? ?<%Response.Write rs.Fields("出生年月").Value%>?? ??????? |
性別: | ??????? ?<% IF rs.Fields("性別") THEN ??????????? Response.Write "男" ??????? ELSE ??????????? Response.Write "女" ??????? END IF%>????? ??????? ? |
籍貫: | ???? <% Response.Write ??? rs.Fields("籍貫").Value %> ??????? ? |
民族: | ????? <% Response.Write ? rs.Fields("民族").Value %> ??????? ? |
部門名: | ???? <% Response.Write ??? rs.Fields("部門名").Value %> ??????? ? |
職稱: | ???? <% Response.Write ??? rs.Fields("職稱").Value %> ??????? ? |
職務(wù): | ???? <% Response.Write ??? rs.Fields("職務(wù)").Value %> ??????? ? |
工作時間: | ???? <% Response.Write ??? rs.Fields("工作時間").Value %> ??????? ? |
??????? <%
ELSE
??? Response.write "您所查找的人沒有信息!"
END IF
rs.close
cn.close
%>
?
?
按姓名直詢的運行情況分別如圖5和6所示。
圖5選擇要查詢的姓名
圖6查詢結(jié)果
思考與練習:
設(shè)計按職稱、按單位查詢?nèi)耸滦畔⒌腁SP程序。
???
項目3? 數(shù)據(jù)添加程序設(shè)計
實驗?zāi)康?/p>
??? 掌握在 ASP中對 SQL Server數(shù)據(jù)庫進行添加的方法。
實驗內(nèi)容
(1)設(shè)計數(shù)據(jù)輸入界面。
(2)設(shè)計數(shù)據(jù)添加程序。
實驗步驟
??? 數(shù)據(jù)添加的處理分為兩部分,一部分是通過表單接收用戶輸入的數(shù)據(jù),這部分由文件append.html實現(xiàn);另一部分是對表單提交的數(shù)據(jù)的處理,即將數(shù)據(jù)分別寫入PERSONEL表和WORK表,由ASP程序append.asp完成。
??? (l)設(shè)計數(shù)據(jù)輸入界面。使用頁面開發(fā)工具設(shè)計如圖7所示的界面, 注意各輸入元素的命名及屬性須按照表5所列。
????????????????????????? 表11? 數(shù)據(jù)輸入界面各表單元素屬性及含義
表單元素 屬性值 說明 表單元素 屬性值 說明 Form Action=”append.asp” 輸入表單 Text文本框 Name=”sfzh” 身份證號 Text文本框 Name=”xm” 姓名 Text文本框 Name=”xb” 性別 Text文本框 Name=”sr” 出生年月 Text文本框 Name=”gzsj” 工作時間 Text文本框 Name=”jc” 獎懲情況 Text文本框 Name=”jbgz” 基本工資 Text文本框 Name=”dh” 電話 Text文本框 Name=”bmbh” 部門編號 Text文本框 Name=”zc” 職稱 Text文本框 Name=”zw” 職務(wù) Text文本框 Name=”dz” 地址 Text文本框 Name=”mz” 民族 Text文本框 Name=”jg” 籍貫 Text文本框 Name=”tc” 特長
????????????????????????????? 圖7 人事數(shù)據(jù)輸入表單
(2)設(shè)計數(shù)據(jù)添加程序append.asp。
<%
'讀取各字段的數(shù)據(jù)
sfzh=Request("sfzh")
xm=Request("xm")
jbgz=Request("jbgz")
xb=Request("xb")
sr=Request("sr")
gzsj=Request("gzsj")
jc=Request("jc")
bmh=Request("bmh")
zw=Request("zw")
zc=Request("zc")
tc=Request("tc")
mz=Request("mz")
jg=Request("jg")
dz=Request("dz")
dh=Request("dh")
Set cn = Server.CreateObject("ADODB.Connection")
cn.Provider = "sqloledb"
ProvStr="Server=ZHUSANYUAN;Database=PERSON;UID=Person_user;PWD=12345;"
cn.Open ProvStr
Set rs = Server.CreateObject("ADODB.Recordset")
rs.Open "select * from WORK",? cn,? adOpenDynamic,? adLockPessimistic
rs.AddNew
rs("身份證號")=sfzh
rs("姓名") = xm
rs("部門號")=bmh
rs("職稱") = zc
rs("職務(wù)") =zw
rs("工作時間") =gzsj
rs("特長")=tc
rs("獎懲記錄") =jc
rs("基本工資")=jbgz
rs.Update
Set rs1 = Server.CreateObject("ADODB.Recordset" )
rs1.Open "select * from PERSONEL",? cn,? adOpenDynamic,? adLockPessimistic
rs1.AddNew
rs1("身份證號")=sfzh
rs1("姓名") = xm
rs1("性別")=xb
rs1("出生年月")= sr
rs1("籍貫")=jg
rs1("民族")=mz
rs1("地址")=dz
rs1("電話")=dh
rs1.Update
cn.close
Response.Write "已添加了該條信息!"
%>
項目4? 數(shù)據(jù)修改程序設(shè)計
實驗?zāi)康?/p>
? (l) 掌握在 ASP中對 SQL Server數(shù)據(jù)庫進行修改的方法。
(2) 掌握在 ASP中對 SQL Server數(shù)據(jù)庫的數(shù)據(jù)進行刪除的方法。
實驗內(nèi)容
(1)設(shè)計修改信息文件。
(2)設(shè)計處理修改文件。
(3)設(shè)計數(shù)據(jù)庫修改處理程序。
(4)刪除界面設(shè)計。
(5)設(shè)計數(shù)據(jù)庫刪除處理程序。
實驗步驟?
對數(shù)據(jù)修改是人事管理中經(jīng)常要進行的操作, 本系統(tǒng)中設(shè)計了修改基本信息和修改工作信息兩部分ASP程序, 兩部分程序的設(shè)計原理是相同的, 所以下面只給出修改基本信息部分的程序。修改基本信息功能由3個ASP程序組成。程序change_pop.asp從PERSONEL表中提取出所有人的身份證號, 由用戶進行選擇。用戶選擇了要修改信息的身份證號后提交給chane_pop_handle.asp程序, 該程序返回該人的基本信息, 由用戶輸入新信息, 輸入完畢提交后由update_pop.asp程序?qū)⑿滦畔懭隤ERSONEL表。
??? (1)設(shè)計修改信息文件change_pop.asp??????????
? <!--include file=“adovbs.inc”-->
??????????? <%
??????????? Set cn=Server.CreateObject(“ADODB.Connection”)
??????????? cn.Provider=“Sqloledb”
??????????? ProvStr=“Servere=USER1;Database=PERSON;UID=person_user;PWD=12345;”
??????????? cn.Open ProvStr
??????????? Set rs=Server.CreateObject(“ADODB.Recordset”)
?????????? rs.Open “Select 身份證號 from PERSONEL”, cn, adOpenstatic
??????????? %>
???????????
?????????
?????????
請選擇身份證號:
?????????
???????????
? <% DO %>
???
??? <%=Server.HTMLEnode(rs.Fields(”身份證號”).Value)%>
????? <%
????? rs.MoveNext
????? LOOP UNTIL rs.EOF
????? rs.close
????? cn.closeN
????? %>
?????
??? %nbsp;
???
(2)設(shè)計處理修改文件change_pop_handle.asp。
<%
? id=Request("sele_id")
? Session("id")=id
? Set cn=Server.CreateObject("ADODB.connection")
? cn.Provider="sqloledb"
? ProvStr="Server=ZHUSANYUAN;Database=PERSON;UID=person_user;PWD=12345;"
? cn.Open ProvStr
? Set rs=Server.CreateObject("ADODB.Recordset")
? rs.Open "Select * from PERSONEL where 身份證號='"&id&"'", cn, adOpenStatic
?%>
???
<%
?? IF Not rs.EOF THEN
????? Response.Write "請?zhí)顚懶滦畔ⅲ?form action=update_pop.asp method=get>"'
????? Response.Write "身份證號(不可更改):"&" "&rs.Fields("身份證號").Value&"
"
????? Response.Write "姓名(不可更改):"&" "& rs.Fields("姓名").Value&"
"
????? Response.Write "出生年月(不可更改):"&" "&rs.Fields("出生年月").Value&"
"
????? IF rs.Fields("性別") THEN
???????? Response.Write "性別(不可更改):男
"
????? ELSE
???????? Response.Write"性別(不可更改): 女
"
????? END IF
????? Response.Write "籍貫(不可更改):"&" "& rs.Fields("籍貫").Value&"
"
????? Response.Write "民族(不可更改):"&" "&rs.Fields("民族").Value&"
"
????? Response.Write "地址:"&"
"
????? Response.Write "電話:"&"
"
????? Response.Write " "
????? Response.Write ""'
?? ELSE
????? Response.write "您所查找的人沒有信息!"
?? END IF
?? rs.close
?? cn.close
?%>
?
?(3)? 設(shè)計程序 update_pop.asp。
<%?? '讀取各字段的數(shù)據(jù)
? dz= Request("dz")
? dh= Request("dh")
? id=Session("id") '從Session中恢復(fù)出id
? Set cn=Server.CreateObject("ADODB.Connection")
? cn.Provider="sqloledb"
? ProvStr="Server=ZHUSANYUAN;Database=PERSON;UID=person_user;PWD=12345;"
? cn.Open? ProvStr
? Set rs=Server.CreateObject("ADODB.Recordset")
? rs.Open "select * from PERSONEL where 身份證號='"&id&"'", cn, adOpenDynamic, adLockPessimistic
? rs("地址")= dz
? rs("電話")=dh
? rs.Update
? cn.Close
? Response.Write "已修改了該條信息!"
%>
這部分程序的運行結(jié)果分別如圖 8~圖 10所示。
圖8 用戶選擇身份證號
圖9輸入新信息
圖10數(shù)據(jù)修改成功
??? (4) 數(shù)據(jù)刪除程序的設(shè)計與更新程序非常相似, 首先由用戶選擇要刪除的身份證號, 然后分別在PERSONEL和WORL表中找到該身份證號, 將記錄刪除。這里由用戶選擇要刪除的身份證號的程序與change_pop.asp幾乎相同, 只是將提交后的處理程序改為deletet_handle.asp。
下面給出delete_handle.asp程序的代碼:
??
<%
?? id= Request("sele_id")
?? Set cn= Server.CreateObject("ADODB.Connection")
?? cn.Provider="sqloledb"
?? ProvStr="Server=zhusanyuan;Database=Person;UID=person_user;PWD=12345;"
?? cn.Open ProvStr
?? Set rs= Server.CreateObject("ADODB.RecordSet")
?? cn.Execute "delete from PERSONEL where 身份證號='"&id&"'"
?? cn.Execute "delete from WORK Where 身份證號='"&id&"'"
?? IF err.number>0 THEN
????? Response.Write "vbscript errors occured:"&"
"
????? Response.Write "eror number="&err.number&"
"
????? Response.write "error dscr="&err.description&"
"
????? Response.Write "help context="&err.helpcontext&"
"
????? Response.Write "help path="&err.helppath&"
"
????? Response.write "native error="&err,? nativeerror&"
"
????? Response.Write "source="&errsource&"
"
????? Response.Write "sqlstate="&err.state&"
"
?? ELSE
????? Response.Write "該項記錄已被刪除!
"
?? END IF
?%>
?
?
這部分程序的運行結(jié)果可見圖11和圖12。
圖11 選擇被刪除的身份證號
圖12刪除操作成功后的提示
思考與練習:
1.設(shè)計修改人員工作信息的 ASP程序。
2.最后的工作就是設(shè)計一些Web頁面, 將這些功能連接起來;形成一個完整的系統(tǒng)。這部分工作在任何一個頁面開發(fā)工具中都可以很容易地實現(xiàn), 請學生自行完成。
柚子快報激活碼778899分享:【數(shù)據(jù)庫】實驗指導
推薦閱讀
本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點和立場。
轉(zhuǎn)載請注明,如有侵權(quán),聯(lián)系刪除。