柚子快報(bào)激活碼778899分享:【數(shù)據(jù)庫(kù)】實(shí)驗(yàn)指導(dǎo)
柚子快報(bào)激活碼778899分享:【數(shù)據(jù)庫(kù)】實(shí)驗(yàn)指導(dǎo)
實(shí)驗(yàn)1? SQL Server的安裝及其管理工具的使用
目的與要求
??? (1) 掌握 SQL Server服務(wù)器的安裝。
??? (2) 掌握企業(yè)管理器的基本使用方法。
??? (3) 掌握查詢分析器的基本使用方法。
??? (4) 了解數(shù)據(jù)庫(kù)及其對(duì)象。
實(shí)驗(yàn)內(nèi)容
(1)安裝 SQL Server 2000
(2)利用企業(yè)管理器訪問(wèn)系統(tǒng)自帶的pubs數(shù)據(jù)庫(kù)
(3)查詢分析器的使用
實(shí)驗(yàn)步驟
??? 1.安裝 SQL Server 2000
??? 根據(jù)軟硬件環(huán)境,選擇一個(gè)合適版本的 SQL Server 2000。安裝步驟請(qǐng)參照 教材第1.33節(jié)。
??? 2.利用企業(yè)管理器訪問(wèn)系統(tǒng)自帶的pubs數(shù)據(jù)庫(kù)
??? (l)啟動(dòng) SQL Server服務(wù)管理器。
??? (2)以系統(tǒng)管理員身份登錄到企業(yè)管理器并訪問(wèn)pubS數(shù)據(jù)庫(kù)。
??? (3)在企業(yè)管理器的目錄樹(shù)中展開(kāi)文件失一展開(kāi)pubS數(shù)據(jù)庫(kù)圖標(biāo),則將列出該數(shù)據(jù)庫(kù)的、所有對(duì)象,如表、視圖、存儲(chǔ)過(guò)程,默認(rèn)、規(guī)則等。
??? (4)選中pubs下的“表”圖標(biāo),將列出pubs數(shù)據(jù)庫(kù)所有的表(系統(tǒng)表和用戶表),在此以用戶表Publishers為例,打開(kāi)該表,查看其內(nèi)容。
??? (5)在表的尾部插入記錄(9943, zhang, null, china)和( 1408, li, shanghai, NULL china),會(huì)發(fā)生什么情況?
??? (6)在表中刪除步驟(5)插入的記錄。
??? 3.查詢分析器的使用
?(l) 在查詢分析器對(duì)象瀏覽器的目錄樹(shù)中展開(kāi)pubs數(shù)據(jù)庫(kù)圖標(biāo),則將列出該數(shù)據(jù)庫(kù)的所有對(duì)象,如表、視圖、存儲(chǔ)過(guò)程等。
?(2) 以pubs數(shù)據(jù)庫(kù)的用戶表anthors為例,選中該表的圖標(biāo),單擊鼠標(biāo)右鍵,出現(xiàn)一快捷菜單,執(zhí)行“打開(kāi)”菜單項(xiàng),打開(kāi)該表,查看其內(nèi)容。
(3)在表的尾部插入一記錄。
(4)在查詢分析器的輸入窗口,輸入如下 T-SQL語(yǔ)句:
????????? use pubs
??????????? select * from authors
??????????? go
看看執(zhí)行結(jié)果是什么?
思考與練習(xí):
用查詢分析器查詢pubs數(shù)據(jù)庫(kù)publishers表的所有記錄。
實(shí)驗(yàn)2? 創(chuàng)建數(shù)據(jù)庫(kù)和表?????????????????????????????????
目的和要求
(l) 了解 SQL Server數(shù)據(jù)庫(kù)的邏輯結(jié)構(gòu)和物理結(jié)構(gòu)。
(2) 了解表的結(jié)構(gòu)特點(diǎn)。
(3) 了解 SQL Servr的基本數(shù)據(jù)類型.
(4) 了解空值概念。
(5) 學(xué)會(huì)在企業(yè)管理器中創(chuàng)建數(shù)據(jù)庫(kù)和表。
(6) 學(xué)會(huì)使用 T-SQL語(yǔ)句創(chuàng)建數(shù)據(jù)庫(kù)和表。
實(shí)驗(yàn)內(nèi)容
(1) 在企業(yè)管理器中創(chuàng)建數(shù)據(jù)庫(kù)YGGL
(2) 在企業(yè)管理器中刪除創(chuàng)建的YGGL數(shù)據(jù)庫(kù)
(3) 使用T-SQL語(yǔ)句創(chuàng)建數(shù)據(jù)庫(kù)YGGL
(4) 在企業(yè)管理器中分別創(chuàng)建表 Employees、Departments和 Salary
(5) 在企業(yè)管理器中刪除創(chuàng)建的Employees、Departments和Salary表
(6) 使用 T-SQL語(yǔ)句創(chuàng)建表 Employees、 Departments和 Salary
(7) 表數(shù)據(jù)的添加、修改、刪除
實(shí)驗(yàn)步驟??
?1.實(shí)驗(yàn)準(zhǔn)備
??? 創(chuàng)建用于企業(yè)管理的員工管理數(shù)據(jù)庫(kù),數(shù)據(jù)庫(kù)名為YGGL,包含員工的信息、部門(mén)信息以及員工的薪水信息。數(shù)據(jù)庫(kù)YGGL包含下列3個(gè)表:
??? (l)Employees;員工信息表。
??? (2)Department:部門(mén)信息表。
??? (3) Salary;員工薪水情況表。
各表的結(jié)構(gòu)分別如表1、表2和表3所示。
表1? Employees表結(jié)構(gòu)
列名 數(shù)據(jù)類型 長(zhǎng)度 是否允許為空值 說(shuō)明 EmployeeID Char 6 ′ 員工編號(hào),主鍵 Name Char 10 ′ 姓名 Birthday Datetime 8 ′ 出生日期 Sex Bit 1 ′ 性別 Address Char 20 √ 地址 Zip Char 6 √ 郵編 PhoneNumber Char 12 √ 電話號(hào)碼 EmailAddress Char 30 √ 電子郵件地址 DepartmentID Char 3 ′ 員工部門(mén)號(hào),外鍵
表2? Departments表結(jié)構(gòu)
列名 數(shù)據(jù)類型 長(zhǎng)度 是否允許為空值 說(shuō)明 DepartmentID Char 3 ′ 部門(mén)編號(hào),主鍵 DepartmentName Char 20 ′ 部門(mén)名 Note text 16 √ 備注
表3? Salary表結(jié)構(gòu)
列名 數(shù)據(jù)類型 長(zhǎng)度 是否允許為空值 說(shuō)明 EmployeeID Char 6 ′ 員工編號(hào),主鍵 InCome Float 8 ′ 收入 OutCome float 8 ′ 支出
??? 首先要明確,能夠創(chuàng)建數(shù)據(jù)庫(kù)的用戶必須是系統(tǒng)管理員,或是被授權(quán)使用CREATEDATABASE語(yǔ)句的用戶。??? 其次創(chuàng)建數(shù)據(jù)庫(kù)必須要確定數(shù)據(jù)庫(kù)名、所有者(即創(chuàng)建數(shù)據(jù)庫(kù)的用戶)、數(shù)據(jù)庫(kù)大小(最初的大小、最大的大小、是否允許增長(zhǎng)及增長(zhǎng)方式)和存儲(chǔ)數(shù)據(jù)庫(kù)的文件。
??? 然后,確定數(shù)據(jù)庫(kù)包含哪些表,以及所包含的各表的結(jié)構(gòu),還要了解SQL Server的常用數(shù)據(jù)類型,以創(chuàng)建數(shù)據(jù)庫(kù)的表。
此外還要了解兩種常用的創(chuàng)建數(shù)據(jù)庫(kù)、表的方法,即在企業(yè)管理器中創(chuàng)建和使用T-SQL語(yǔ)句創(chuàng)建。
???2.在企業(yè)管理器中創(chuàng)建數(shù)據(jù)庫(kù)YGGL
??? 要求:數(shù)據(jù)庫(kù)YGGL初始大小為 10 MB,最大大小為50 MB,數(shù)據(jù)庫(kù)自動(dòng)增長(zhǎng),增長(zhǎng)方式是按 5%比例增長(zhǎng);日志文件初始為 2 MB,最大可增長(zhǎng)到 5 MB(默認(rèn)為不限制),按 1MB增長(zhǎng)(默認(rèn)是按5%比例增長(zhǎng))。數(shù)據(jù)庫(kù)的邏輯文件名和物理文件名均采用默認(rèn)值,分別為YGGL-data和e:\sql\data\MSSQL\Datar\YGGL.mdf,其中 e:\sql\data\MSSQL為 SQL Server的系統(tǒng)安裝目錄;事務(wù)日志的邏輯文件名和物理文件名也均采用默認(rèn)值,分別為YGGL_LOG和e:\sql\data\MSSQL\Data\YGGL_log.ldf。
??? 以系統(tǒng)管理員 Administrator或被授權(quán)使用 CREATE DATABASE語(yǔ)句的用戶登錄 SQLServer服務(wù)器,啟動(dòng)企業(yè)管理器-->在服務(wù)器上單擊鼠標(biāo)右鍵-->新建數(shù)據(jù)庫(kù)-->輸入數(shù)據(jù)庫(kù)名“ YGGL”-->選擇“數(shù)據(jù)文件”選項(xiàng)卡-->設(shè)置增長(zhǎng)方式和增長(zhǎng)比例-->選擇“事務(wù)日志”選項(xiàng)卡-->設(shè)置增長(zhǎng)方式和增長(zhǎng)比例。
??? 注意:在“數(shù)據(jù)文件”選項(xiàng)卡和“事務(wù)日志”選項(xiàng)卡中,可以分別指定數(shù)據(jù)庫(kù)文件和日志文件的物理路徑等補(bǔ)性。
??? 3.在企業(yè)管理器中刪除創(chuàng)建的YGGL數(shù)據(jù)庫(kù)
??? 在企業(yè)管理器中選擇數(shù)據(jù)庫(kù)YGGL-->在YGGL上單擊鼠標(biāo)右鍵則刪除。
??? 4.使用T-SQL語(yǔ)句創(chuàng)建數(shù)據(jù)庫(kù)YGGL
??? 按照上述要求創(chuàng)建數(shù)據(jù)庫(kù)YGGL。
??? 啟動(dòng)查詢分析器-->在“查詢”窗口中輸入如下T-SQL語(yǔ)句:
? 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í)行圖標(biāo)執(zhí)行上述語(yǔ)句,并在企業(yè)管理器中查看執(zhí)行結(jié)果。
??? 4.在企業(yè)管理器中分別創(chuàng)建表 Employees、Departments和 Salary
??? 在企業(yè)管理器中選擇數(shù)據(jù)庫(kù)YGGL-->在YGGL上單擊鼠標(biāo)右鍵-->新建-->表時(shí)輸入Employees表各字段信息則單擊保存圖標(biāo)叫輸入表名 Employees,即創(chuàng)建了表 Employees。按同樣的操作過(guò)程創(chuàng)建表Departments和Salary。
??? 5.在企業(yè)管理器中刪除創(chuàng)建的Employees、Departments和Salary表
??? 在企業(yè)管理器中選擇數(shù)據(jù)庫(kù)YGGL的表Employees-->在Employees上單擊鼠標(biāo)右鍵-->刪除,即刪除了表Employees。按同樣的操作過(guò)程刪除表Departments和Salary。
??? 6.使用 T-SQL語(yǔ)句創(chuàng)建表 Employees、 Departments和 Salary
啟動(dòng)查詢分析器-->在“查詢”窗口中輸入以下T-SQL語(yǔ)句:
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
單臺(tái)快捷工具欄的執(zhí)行圖標(biāo),執(zhí)行上述語(yǔ)句,即可創(chuàng)建表 Employees。
按同樣的操作過(guò)程創(chuàng)建表 Departments和 Salary,并在企業(yè)管理器中查看結(jié)果。
7. 在企業(yè)管理器中向數(shù)據(jù)庫(kù)YGGL表加入數(shù)據(jù)
(1)在企業(yè)管理器中向表Employees中加入如表1所示的記錄。
表1?? Employees表記錄
編號(hào) 姓名 地址 郵編 電話 電子郵件 部門(mén)號(hào) 出生日期 性別 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 葉見(jiàn) 北京西路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-->在其上單擊鼠標(biāo)右鍵-->選“返回所有行”-->逐字段輸入各記錄值,輸入完后,關(guān)閉表窗口。
(2)在企業(yè)管理器中向表Departments插入如表 2所示的記錄。
表2?? Departments表記錄
編號(hào) 部門(mén)名稱 備注 1 財(cái)務(wù)部 NULL 2 人力資源部 NULL 3 經(jīng)理辦公室 NULL 4 研發(fā)部 NULL 5 市場(chǎng)部 NULL
(3)在企業(yè)管理器中向表Salary插入如表3所示的記錄。
表3?? Departments表記錄
編號(hào) 收入 支出 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ù)庫(kù)YGGL表數(shù)據(jù)
(1)在企業(yè)管理器中刪除表 Employees的第 2、 8行和 Salary的第2、11行。注意進(jìn)行刪除操作時(shí),作為兩表主鍵的EmployeeID的值,以保持?jǐn)?shù)據(jù)完整性。
??? 在企業(yè)管理器中選擇表Employees-->在其上單擊鼠標(biāo)右鍵、選“返回所有行”-->選擇要?jiǎng)h除的行-->單擊鼠標(biāo)右鍵-->刪除-->關(guān)閉表窗口。
(2)在企業(yè)管理器中刪除表 Department的第2行,同時(shí)也要?jiǎng)h除表Employees的第2行。操作方法同上。
(3)在企業(yè)管理器中將表Employees中編號(hào)為020018的記錄的部門(mén)號(hào)改為4。
??? 在企業(yè)管理器中選擇表 Employees-->在其上單擊鼠標(biāo)右鍵-->選“返回所有行”-->將光標(biāo)定位至編號(hào)為020018的記錄的DepartmentID字段,將值1改為4。
9.使用T-SQL命令修改數(shù)據(jù)庫(kù)YGGL表數(shù)據(jù)
(l)使用T-SQL命令分別向YGGL數(shù)據(jù)庫(kù)的Employees、Departments和Salary表中插入一行記錄。???
啟動(dòng)查詢分析器-->在“查詢”窗口中輸入如下T-SQL語(yǔ)句:
????? USE YGGL
????? INSERT INTO Employees??? VALUES('011112','羅林','1973-5-3',1,'解放路100號(hào)', 210002,4055663,NULL,5)
????????? GO
????????? INSERT INTO Departments
?????????????? VALUES('2','人力資源部',NULL)
????????? GO
????????? INSERT INTO Salary
?????????????? VALUES('011112',1200.95,50)
?????????? GO
??????? 單擊快捷工具欄的執(zhí)行圖標(biāo),執(zhí)行上述語(yǔ)句。
????? 注意:在企業(yè)管理器中分別打開(kāi)YGGL數(shù)據(jù)庫(kù)的Employees、 Departmenta和Salary表, 觀察數(shù)據(jù)變化。
(2)使用T-SQL命令修改表Salary中的某個(gè)記錄的字段值。?
啟動(dòng)查詢分析器-->在“查詢”窗口中輸入如下T-SQL語(yǔ)句:
????????????? USE YGGL
????????????? UPDATE Salary
?????????????????? SET InCome= 2890
?????????????????? WHERE EmployeeID='01lll2'
????????????? GO
????? 單擊快捷工具欄的執(zhí)行圖標(biāo),執(zhí)行上述語(yǔ)句,將編號(hào)為0llllZ的職工收入改為2890。
????? 注意:在企業(yè)管理器中打開(kāi)YGGL 數(shù)據(jù)庫(kù)Salary表,觀察數(shù)據(jù)變化。
(3)修改表Employees和Departments的記錄值,仍要注意完整性。操作過(guò)程同上。
(4)使用T-SQL命令修改表Salary中的所有記錄的字段值。
????? 啟動(dòng)查詢分析器則在“查詢”窗口中輸入如下T-SQL語(yǔ)句:
??????????????? USE YGGL
????????????? UPDATE Salary
??????????????????? SET InCome= InCome+100
????????????????? Go
????? 單擊快捷工具欄的執(zhí)行圖標(biāo),執(zhí)行上述語(yǔ)句,將所有職工的收入增加 100。
????? 可見(jiàn),使用T-SQL語(yǔ)句操作表數(shù)據(jù)比在企業(yè)管理器中操作表數(shù)據(jù)更為靈活。
????? 注意:? ?輸入T-SQL語(yǔ)句? SELECT *? FROM Salary,觀察數(shù)據(jù)變化。
(5)使用TRANCATE TABLE語(yǔ)句刪除表中所有行。
????? 啟動(dòng)查詢分析器-->在"查詢"窗口中輸入如下T-SQL語(yǔ)句:
??????????????? USE YGGL
????????????????? TRANCATE TABLE Salary
??????????????? GO
????? 單擊快捷工具欄的執(zhí)行圖標(biāo),執(zhí)行上述語(yǔ)句,將刪除Salary表中的所有行。
????? 注意:實(shí)驗(yàn)時(shí)一般不要輕易執(zhí)行這個(gè)操作,困為后面實(shí)驗(yàn)還要用到這些數(shù)據(jù)。如要添該命令的效果,可創(chuàng)建一個(gè)臨時(shí)表,輸入少量數(shù)據(jù)后進(jìn)行。
實(shí)驗(yàn)3? 數(shù)據(jù)庫(kù)的查詢
實(shí)驗(yàn)?zāi)康?/p>
??? (1)掌握SELECT語(yǔ)句的基本語(yǔ)法。
??? (2)掌握子查詢的表示。
??? (3)掌握連接查詢的表示。
??? (4)掌握數(shù)據(jù)匯總的方法。
??? (5)掌握 SELECT語(yǔ)句的 GROUP BY子句的作用和使用方法。
??? (6)掌握 SELECT語(yǔ)句的 ORDER BY子句的作用和使用方法。
實(shí)驗(yàn)準(zhǔn)備
??? (1)了解SELECT語(yǔ)句的基本語(yǔ)法格式。
??? (2)了解SELECT語(yǔ)句的執(zhí)行方法。
??? (3)了解子查詢的表示方法。
??? (4)了解連接查詢的表示。
??? (5)了解數(shù)據(jù)匯總的方法。
??? (6)了解 SELECT語(yǔ)句的 GROUP BY子句的作用和使用方法。
??? (7)了解 SELECT語(yǔ)句的 ORDER BY子句的作用。
實(shí)驗(yàn)內(nèi)容
1.SELECT語(yǔ)句的基本使用
??? (l)對(duì)于實(shí)驗(yàn)2給出的數(shù)據(jù)庫(kù)表結(jié)構(gòu),查詢每個(gè)雇員的所有數(shù)據(jù)。在查詢分析器的編輯窗口輸入如下語(yǔ)句并執(zhí)行:
??????????? USE YGGL
??????????? SELECT *? FROM Employees
??????????? GO
??? 思考與練習(xí):用SELECT語(yǔ)句查詢Departments和Salary表的所有記錄。
??? (2)查詢每個(gè)雇員的地址和電話。在查詢分析器的編輯窗口輸入如下語(yǔ)句并執(zhí)行:
????????? USE YGGL
????????? SELECT Address,PhoneNumber
????????????? FROM Employees
????????? GO
??? 思考與練習(xí):用SELECT語(yǔ)句查詢Departments和Salary表的一列或若干列。
??? (3)查詢EmployeeID為000001的雇員的地址和電話。在查詢分析器的編輯窗口輸入如下語(yǔ)句并執(zhí)行:
??????? USE YGGL
SELECT Address, PhoneNumber
????????????? FROM Employees
????????????? Where EmployeeID='000001'
?????? GO
??? 思考與練習(xí):用 SELECT語(yǔ)句查詢 Departments和Salary表中滿足指定條件的一列或若干列。
??? (4)查詢Employees表中女雇員的地址和電話,使用AS子查詢將結(jié)果中各列的標(biāo)題分別指定為地址、電話。在查詢分析器的編輯窗口輸入如下語(yǔ)句并執(zhí)行:
????????? USE YGGL
????????? SELECT Address AS地址, PhoneNumber AS 電話
????????????? FROM Employees
????????????????? WHERE sex= 0
???????????? GO
??? 注意:使用AS子句可指定目標(biāo)列的標(biāo)題。
??? (5)計(jì)算每個(gè)雇員的實(shí)際收入。在查詢分析器的編輯窗口輸入如下語(yǔ)句并執(zhí)行:
???????? USE YGGL
???????? SELECT EmployeeID, 實(shí)際際收入=InCome-OutCome
????????????? FROM Salary
???????? GO
(6) 找出所有姓”王”的雇員的部門(mén)號(hào)。在查詢分析器的編輯窗口輸入如下語(yǔ)句并執(zhí)行:
USE YGGL
SELEC DepartmentID
????????????? FROM Employees
??????????????? WHERE name LIKE '王%'
???????? GO
??? 思考與練習(xí):找出所有地址中含有“中山”的雇員的號(hào)碼及部門(mén)號(hào)。
??? (7)找出所有收入在2000~3000元之間的雇員編號(hào)。在查詢分析器的編輯窗口輸入如下語(yǔ)句并執(zhí)行:
????????? USE YGGL
????????? SELECT EmployeeID
??????????????? FROM Salary
????????????????? WHERE InCome BETWEEN 2000 AND 3000
????????? Go
??? 思考與練習(xí):找出所有在財(cái)務(wù)部和人力資源部工作的雇員的編號(hào)。
??? 注意:在SELECTT語(yǔ)句中 LIKE、 BETWEEN…AND、 IN、 NOT及CONTAIN謂詞的作用。
2.子查詢的使用
??? (1)查找在財(cái)務(wù)部工作的雇員的情況。在查詢分析器的編輯窗口輸入如下語(yǔ)句并執(zhí)行:
??????????? USE YGGL
??????????? SELECT *
????????????? FROM Employees
????????????? WHERE DepartmentID=
????????????????? ( SELECT DepartmentID
????????????????????? FROM Departments
????????????????? WHERE DepartmentName='財(cái)務(wù)部')
??????????? GO
??? 思考與練習(xí):用子查詢的方法查找所有收入在 2500元以下的雇員的情況。
??? (2)查找財(cái)務(wù)部年齡不低于研發(fā)部雇員年齡的雇員的姓名。在查詢分析器的編輯窗口輸入如下語(yǔ)句并執(zhí)行:
??????????? USE YGGL
??????????? SELECT Name
????????????? FROM Employees
????????????? WHERE DepartmentID IN
??????????????? ( SELECT DeptmentID
?????????????????? FROM Departments
????????????????? WHERE DepartmentName='財(cái)務(wù)部')
????????????????? AND Birthday>ALL(SELECT Birthday
??????????????????????????? FROM Employees
??????????????????????????? Where DepartmentID IN
????????????????????????????? ( SELECT DepartmentID
????????????????????????????????????? FROM Dapartments
?????????????????????????????????? where DepartmentName='研發(fā)部'))
??????????? Go
??? 思考與練習(xí):用于查詢的方法查找研發(fā)部比所有財(cái)務(wù)部雇員收入都高的雇員的姓名。
??? (3)查找比所有財(cái)務(wù)部的雇員收入都高的雇員的姓名。在查詢分析器的編輯窗口輸入如下的語(yǔ)句并執(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='財(cái)務(wù)部'))))
??????????????? GO
????? 思考與練習(xí):用于查詢的方法查找所有年齡比研發(fā)部雇員年齡都大的雇員的姓名。
3.連接查詢的使用
????? (1)查詢每個(gè)雇員的情況及其薪水的情況。在查詢分析器的編輯窗口輸入如下的語(yǔ)句并執(zhí)行:
??????????????? USE YGGL
??????????????? SELECT EmPloyees.*,? Salar.*
??????????????????? FROM Employees,? Salary
??????????????????? WHERE Emgloyees.EmployeeID=SalaryEmployeeID
??????????????? GO
????? 思考與練習(xí):查詢每個(gè)雇員的情況及其工作部門(mén)的情況。
????? 間查找財(cái)務(wù)部收入在2200元以上的雇員姓名及其薪水詳情。在查詢分析器的編輯窗口輸入如下語(yǔ)句并執(zhí)行:
??????????? USE YGGL
??????????? SELECT Name, InCome, OutCome
??????????????? FROM Employees, Salary,? Departments
??????????????? WHERE Employees.EmployeeID=Salary.EmployeeID AND Employees.DepartmentID
????????????? = Departments.DEpartmentID AND DepartmentName='財(cái)務(wù)部' AND InCome>2000
???????????? GO
????? 思考與練習(xí):查詢研發(fā)部在1966年以前出生的雇員姓名及其薪水詳情。
4數(shù)據(jù)匯總
(l)求財(cái)務(wù)部雇員的平均收入。在查詢分析器的編輯窗口輸入如下語(yǔ)句并執(zhí)行:
??????????? USE YGGL
??????????? SELECT AVG(InCome) AS?? '財(cái)務(wù)部平均收入'
WHERE EmployeeID IN
???????????????????? ( SELECT EmployeerID
????????????????????????? FROM Employees
????????????????????????? WHERE? DepartmentID=
?????????????????????????? ( SELECT DepartmentID
??????????????????????????????? FROM Departments
?????????????????????????????? WHERE DepartmentName='財(cái)務(wù)部'))
????????? GO
? 思考與練習(xí):查詢財(cái)務(wù)部雇員的最高和最低收入。
(2)求財(cái)務(wù)部雇員的平均實(shí)際收入。在查詢分析器的編輯窗口輸入如下的語(yǔ)句并執(zhí)行:
??????? USE YGGL
??????? SELECT AVG(InCome-OutCome) AS '財(cái)務(wù)部平均實(shí)際收入'
??????????? FROM Salary
??????????? WHERE EmployeeID IN
????????????? ( SELECT EmployeeID
??????????????????? FROM Employees
??????????????????? WHERE DepartmentID=
????????????????????? ( SELECT DepartmentID
??????????????????????????? FROM DePartments
??????????????????????? WHERE DepartmentName='財(cái)務(wù)部'))
??????????? GO
? 思考與練習(xí):查詢財(cái)務(wù)部雇員的最高和最低實(shí)際收入。
(3)求財(cái)務(wù)部雇員的總?cè)藬?shù)。在查詢分析器的編輯窗口輸入如下的語(yǔ)句并執(zhí)行:
??????? USE YGGL
??????? SELECT Count(EmgloyeeID)
??????????? FROM Employees
??????????? WHERE DepartmentID=
????????????? ( SELECT DepartmentID
??????????????????? FROM Departments
????????????????? WHERE DepartmentName ='財(cái)務(wù)部')
????????? GO
? 思考與練習(xí):統(tǒng)計(jì)財(cái)務(wù)部收入在 2 500以上雇員的人數(shù)。
5. GROUP BY、? ORDER BY子句的使用
? (l)求各部門(mén)的雇員數(shù)。在查詢分析器的編輯窗口輸入如下的語(yǔ)句并執(zhí)行:
??????? USE YGGL
??????? SELECT COUNT(EmployeeID)
??????????? FROM Employees
????????????? GROUP BY DepartmentID
?????? GO
思考與練習(xí):統(tǒng)計(jì)各部門(mén)收入在2000以上雇員的人數(shù)。
??? (2)將各雇員的情況按收入由低到高排列。在查詢分析器的編輯窗口輸入如下的語(yǔ)句并執(zhí)
行:
????????? USE YGGL
????????? SELECT Employees.*, Salary.*
????????????? FROM Employees, Salary
????????????? WHERE Employees.EmployeeID=Salary.EmployeeID
????????????? ORDER BY InCome
????????? GO?????????????
??? 思考與練習(xí):將各雇員的情況按出生時(shí)間先后排列。
實(shí)驗(yàn)4? T-SQL編程
實(shí)驗(yàn)?zāi)康?/p>
(l) 進(jìn)一步鞏固第2章至第4章所學(xué)的內(nèi)容。
(2) 掌握用戶自定義類型的使用。
(3) 掌握變量的分類及其使用。
(4) 掌握各種運(yùn)算符的使用。
(5) 掌握各種控制語(yǔ)句的使用。
(6) 掌握系統(tǒng)函數(shù)及用戶自定義函數(shù)的使用。
實(shí)驗(yàn)內(nèi)容
(1)自定義數(shù)據(jù)類型的使用
(2)自定義函數(shù)的使用
實(shí)驗(yàn)步驟
1.自定義數(shù)據(jù)類型的使用
(l)對(duì)于實(shí)驗(yàn)2給出的數(shù)據(jù)庫(kù)表結(jié)構(gòu),再自定義一數(shù)據(jù)類型ID_Type,用于描述員工編號(hào)。
在查詢分析器編輯窗口輸入如下程序并執(zhí)行:
????????? USE YGGL
????????? EXEC sp_addtype 'ID_Type','char(6)','not null'
????????? GO
??? 注意:不能漏掉單引號(hào)。
(2)重新創(chuàng)建 YGGL數(shù)據(jù)庫(kù)的 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ù)實(shí)現(xiàn)如下功能:對(duì)于一給定的DepartmentID之值,查詢?cè)撝翟贒epartments表中是否存在,若存在返回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)寫(xiě)一段T-SQL腳本程序調(diào)用上述函數(shù)。當(dāng)向Employees表插入一記錄時(shí),首先調(diào)用函數(shù)CHECK_ID,檢察該記錄的DepartmentID值在表Departments的DepartmentID字段中是否存在對(duì)應(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號(hào)', '2100009', '3497534','zhang@jlonlne.com','2')
???????? GO
思考與練習(xí):
??? 編寫(xiě)如下程序:
(l)自定義一數(shù)據(jù)類型,用于描述YGGL數(shù)據(jù)庫(kù)中的DepartmentID字段,然后編寫(xiě)代碼重新定義數(shù)據(jù)庫(kù)的各表。
(2)當(dāng)對(duì)Departments表的DepartmentID字段值修改時(shí),對(duì)Employees表中對(duì)應(yīng)的DepartmentID字段值也進(jìn)行相應(yīng)修改。
(3)對(duì)Employees表進(jìn)行修改時(shí),不允許對(duì)DepartmentID字段值進(jìn)行修改。
實(shí)驗(yàn)5? 索引、存儲(chǔ)過(guò)程和觸發(fā)器的使用
實(shí)驗(yàn)?zāi)康?/p>
(l) 掌握索引的使用方法。
(2) 掌握存儲(chǔ)過(guò)程的使用方法。
(3) 掌握觸發(fā)器的使用方法。
實(shí)驗(yàn)內(nèi)容
(1)建立索引
(2)創(chuàng)建觸發(fā)器
(3)創(chuàng)建存儲(chǔ)過(guò)程
(4)調(diào)用存儲(chǔ)過(guò)程
實(shí)驗(yàn)步驟
1.建立索引
??? 對(duì) YGGL數(shù)據(jù)庫(kù)的 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ā)器
??? 對(duì)于YGGL數(shù)據(jù)庫(kù),表Employees的DepallmentID列與表Department的DepartmentID列應(yīng)滿足參照完整性規(guī)則,即:
??? .向Employees表添加一記錄時(shí),該記錄的DepartmentID值在Departments表中應(yīng)存在。
??? .修改Departments表的DepartmntID字段值時(shí),該字段在Employees表中的對(duì)應(yīng)值也應(yīng)修改。
??? .刪除Departments表中一記錄時(shí),該記錄DepartmentID字段值在Employees表中對(duì)應(yīng)的記錄也應(yīng)刪除。
????? 上述參照完整性規(guī)則,在此通過(guò)觸發(fā)器實(shí)現(xiàn)。
?在查詢分析器編輯窗口輸入各觸發(fā)器的代碼并執(zhí)行:
??? (l)向Employees表插入或修改一記錄時(shí),通過(guò)觸發(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???? /*對(duì)當(dāng)前事務(wù)回滾,即恢復(fù)到插入前的狀態(tài)*/
????????????? END
??? (2)修改Departments表的DepartmentID字段值時(shí),該字段在 Employees表中的對(duì)應(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表中一記錄的同時(shí)刪除該記錄DepartmentID字段值在Employees表中對(duì)應(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)建存儲(chǔ)過(guò)程
????? 在查詢分析器編輯窗口輸入各存儲(chǔ)過(guò)程的代碼并執(zhí)行:
????? (l)添加職員記錄的存儲(chǔ)過(guò)程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)修改職員記錄的存儲(chǔ)過(guò)程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)刪除職員記錄的存儲(chǔ)過(guò)程EmployeeDelete。
????????? USE YGGL
????????? CREATE PROCEDURE EmployDelete
??????????? (@employeeID char(6))
????????? AS
??????????? BEGIN
????????????? DELETE FROM Employees
????????????????? WHERE Emgloyeeid=@employeeid
??????????? END
????????? RETURN
????????? GO
4. 調(diào)用存儲(chǔ)過(guò)程
???? USE YGGL
???????? EXEC EmployeeAdd? '990230', '劉朝', '890909',1, '武漢小洪山5號(hào)', '', '', '', '3'
???????? USE YGGL
???????? EXEC EmployeeUpdate '990230', '990232', '劉平', '890909', l, 武漢小洪山 5號(hào)', '','', '', '2'
???????? USE YGGL
???????? EXEC EmployeeDelete '990232'
???????? GO
??? 分析一下此段程序執(zhí)行時(shí)可能出現(xiàn)哪幾種情況。
思考與練習(xí):
??? 編寫(xiě)如下 T-SQL程序:
??? (l)自定義一數(shù)據(jù)類型,用于描述YGGL數(shù)據(jù)庫(kù)中的DepartmentID字段,然后編寫(xiě)代碼,重新定義數(shù)據(jù)庫(kù)各表。
??? (2)對(duì)于 YGGL數(shù)據(jù)庫(kù),表Employees的EmployeeID列與表Salary的EmployeeID列應(yīng)滿足參照完整性規(guī)則,請(qǐng)用觸發(fā)器實(shí)現(xiàn)兩個(gè)表間的參照完整性。
??? (3)編寫(xiě)對(duì)數(shù)據(jù)庫(kù)YGGL各表進(jìn)行插入、修改、刪除操作的存儲(chǔ)過(guò)程,然后編寫(xiě)一段程序調(diào)用這些存儲(chǔ)過(guò)程。
實(shí)驗(yàn)6? VB人員信息管理系統(tǒng)
項(xiàng)目1? 連接數(shù)據(jù)庫(kù)及調(diào)用存儲(chǔ)過(guò)程
實(shí)驗(yàn)?zāi)康?/p>
??? (l) 掌握在 SQL Server中創(chuàng)建數(shù)據(jù)庫(kù)、表、觸發(fā)器、存儲(chǔ)過(guò)程的方法。
??? (2) 掌握在VB中通過(guò)數(shù)據(jù)視圖窗口查看數(shù)據(jù)庫(kù)對(duì)象及創(chuàng)建觸發(fā)器和存儲(chǔ)過(guò)程的方法。
??? (3) 掌握通過(guò)代碼建立數(shù)據(jù)庫(kù)連接及訪問(wèn)表記錄的方法。
??? (4) 掌握VB中調(diào)用存儲(chǔ)過(guò)程對(duì)表數(shù)據(jù)進(jìn)行操作的方法。
實(shí)驗(yàn)內(nèi)容
(1) 創(chuàng)建數(shù)據(jù)庫(kù)及其表
(2)在 VB 6.0中查看數(shù)據(jù)庫(kù)對(duì)象
(3)設(shè)計(jì)窗體界面
(4)設(shè)計(jì)應(yīng)用程序代碼
(5)運(yùn)行
實(shí)驗(yàn)步驟
??? 1.創(chuàng)建數(shù)據(jù)庫(kù)及其表
??? 在 SQL Server中新建個(gè)人信息管理系統(tǒng)數(shù)據(jù)庫(kù)“PInformation”,創(chuàng)建該數(shù)據(jù)庫(kù)下的表Contacts、 ContactPhones、 Reminders。數(shù)據(jù)庫(kù)PInformation的表及其結(jié)構(gòu)如下:
(l)聯(lián)系人表(Contacts)。Contacts表的結(jié)構(gòu)如表l所示。
表1 Contacts表結(jié)構(gòu) 字段名 字段類型 主鍵 標(biāo)識(shí)列 說(shuō)明 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) 字段名 字段類型 主鍵 標(biāo)識(shí)列 說(shuō)明 ContactPhoneID Int √ √ 聯(lián)系人電話編號(hào) ContactID Int 聯(lián)系人編號(hào) PhoneType Varchar(50) 電話類型 PhoneNumber Varchar(50) 電話號(hào)碼
(3) 提示信息表(Reminders)。Reminders表結(jié)構(gòu)如表3所示:
表3 Reminders表結(jié)構(gòu) 字段名 字段類型 主鍵 標(biāo)識(shí)列 說(shuō)明 RemainderID Int √ √ 提示編號(hào) AlarmOn bit 報(bào)警標(biāo)志 AlarmTime Datetime 報(bào)警時(shí)間 ReminderNote Varchar(1000) 提示內(nèi)容
?? ?注意:定義為標(biāo)識(shí)列的字段的值是根據(jù) “種子”的值自動(dòng)生成的。
??? 在VB中也可創(chuàng)建數(shù)據(jù)庫(kù)的表,可自己試一試。
?? ?2.在 VB 6.0中查看數(shù)據(jù)庫(kù)對(duì)象
第1步? 新建工程“Projectl”,在? VB界面中,執(zhí)行“視圖”菜單的“數(shù)據(jù)視圖窗口”菜單項(xiàng),出現(xiàn)如圖l所示的界面。
圖1 VB中的數(shù)據(jù)窗口視圖
第2步 在圖.l所示的界面中,選中“數(shù)據(jù)鏈接”文件夾,單擊鼠標(biāo)石鍵,出現(xiàn)一快捷菜單,執(zhí)行菜單項(xiàng)“添加數(shù)據(jù)鏈接”,出現(xiàn)如圖2所示的界面。在“提供者”選項(xiàng)卡中選擇 OLE DB提供者為“Mcrosoft OLE DB ProVider for SQL Server”(或 Microsoft OLE DBPrOvider for ODBC Drivers)。
圖2 設(shè)置數(shù)據(jù)庫(kù)連接方式的“提供者”界面
第3步 在圖2所示的界面中,選擇“連接”選項(xiàng)卡,出現(xiàn)如圖3所示的界面,輸入“數(shù)據(jù)庫(kù)服務(wù)器名”、用戶登錄名、密碼及登錄的數(shù)據(jù)庫(kù)。
圖3 設(shè)置數(shù)據(jù)庫(kù)連接方式的“連接”界面
第4步 在圖3所示的界面中,選擇“確定”按鈕,出現(xiàn)如圖4所示的界面。從此界面中可看出,在數(shù)據(jù)窗口視圖中,新創(chuàng)建了一個(gè)數(shù)據(jù)鏈接“DataLink1”。在該數(shù)據(jù)鏈接上,通過(guò)相應(yīng)的快捷菜單可創(chuàng)建存儲(chǔ)過(guò)程和觸發(fā)器。
圖4 數(shù)據(jù)視圖窗口
? ??3.設(shè)計(jì)窗體界面
設(shè)計(jì)窗體界面,如圖5和圖6所示。
圖5 設(shè)計(jì)應(yīng)用程序主窗口form1
圖6 設(shè)計(jì)聯(lián)系人窗口form2
4.設(shè)計(jì)應(yīng)用程序代碼
(l)模塊Modulel的設(shè)計(jì)。
??????? Option Explicit
??????? Public SQLUserName As String?? '存放 SQL Server的用戶登錄賬號(hào)
??????? Public SQLPassword As String??? ’存放SQL Server的用戶登錄密碼
????? Public MyConnection As New ADODB.Connection'用于建立與數(shù)據(jù)庫(kù)的連接
(2)應(yīng)用程序主窗口forml的代碼設(shè)計(jì)。
主窗口forml的LOAD事件驅(qū)動(dòng)程序:
??????? Private Sub Form_Load()
???????? MyConnection.ConnctionString="driver={SQL Server};"_? ' 驅(qū)動(dòng)程序名
????????????? &"serve=dlgc-pooly1rw4;uid="&SQLUserName_ "服務(wù)器名及用戶登錄賬號(hào)
????????????? &";pwd="&SQLPassword&";"_????????????? '用戶登錄密碼
??????????????? &"database=Pinformation"??????????????? '連接的數(shù)據(jù)庫(kù)
??????????? MyConnection.Open?????????????????? '建立連接
??????????? End Sub
? 功能:加載主窗口 forml時(shí),通過(guò)代碼建立與數(shù)據(jù)庫(kù)Pinformation的連接。
“下一步”按鈕的Click事件驅(qū)動(dòng)程序:
??????? Private Sub COmmand1_Click()
????????????????? Form2.Show
??????????????? Unload Me
??????????? End Sub
? 功能:加載聯(lián)系人窗口 form2,卸載主窗口 forml。
(3)對(duì)Contacts表進(jìn)行操作的存儲(chǔ)過(guò)程的定義。
在 SQL Server中或通過(guò) VB的數(shù)據(jù)視圖窗口創(chuàng)建如下存儲(chǔ)過(guò)程:?? .
在 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)系人編號(hào)和姓名:
??????? 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表中對(duì)一條記錄進(jìn)行更改:
???? 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)對(duì) contactphones表進(jìn)行操作的存儲(chǔ)過(guò)程的定義。
在表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
????? 功能:當(dāng)用戶刪除一條聯(lián)系人記錄時(shí),通過(guò)該觸發(fā)器刪除該聯(lián)系人的所有電話號(hào)碼。
(6)聯(lián)系人窗口form2的代碼設(shè)計(jì)。
變量和子程序的定義:
????????? Option Explicit
????????? Private currentID As Long '存放當(dāng)前聯(lián)系人編號(hào)
??????????? Public Sub DisplayContact(ID2Use as long) '顯示一條聯(lián)索人的記錄
??????????????? Dim RSContact As ADODB.Recordset
????????????? Set RSContact= MyCOnnection.Execute("Exec ContactRecord"_
??????????????? &ID2Use)???? '調(diào)用 ContatReeord存儲(chǔ)過(guò)程
??????????????? 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)系人的電話號(hào)碼。
????????????????? End if
End Sub
?? 功能:如果存儲(chǔ)過(guò)程調(diào)用返回文件結(jié)束標(biāo)識(shí),則調(diào)用“清除”按鈕的CliCk程序,清除界面上的數(shù)據(jù),否則顯示一條記錄。
??????? Public Sub UpdateNameCombo()
????????????? Dim RSNames As ADODB.Recordset? ' 定義一記錄集變量
?????????????????????????????????????????????? ' 通過(guò)連接變量執(zhí)行存儲(chǔ)過(guò)程
????????????? 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存儲(chǔ)過(guò)程查詢聯(lián)系人姓名和編號(hào),然后加入到下拉列表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
??? 功能:通過(guò)調(diào)用存儲(chǔ)過(guò)程ContactPhoneLst,讀取聯(lián)系人對(duì)應(yīng)的電話號(hào)碼,然后將其加入列表框ListPhoneNumbers中。
form2各控件的事件驅(qū)動(dòng)程序:
????? Private Sub Cmbcontacts_click()????? ‘cmbcontacts下拉表 Click事件驅(qū)動(dòng)程序
DisplayContact Cmbcontact.ItemData(Cmbcontacts.ListIndex)
????? End Sub
??? 功能:調(diào)用DisplayContact子程序來(lái)顯示Cmbcontacts下拉表中被選項(xiàng)目對(duì)應(yīng)的記錄。
??????
?Private Sub Command1_Click()????????? ’聯(lián)系人添加按鈕的驅(qū)動(dòng)程序
????????????????? 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存儲(chǔ)過(guò)程,添加一條記錄至contactS表中,同時(shí),將該記錄聯(lián)系人編號(hào)和聯(lián)系人姓名加入Cmbeontacts下拉表中。
????????
Private Sub CommandZ_Click()????? ’聯(lián)系人修改按鈕的驅(qū)動(dòng)程序
??????????????????? 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ū)動(dòng)程序,添加一條記錄至contacts表,否則,調(diào)用存儲(chǔ)過(guò)程ContactUpdate對(duì)當(dāng)前聯(lián)系人的記錄進(jìn)行修改,最后將添加或修改記錄的聯(lián)系人編號(hào)和聯(lián)系人姓名加入Cmbcontacts下拉表中。
????????? Private Sub Command3_Click()????????? '聯(lián)系人刪除按鈕的事件驅(qū)動(dòng)程序
????????????? If currentID = 0 Then
?? Command4_Click
Else
?? MyConnection.Execute "Exec DeleteContact " & currentID
?? UpdateNameCombo
?? DisplayConcact 0
?End If
??????????? End Sub
??? 功能:調(diào)用存儲(chǔ)過(guò)程DeleteContact刪除當(dāng)前記錄,修改下拉表中的信息并在窗口顯示下一條信息。
??????? Private Sub Command4_Click() ’聯(lián)系人清除按鈕的事件驅(qū)動(dòng)程序
? currentID = 0
? Text2.Text = ""
? Text3.Text = ""
? Text4.Text = ""
? Text5.Text = ""
? Text6.Text = ""
??????? End Sub
? 功能:清除當(dāng)前窗口信息。
????
?Privite Sub Command5_ClicK()???? ’退出按鈕的 Click事件驅(qū)動(dòng)程序
??????????????? Unload Me
? End Sub
? 功能:卸載當(dāng)前窗口。
?Privite Sub Command7_Click()??? ’電話號(hào)碼”添加”按鈕 Click事件驅(qū)動(dòng)程序
???????? Dim PhoneType As String
?Dim PhoneNumber As String
?If currentID = 0 Then
??????? MsgBox "優(yōu)保存當(dāng)前記錄,然后擇一個(gè)已存在的聯(lián)系人記錄添加電話號(hào)碼"
Else
??? PhoneType = InputBox("輸入電話類型:")
??? PhoneNumber = InputBox("輸入新電話號(hào)碼:")
??? If PhoneType <> "" And PhoneNumber <> "" Then
?????? MyConnection.Execute "Exec ContactPhoneAdd " & currentID & "," & "'" & PhoneType & " ," & "'" & PhoneNumber & "'"
?????? DispaysPhoneList
??? End If
End If
End Sub
? 功能:對(duì)于一個(gè)已存儲(chǔ)的聯(lián)系人記錄添加電話號(hào)碼有關(guān)的信息。
??
Private Sub Conmand8_click()???????? ’電話號(hào)碼’刪除”按鈕 Click事件驅(qū)動(dòng)程序
? If LStphneNumbers.ListIndex = -1 Then
????? MsgBox "優(yōu)選中需刪除的號(hào)碼,然后單擊刪除按鈕"
Else
??? MyConnection.Execute "Exec ContactPhoneDelete " & lstPhoneNumber.ItemData(lstPhoneNumber.ListIndex)
??? DisplayPhoneList
End If
End sub
? 功能:對(duì)于一個(gè)已存儲(chǔ)的聯(lián)系人記錄刪除一條電話號(hào)碼記錄。
?Private Sub Form_Load()???????? 'form2的加載程序
????????????? DisPlayContact? 0
????????????? UpdateNameCombo
???? End Sub
功能:調(diào)用于程序DisplayContact顯示contacts表中第一條記錄,然后調(diào)用UpdateNameCombo將contacts表中記錄聯(lián)系人編號(hào)和聯(lián)系人姓名加入Cmbcontacts下拉表。
? ??4. 運(yùn)行
運(yùn)行結(jié)果如圖7和圖8所示。
圖7 應(yīng)用程序的主窗口form1
圖8 應(yīng)用程序運(yùn)行的聯(lián)系人窗口form2
???
項(xiàng)目2? 創(chuàng)建數(shù)據(jù)庫(kù)數(shù)據(jù)報(bào)表
目的與要求
掌握在 VB 6.0中利用 SQL Server數(shù)據(jù)庫(kù)數(shù)據(jù)創(chuàng)建報(bào)表的方法。
實(shí)驗(yàn)內(nèi)容
在實(shí)驗(yàn)6項(xiàng)目1的基礎(chǔ)上通過(guò)報(bào)表列出聯(lián)系人的詳細(xì)信息。
(1)添加數(shù)據(jù)環(huán)境設(shè)計(jì)器和數(shù)據(jù)報(bào)表設(shè)計(jì)器
(2)編寫(xiě)程序代碼
(3)運(yùn)行
實(shí)驗(yàn)步驟
?? ?1.添加數(shù)據(jù)環(huán)境設(shè)計(jì)器和數(shù)據(jù)報(bào)表設(shè)計(jì)器
??? 第1步 在實(shí)驗(yàn)6項(xiàng)目1的基礎(chǔ)上添加數(shù)據(jù)環(huán)境設(shè)計(jì)器DataEnvironmentl,并對(duì)該環(huán)境設(shè)計(jì)器下的連接對(duì)象Connectionl設(shè)置連接屬性如下:
??? (l)連接數(shù)據(jù)庫(kù)的驅(qū)動(dòng)程序:?? Microsoft OLE DB Provider for SQL Server;
??? (2)連接數(shù)據(jù)庫(kù): Rinformation;
??? (3)登錄方式:?? SQL Server認(rèn)證方式;
??? (4)登錄賬號(hào):sa(系統(tǒng)管理員)。
??? 第2步 在Connectionl下添加Connnandl命令對(duì)象,并對(duì)Conunandl設(shè)置關(guān)聯(lián)的數(shù)據(jù)庫(kù)對(duì)象為dbo.Contactreport存儲(chǔ)過(guò)程,再設(shè)置分組選項(xiàng)卡的各項(xiàng)參數(shù),如圖9和圖10所示。
?
圖9 命令對(duì)象“通用”選項(xiàng)卡
圖10 命令對(duì)象“分組”選項(xiàng)卡
?第3步 在工程中添加數(shù)據(jù)報(bào)表設(shè)計(jì)器,將Commandl命令對(duì)象的各字段拖放到數(shù)據(jù)報(bào)表設(shè)計(jì)器,并根據(jù)需要做相應(yīng)的修改。數(shù)據(jù)報(bào)表設(shè)計(jì)器如圖11所示。
圖11? 數(shù)據(jù)報(bào)表設(shè)計(jì)器
??? 2.程序代碼
??? (l)對(duì)數(shù)據(jù)庫(kù)Pinformation創(chuàng)建下列存儲(chǔ)過(guò)程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
??? 功能:通過(guò)連接操作在 contacts 和 contactphones表中檢索聯(lián)系人的信息。
??? (2)對(duì)圖16所示界面中的“報(bào)表”按鈕的Click事件添加驅(qū)動(dòng)程序。
????????? Private Sub Command6_Click()
????????????? DataEnvironment1.Commands(1).Parameters(1).value=currentID
????????????? DataReport1.Show 1
???????????? set DataEnvironment1=nothing
??????????? End Sub
??? 功能:當(dāng)用戶單擊“報(bào)表”按鈕,則顯示當(dāng)前聯(lián)系人的所有信息。在此,數(shù)據(jù)報(bào)表使用Comnmand1對(duì)象調(diào)用存儲(chǔ)過(guò)程contactreport時(shí)需將currentID作為入口參數(shù),以顯示正確的記錄,因此有語(yǔ)句:?? DataEnvironmentl.Commands(1).Parameters(1).value=currentID
??? 當(dāng)用戶關(guān)閉報(bào)表時(shí)通過(guò)語(yǔ)句 Set DataEnvironment1= Nothing釋放所有資源。
3.運(yùn)行
運(yùn)行結(jié)果如圖12所示。
圖12 數(shù)據(jù)報(bào)表顯示結(jié)果
項(xiàng)目3?? 數(shù)據(jù)庫(kù)視圖應(yīng)用
實(shí)驗(yàn)?zāi)康?/p>
??? 掌握 SQL Server數(shù)據(jù)庫(kù)視圖的應(yīng)用方法。
實(shí)驗(yàn)內(nèi)容
在實(shí)驗(yàn)6項(xiàng)目2的基礎(chǔ)上增加提示信息功能。
(1)界面設(shè)計(jì)
(2)添加命令對(duì)象和數(shù)據(jù)報(bào)表設(shè)計(jì)器
(3)代碼設(shè)計(jì)
(4)運(yùn)行
實(shí)驗(yàn)步驟
??? 在實(shí)驗(yàn)6項(xiàng)目2的基礎(chǔ)上增加提示信息功能。
??? 1.界面設(shè)計(jì)
添加功能選擇窗口 form4,并添加相應(yīng)的控件,如圖13所示。在此界面中加入了一計(jì)時(shí)器控件,用于定時(shí)顯示提示信息。添加信息提示窗口 form5,如圖 14所示。
圖13 功能選項(xiàng)窗口form4
圖14 提示信息窗口form5
??????? 將實(shí)驗(yàn)6中聯(lián)系人窗口form2如圖6所示)的“退出”按鈕改為“返回”按鈕。
??? 2.添加命令對(duì)象和數(shù)據(jù)報(bào)表設(shè)計(jì)器
在數(shù)據(jù)環(huán)境設(shè)計(jì)器DataEnvironment1的連接對(duì)象Connection1下添加命令對(duì)象Command2,并設(shè)置其屬性(關(guān)聯(lián)的數(shù)據(jù)庫(kù)對(duì)象為視圖VIEW2),如圖15所示。
圖15 命令對(duì)象command2的屬性設(shè)置
在工程中添加數(shù)據(jù)報(bào)表設(shè)計(jì)器DataRport2,并將數(shù)據(jù)環(huán)境設(shè)計(jì)器中命令對(duì)象Command2的各字段拖放至報(bào)表設(shè)計(jì)器DataReport2中,如圖 16所示。
圖16 數(shù)據(jù)報(bào)表設(shè)計(jì)器窗口
?3.代碼設(shè)計(jì)。
??? (l)存儲(chǔ)過(guò)程定義。
在 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表中查詢提示信息編號(hào)和提示信息的前15個(gè)字符:
???????? 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的代碼同實(shí)習(xí)? 1項(xiàng)目? 1的代碼?!?/p>
? (4)主窗口 form1及控件的代碼。
主窗口裝載程序:
? Private Sub Form_Load():同實(shí)習(xí) 1項(xiàng)目? l的代碼。
“下一步”按鈕的Click事件驅(qū)動(dòng)程序:
Private Sub command 1_Click()
????????????? Form4.Show
????????????? Unload Me
??????? End sub
? (5)功能選擇窗口form及控件代碼。
TimAlarms計(jì)時(shí)器Timer事件驅(qū)動(dòng)程序:
????? 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
??? 功能:通過(guò)Recordset對(duì)象打開(kāi)視圖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ū)動(dòng)程序:
????????? Private sub Command5_CliCk()
??????????????? Form4.Show
??????????????????? Unload Me
??????????? end sub
其余同實(shí)習(xí)回項(xiàng)目1的代碼。
??? (7)“提示信息”窗口 form5及控件的代碼。
變量及子程序的定義:
Option Explicit
Private currentID As Long?? '存放當(dāng)前的提示信息編號(hào)
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ū)動(dòng)程序:
? Private sub chkAlarmON_Click()
??????? ???If chkAlarmOn.Value = 1 Then
?????? ChkAlarmOn.Value = 0
? End If
? End Sub
下拉表cmbRemainders的Click事件驅(qū)動(dòng)程序:
? Private Sub cmbReminders_Click()
????? DisplayReminder CmbReminders.itemData(cmbRemainders.ListIndex)
? emd sub
提示信息“添加”按鈕cmdAdd的click事件驅(qū)動(dòng)程序:
? 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ū)動(dòng)程序:
????????? Private Sub cmdClear_Click()
????????????? currentID= 0
????????????? chkALarmOn.Value=0
????????????? tXtAlarmTime.Text=""
????????????? txtReminderNote.text=""
??????????? End Sub
提示信息“返回”按鈕cmdclose的click事件驅(qū)動(dòng)程序:
????????? Private Sub cmdClose_Click()
??????????????? Form4.Show
??????????????? Unload Me
????????? End Sub
?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????
.提示信息“刪除”按鈕cmdDelete的Click事件驅(qū)動(dòng)程序:
????????? 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ū)動(dòng)程序:
??????????? 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
提示信息“報(bào)表”按鈕cmdwViewReport的Click事件驅(qū)動(dòng)程序:
????? Private Sub cmdViewReport_Click()
????????? DataReport2.Show 1
????????????? Set DataEnvironment1= Nothing
??????? End Sub
.提示信息窗口Load事件的驅(qū)動(dòng)程序:
????? Private Sub Form_Load()
?????????? DisplayReminder 0
?????????? UpdateRemindercombo
??????? End Sub
4 運(yùn)行
運(yùn)行結(jié)果如圖17~22所示。
圖17 主窗口界面 圖18 功能選擇窗口
圖19 “聯(lián)系人”窗口
圖20 提示信息窗口
圖21 “聯(lián)系人”報(bào)表
圖22 提示信息報(bào)表
實(shí)驗(yàn)6? PB商品信息管理系統(tǒng)
開(kāi)發(fā)商品信息管理程序,用于對(duì)Goods數(shù)據(jù)庫(kù)進(jìn)行操作,實(shí)現(xiàn)商品信息管理。
商品信息管理系統(tǒng)數(shù)據(jù)庫(kù)(Goods)包含的表及其結(jié)構(gòu)如下:
(l)商品分類表(Gclass)。Gclass表結(jié)構(gòu)如表1所示。
????????????????????????????????? 表 1???? Gclass表結(jié)構(gòu)
字段名 字段類型 主鍵 標(biāo)識(shí)列 說(shuō)明 ClassID Int √ √ 商品分類編號(hào) clname Varchar(20) 商品分類名稱
(2)商品品牌表(Gbrand)。Gbrand表結(jié)構(gòu)如表2所示。
??????????????????????????????? 表2???? Gbrand表結(jié)構(gòu)
字段名 字段類型 主鍵 標(biāo)識(shí)列 說(shuō)明 BrandID Int √ √ 品牌編號(hào) Brname Varchar(50) 品牌名稱 Place Varchar(50) 產(chǎn)品
(3)商品信息表(Gdetails)。Gdetails表結(jié)構(gòu)如表3所示。
??????????????????????????????? 表 3?? Gdetails表結(jié)構(gòu)
字段名 字段類型 主鍵 標(biāo)識(shí)列 說(shuō)明 GoodsID Int √ √ 商品編號(hào) Gname Varchar(20) 商品名稱 ClassID Int 分類編號(hào) BrandID Int 品牌編號(hào) Type1 Varchar(20) 型號(hào) Price Double 單價(jià) Num Int 商品數(shù)量 Information Varchar(500) 商品簡(jiǎn)介
注意:定義為標(biāo)識(shí)列的字段的值是根據(jù)‘種子”的值自動(dòng)生成的。
項(xiàng)目1? 連接數(shù)據(jù)庫(kù)及調(diào)用存儲(chǔ)過(guò)程、觸發(fā)器
實(shí)驗(yàn)?zāi)康?/p>
(l)掌握對(duì)表中標(biāo)識(shí)列數(shù)據(jù)的使用方法。
(2)掌握在PB中調(diào)用 SQL Server數(shù)據(jù)庫(kù)存儲(chǔ)過(guò)程的方法。
(3)掌握在PB中通過(guò)游標(biāo)訪問(wèn) SQL Server數(shù)據(jù)庫(kù)的方法。
(4)掌握 SQL Server數(shù)據(jù)庫(kù)中觸發(fā)器的使用。
實(shí)驗(yàn)內(nèi)容
(1)根據(jù)表 1~3,在 SQL Server中創(chuàng)建數(shù)據(jù)庫(kù) Goods及其表。
(2)在PB中建立數(shù)據(jù)庫(kù)Goods的配置文件文件myfile2,并導(dǎo)出初始化文件myfile2.ini。
(3)在PB中創(chuàng)建應(yīng)用對(duì)象及應(yīng)用程序界面。
(4)程序代碼設(shè)計(jì)。
實(shí)驗(yàn)步驟
第 1步 根據(jù)表 1~3,在 SQL Server中創(chuàng)建數(shù)據(jù)庫(kù) Goods及其表。
注意:要使各表字段類型與PB支持的數(shù)據(jù)類型相容。
第2步 在PB中建立數(shù)據(jù)庫(kù)Goods的配置文件文件myfile2,并導(dǎo)出初始化文件myfile2.ini。
第3步 在PB中創(chuàng)建應(yīng)用對(duì)象及應(yīng)用程序界面,如圖1和圖2所示。
圖 1? 應(yīng)用程序主窗口w_l
圖 2? 商品信息窗口w_2
第4步 程序代碼設(shè)計(jì)。
1.在 SQL Server中設(shè)計(jì)如下存儲(chǔ)過(guò)程和觸發(fā)器
對(duì)Gclass表進(jìn)行插入的存儲(chǔ)過(guò)程:
CREATE PROCEDURE INSER (@str1 varchar(20))
AS? begin
? insert into gclass(clname) Values(@str1)
end
注意:對(duì)含有標(biāo)識(shí)列的表插入記錄時(shí),標(biāo)識(shí)列字段的值是自動(dòng)生成的。
功能:根據(jù)輸人參數(shù)傳遞的類別名,在Gclass表插入一條記錄。
對(duì)Gclass表進(jìn)行刪除的存儲(chǔ)過(guò)程:
??? Create procedure dele(@id integer)
????? As
??? begin
????????? delete from gclass? where ClassID=@id
????? end
??? return
功能:根據(jù)輸入?yún)?shù)傳遞的類別編號(hào),在Gclass表刪除一記錄。
對(duì)Gclass表進(jìn)行修改的存儲(chǔ)過(guò)程:
??? CREATE PROCEDURE updateclass
????????? @str1 varchar(20),@str2 varchar(20)
???????? AS
????????? begin
??????????? update gclass set clname=@str2? where clname=@str1
????????? end
?功能:修改當(dāng)前記錄的類別名。
對(duì)表Gclass進(jìn)行刪除時(shí)使用的觸發(fā)器:
??????????? CREATE trigger? deleclass ON [dbo].[Gclass]
????????????? FOR DELETE
????????????? AS
?????????????? begin
??????????????????? delete from? Gdetails
??????????????????? Where? classID=(select classid? from deleted)
????????????? end
功能:為了保證數(shù)據(jù)的完整性,當(dāng)刪除Gclass表中一條記錄時(shí),同時(shí)刪除 Gdetails表中的對(duì)應(yīng)記錄。
類似地,可以對(duì)Gbrand表添加插入、修改、刪除的存儲(chǔ)過(guò)程和刪除觸發(fā)器。請(qǐng)學(xué)生們自己做出來(lái)。
對(duì)GdetailS表進(jìn)行插入的存儲(chǔ)過(guò)程:
??? 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ù)指定的商品類別編號(hào)、品牌編號(hào)、名稱、型號(hào)、價(jià)格、數(shù)量,在Gdetails
表中插入一條記錄。
對(duì)Gdetails表進(jìn)行修改的存儲(chǔ)過(guò)程:
?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ù)指定的商品類別編號(hào)、品牌編號(hào)、商品編號(hào)。修改Gdetails表中對(duì)應(yīng)記錄的商品名稱、型號(hào)、價(jià)格和數(shù)量。
對(duì)Gdetails表進(jìn)行刪除的存儲(chǔ)過(guò)程:
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ù)指定的商品類別編號(hào)、品牌編號(hào)、商品編號(hào),刪除Gdetails表中的對(duì)應(yīng)記錄。
??? 2.應(yīng)用對(duì)象open事件的程序代碼
????????? Open(w_1)
??? 3.定義全局變量
??????? int id,id1,id2??????????? //分別存放商品類別編號(hào)、商品品牌編號(hào)和商品編號(hào)
declare st cursor for????? //定義游標(biāo),以便讀取 Gclass表的數(shù)據(jù)
? ????select? Clname,ClassID
???????? from Gclass
???????? ORDER BY ClassID ASC;
declare st1 cursor? for????? //定義游標(biāo),以便讀取 Gbrad表的數(shù)據(jù)
??? select Brname,place,BrandID? from Gbrand
??????? ORDER BY BrandID ASC;
declare? st2? cursor? for? //定義游標(biāo),以便讀取 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)用程序主窗口“進(jìn)入系統(tǒng)”按鈕cb_1的click事件驅(qū)動(dòng)代碼
?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ù)對(duì)象sqlca的屬性賦值,并通過(guò)Sqlca全局事務(wù)對(duì)象建立與數(shù)據(jù)庫(kù)的連接,然后進(jìn)入商品信息窗口。
??? 5.商品信息窗口的程序代碼
商品信息窗口w_2的Open事件驅(qū)動(dòng)代碼:
??????? string str,place
??????? int itm=1
??????? ddlb_1.reset()????????????????? //清除下拉框ddlb_1中的內(nèi)容
??????? Open st;????????????????? //打開(kāi)游標(biāo)
??????? feteh st into :sir,:id;???????? //通過(guò)游標(biāo) 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)打開(kāi)游標(biāo)st, 通過(guò)游標(biāo)獲取Gclass表記錄,并將clname字段的值加入下拉表ddlb_1中。
(2)打開(kāi)游標(biāo)stl,通過(guò)游標(biāo)獲取Gbrand表記錄,并將Clname字段的值加入下拉表ddlb_1中。
(3)打開(kāi)游標(biāo)st2,為GdetailS表記錄的讀取做準(zhǔn)備。
“添加類別”按鈕cb_1的Click事件驅(qū)動(dòng)程序:
?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("類型","請(qǐng)輸入新類型名稱!")
?end if
?if str="" and pclass.text<>"" then
??? declare inser1 procedure for inser @str1=:pclass.text;????? //聲明 inserl存儲(chǔ)過(guò)程
??? execute inser1;//通過(guò)inser1調(diào)用存儲(chǔ)過(guò)程 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中是否已有,若沒(méi)有,且編輯框的內(nèi)容不為空,則將新類別插入表中,然后再將表中各記錄的clname字段值加入下拉表(在此之前,下拉表應(yīng)清空)。
“刪除類別”按鈕cb_2的click事件驅(qū)動(dòng)程序:
?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存儲(chǔ)過(guò)程??
?? execute dele1;?????????? //通過(guò)dele1調(diào)用存儲(chǔ)過(guò)程dele
?? n=ddlb_1.finditem(ddlb_1.text,1)
?? ddlb_1.deleteitem(n)
?? ddlb_1.text=ddlb_1.text(1)
end if
??? 功能:若要?jiǎng)h除下拉表中當(dāng)前選中的一個(gè)類別項(xiàng),則首先根據(jù)該類別名,從Gclass表中獲取其對(duì)應(yīng)的類別編號(hào),然后調(diào)用存儲(chǔ)過(guò)程dele1來(lái)刪除該類別編號(hào)對(duì)應(yīng)的記錄。
“修改類別”按鈕cb_3的Click事件驅(qū)動(dòng)程序:
?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存儲(chǔ)過(guò)程
???? execute updateclass;????????? //調(diào)用存儲(chǔ)過(guò)程
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=""
????? 功能:當(dāng)編輯框pclass1的內(nèi)容不為空時(shí),則用該內(nèi)容修改表中對(duì)應(yīng)記錄的內(nèi)容,然后再將表中各記錄clname字段值加入下拉表(在此之前,下拉表應(yīng)清空)。
下拉表ddlb_1的 selectionchanged事件驅(qū)動(dòng)程序:
?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ù)當(dāng)前用戶選中的商品類別和品牌,通過(guò)st2 游標(biāo)讀取對(duì)應(yīng)的商品信息記錄。
類似地,可以寫(xiě)出插入、修改、刪除按鈕的click事件驅(qū)動(dòng)程序和下拉表ddlb_2的 selectionchanged事件驅(qū)動(dòng)程序。請(qǐng)學(xué)生們自己做出來(lái)。
商品信息”下一記錄”按鈕Cb_4的Click事件驅(qū)動(dòng)代碼:
?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顯示商品型號(hào)的單行編輯框
??? Pprice.text=string(price)??????? //pname顯示商品價(jià)格的單行編輯框
??? pnum.text=string(num)???????? //pnameo顯示商品數(shù)量的單行編輯框
??? pinfor.text=vinformation???????? // pname顯示商品簡(jiǎn)介的多行編輯框
?end if
功能:通過(guò)St2讀取GdetailS表中數(shù)據(jù),顯示至界面。
商品信息”上一記錄”按鈕cb_5的click事件驅(qū)動(dòng)代碼:
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ū)動(dòng)代碼:
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ù)當(dāng)前下拉表ddlb_1中選擇的商品類別名,ddlb_2選擇的商品品牌查詢其對(duì)應(yīng)的
??? //類別編號(hào)和品牌編號(hào)
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? //聲明存儲(chǔ)過(guò)程 Ginsert
????????? @Gname=:pname.text,@classID=:id,@brandID=:id1,@type1=:ptype.text,
????????? @price=:vprice,@num=:vnum,@information=:pinfor.text;
?? execute Ginsert1;?? //通過(guò) Ginsert1調(diào)用存儲(chǔ)過(guò)程Ginsert
?? close st2;÷
?? Open st2;
end if
????? 功能:商品信息的添加是一個(gè)多表操作的問(wèn)題,首先根據(jù)用戶在下拉表ddlb_1中選擇的商品類別和在下拉表ddlb_2中選擇的商品品牌,在表Gclass、Gbrans中查詢其對(duì)應(yīng)的編號(hào), 然后根據(jù)編號(hào)和用戶輸入的商品信息調(diào)用存儲(chǔ)過(guò)程Ginsert,在表Gdetails中插入一條記錄。
商品信息”刪除”按鈕cb_6的Click事件驅(qū)動(dòng)代碼:
??? 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;
? //聲明存儲(chǔ)過(guò)程 Gdelete
???? execute Gdelete1;//通過(guò) Gdelete1調(diào)用存儲(chǔ)過(guò)程 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
????? 功能:商品信息的刪除也是一個(gè)多表操作的問(wèn)題,首先根據(jù)用戶在下拉表ddlb_1中選擇的商品類別和在下拉表ddlb_2中選擇的商品品牌,在表Gclass、Gbrand中查詢其對(duì)應(yīng)的編號(hào),然后根據(jù)編號(hào)和當(dāng)前商品信息編號(hào)調(diào)用存儲(chǔ)過(guò)程Gdelete,在表Gdetails中刪除對(duì)應(yīng)記錄。
商品信息”修改”按鈕cb_7的Click事件驅(qū)動(dòng)代碼。
?????? 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;
???? 功能:略。
項(xiàng)目2:數(shù)據(jù)窗口的使用
實(shí)驗(yàn)?zāi)康模?/p>
掌握PB中數(shù)據(jù)窗口和數(shù)據(jù)窗口控件的使用。
實(shí)驗(yàn)內(nèi)容:
(1)創(chuàng)建數(shù)據(jù)窗口。
?(2)創(chuàng)建數(shù)據(jù)窗口控件。
(3)數(shù)據(jù)窗口控件的使用。
實(shí)驗(yàn)步驟:
1.通過(guò)DataBase Profiles建立數(shù)據(jù)庫(kù)連接
2.創(chuàng)建商品類別的數(shù)據(jù)窗口。
New—DataWindow—Grid—Ok—Quick Select—Next(如圖1),選擇表Gclass,然后點(diǎn)擊Add All選擇它的兩個(gè)字段。依次點(diǎn)擊OK,Next,F(xiàn)inish。如圖2所示
?
圖1?????????????????????????????????????? 圖2
保存為dw_gclass.
(2) 同樣為表Gdetails建立一個(gè)數(shù)據(jù)窗口dw_gdetails.
(3) 建立一個(gè)窗口(window)命名為w_showclass,點(diǎn)擊數(shù)據(jù)窗口控件按鈕(如圖3),建立一個(gè)數(shù)據(jù)窗口對(duì)象dw_1,設(shè)置其DataObject屬性為dw_gclass,設(shè)置VscrollBar為checked。同樣建立一個(gè)數(shù)據(jù)窗口對(duì)象dw_2, 設(shè)置其DataObject屬性為dw_gdetails,設(shè)置VscrollBar為checked,HscrollBar為checked。
(4) 雙擊窗口的空白區(qū)域,在代碼窗口輸入如下代碼
dw_1.settransobject(sqlca)? //設(shè)置事務(wù)為當(dāng)前默認(rèn)事務(wù)
dw_1.retrieve()???????????? //檢索數(shù)據(jù)填入數(shù)據(jù)窗口對(duì)象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事件中,將語(yǔ)句 open(w_2)改為 open(w_showclass)。
運(yùn)行程序,如下圖所示點(diǎn)擊上面的類別。
圖3
3.?dāng)?shù)據(jù)修改:
在上述窗口上添加如下圖的按鈕。
圖4
在“添加”按鈕的clicked事件中添加如下代碼:
int iRow
iRow=dw_2.InsertRow(0) ??//最后行插入
dw_2.ScrollToRow(iRow)? //滾到新插入的行
dw_2.setfocus()?? //設(shè)置dw_2得到焦點(diǎn)
在“刪除”按鈕的clicked事件中添加如下代碼:
dw_2.deleteRow(dw_2.getSelectedRow(0))
在“保存”按鈕的clicked事件中添加如下代碼:??
dw_2.update()
在“保存”按鈕的clicked事件中添加如下代碼:??
dw_2.ResetUpdate()
dw_2.retrieve()
思考與練習(xí):
為品牌(gbrand)建立類似的數(shù)據(jù)窗口。將上述四個(gè)按鈕同時(shí)作用于上下兩個(gè)數(shù)據(jù)窗口對(duì)象,即當(dāng)在上面的數(shù)據(jù)窗口中操作時(shí),按“插入”可增加一個(gè)商品類別,其余類似。
提示:設(shè)置一個(gè)Instance Variable(實(shí)例變量)來(lái)標(biāo)志當(dāng)前活動(dòng)的數(shù)據(jù)窗口對(duì)象,在兩個(gè)窗口對(duì)象的getfocus事件中設(shè)置該變量的值。
實(shí)驗(yàn)7? ASP通用人事管理系統(tǒng)。
??? 實(shí)驗(yàn)7 所設(shè)計(jì)的通用人事管理系統(tǒng)是將Web技術(shù)與數(shù)據(jù)庫(kù)結(jié)合,將人事信息存儲(chǔ)在數(shù)據(jù)庫(kù)系統(tǒng)中,通過(guò)動(dòng)態(tài)Web界面訪問(wèn)數(shù)據(jù)庫(kù)服務(wù)器。系統(tǒng)提供信息測(cè)覽、查詢、添加、更新和刪除功能。系統(tǒng)的層次結(jié)構(gòu)如圖1所示。
??
??????????????????????????? 圖1通用人事管理系統(tǒng)的層次結(jié)構(gòu)
項(xiàng)目1? 數(shù)據(jù)庫(kù)的設(shè)計(jì)
實(shí)驗(yàn)?zāi)康?/p>
?? (l)掌握在 SQL Server中創(chuàng)建數(shù)據(jù)庫(kù)、表的方法。
(2)掌握在ASP中訪問(wèn)數(shù)據(jù)庫(kù)的用戶設(shè)置方法。
(3)掌握在 SQL Server中創(chuàng)建存儲(chǔ)過(guò)程的方法。。
(4) 掌握在ASP中建立數(shù)據(jù)庫(kù)連接及調(diào)用存儲(chǔ)過(guò)程對(duì)表數(shù)據(jù)進(jìn)行操作的方法。
實(shí)驗(yàn)內(nèi)容
(1)設(shè)計(jì)4個(gè)表PERSONEL、DEPART、WORK和USERS,分別存儲(chǔ)入的基本信息、單位情況、人的工作信息和系統(tǒng)用戶信息,數(shù)據(jù)庫(kù)名定為PERSON。
(2)建立登錄名和用戶,并且設(shè)置權(quán)限。
(3)創(chuàng)建檢查用戶的存儲(chǔ)過(guò)程。
(4)設(shè)計(jì)用戶登錄ASP程序。
(5)配置IIS服務(wù)器和主目錄。
(6)程序運(yùn)行。
實(shí)驗(yàn)步驟
?? 1. 通用人事管理系統(tǒng)設(shè)計(jì)4個(gè)表PERSONEL、DEPART、WORK和USERS,分別存儲(chǔ)入的基本信息、單位情況、人的工作信息和系統(tǒng)用戶信息,數(shù)據(jù)庫(kù)名定為PERSON。這4個(gè)表的結(jié)構(gòu)分別如表1~表4所示。???
表 1??? PERSONEL表結(jié)構(gòu)
字段名 數(shù)據(jù)類型 是否可取空值 說(shuō)明 身份證號(hào) char(18) 否 主鍵 姓名 Varchar(20) 否 性別 Bit 否 出生年月 Smalldatetime 否 籍貫 Varchar(20) 否 民族 Varchar(10) 否 地址 Varchar(30) 否 電話 Varchar(12) 是
?????????????????????????? 表2 DEPART表結(jié)構(gòu)
字段名 數(shù)據(jù)類型 是否可取空值 說(shuō)明 部門(mén)號(hào) char(6) 否 主鍵 部門(mén)名 Varchar(30) 否 地址 Varchar(30) 是 電話 Char(12) 是 傳真 char(12) 是 說(shuō)明 Varchar(10) 是
表 3???? WORK表結(jié)構(gòu)
字段名 數(shù)據(jù)類型 是否可取空值 說(shuō)明 身份證號(hào) char(18) 否 主鍵 姓名 Varchar(20) 否 部門(mén)號(hào) Char(6) 否 職稱 Char(10) 是 職務(wù) char(10) 是 工作時(shí)間 Smalldatetime 否 特長(zhǎng) Varchar(50) 是 獎(jiǎng)懲記錄 Text 是 基本工資 real 否
表4 USERS表結(jié)構(gòu)
字段名 數(shù)據(jù)類型 是否可取空值 說(shuō)明 UserID char(18) 否 主鍵,用戶登錄名 Passwd Varchar(20) 否 口令 Authority Bit 否 0:只讀,1:只寫(xiě),2:讀寫(xiě)
? 2.按第2章介紹的方法創(chuàng)建PERSON數(shù)據(jù)庫(kù)和上述4個(gè)表。另外,在Web頁(yè)面中對(duì)該數(shù)據(jù)庫(kù)的訪問(wèn)使用一個(gè)特定的用戶person_user,在”安全性”文件夾的”登錄”項(xiàng)中通過(guò)”新建登錄”創(chuàng)建該用戶,并設(shè)置數(shù)據(jù)庫(kù)訪問(wèn)權(quán)限(如圖2所示)。因需要通過(guò)Web向數(shù)據(jù)庫(kù)寫(xiě)入記錄,故將person_user設(shè)置為此db_owner角色。
圖2創(chuàng)建新用戶person_user
3.創(chuàng)建存儲(chǔ)過(guò)程check_user。當(dāng)用戶要使用人事管理系統(tǒng)時(shí),首先要登錄,通過(guò)身份認(rèn)證。用戶登錄程序文件是login.a(chǎn)sp,它通過(guò)表單接收用戶輸入的用戶名和口令,查詢USERS表中是否有該用戶且口令是否正確。用戶身份認(rèn)證可定義為PERSON數(shù)據(jù)庫(kù)的存儲(chǔ)過(guò)程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
??? 存儲(chǔ)過(guò)程check_user執(zhí)行的操作是:若參數(shù)指定的用戶名已存在,并且四個(gè)正確,則返回該用戶的權(quán)限(大于或等于0)。
4.設(shè)計(jì)用戶登錄ASP程序。Login.asp程序如下:
??
<%'讀取各輸入框中的數(shù)據(jù)
usr_name=Request("usrname")
passwd=Request("pass")
IF usr_name="" then
? Response.Write "
請(qǐng)輸入用戶名和密碼!
"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對(duì)象
? Set cmd.ActiveConnection=cn??? '設(shè)置command對(duì)象使用的連接
? cmd.CommandType= adCmdstoredProc
? cmd.CommandText="check_user"?? '指定Command對(duì)象執(zhí)行的存儲(chǔ)過(guò)程
? 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í)行存儲(chǔ)過(guò)程, 得到結(jié)果集
? have_it=cmd("@haveit")
? IF have_it>=0 then??? '用戶名和密碼正確
???? Response.Redirect "sc.htm"?? '進(jìn)入人事管理系統(tǒng)主界面
? ELSE?????????? '表中沒(méi)有用戶輸入的用戶名或密碼錯(cuò)
???? Response.Redirect "relogin.htm"?? '重新登錄
? END IF
END IF??
%>
?
?
![]() | ![]() ?? width=200 height=60> |
該程序運(yùn)行后生成的用戶登錄界面如圖3所示。若通過(guò)了身份驗(yàn)證, 則進(jìn)入人事信息管理系統(tǒng)的主界面, 如圖4所示(注:sc.htm頁(yè)面目前尚為設(shè)計(jì),實(shí)際上當(dāng)?shù)卿洺晒髮@示找不到頁(yè)面sc.htm)。
圖3通用人事管理系統(tǒng)登錄界面
圖4人事信息管理系統(tǒng)的主界面
項(xiàng)目2? 數(shù)據(jù)測(cè)覽和查詢程序設(shè)計(jì)? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
實(shí)驗(yàn)?zāi)康?/p>
????? (l)掌握在 ASP中對(duì) SQL Server數(shù)據(jù)庫(kù)進(jìn)行瀏覽的方法。
????? (2)掌握在 ASP中對(duì) SQL Server數(shù)據(jù)庫(kù)進(jìn)行查詢的方法。? ? ? ? ? ? ? ? ? ? ?
實(shí)驗(yàn)內(nèi)容
(1)設(shè)計(jì)顯示結(jié)果集中的指定頁(yè)的ASP程序。
(2)設(shè)計(jì)瀏覽用戶自然信息ASP程序。
(3)設(shè)計(jì)數(shù)據(jù)查詢程序。
實(shí)驗(yàn)步驟
??? 數(shù)據(jù)測(cè)覽程序包括瀏覽用戶的基本信息和工作信息兩個(gè)程序, 它們建立與數(shù)據(jù)庫(kù)Personel的連接或利用Session保存的連接和結(jié)果信息, 查詢相應(yīng)的表, 返回結(jié)果集并分頁(yè)顯示。將顯示結(jié)果集中的一頁(yè)的過(guò)程ShowPage存在文件showpape.asp中, 以供共享。
??? (l)設(shè)計(jì)顯示結(jié)果集中的指定頁(yè)的ASP程序showpage.asp。
<%
Sub ShowPage(rs,Page) '顯示結(jié)果集中的一頁(yè)
??? Response.Write "
" & rs.Fields(i).Name &" | "
" & rs.Fields(j).Value &" | "
End Sub
%>
(2)設(shè)計(jì)瀏覽用戶自然信息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對(duì)象保存在Session對(duì)象中
? 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
? %>
????
思考與練習(xí):
文件browse_work.asp用于瀏覽工作信息, 該程序與brower_pop.asp設(shè)計(jì)思想完全相同, 只要將表名、結(jié)果集名以及相應(yīng)的文件名做一些改動(dòng)即可, 請(qǐng)讀者自行完成。
??? (3)設(shè)計(jì)數(shù)據(jù)查詢程序。數(shù)據(jù)查詢程序是依照用戶提出的要求查找有關(guān)的人事信息。這里設(shè)計(jì)接三種方式查詢的程序, 分別是按姓名查詢、按職稱查詢和按單位查詢。無(wú)論是按哪種條件查詢, 都是先從相關(guān)的表中列出被查詢的字段值, 經(jīng)用戶選擇后再進(jìn)行查詢處理。下面給出按姓名查詢的程序, 共有兩個(gè)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
%>
請(qǐng)選擇姓名:
文件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.身份證號(hào), PERSONEL.姓名, 出生年月, 性別, 籍貫, 民族, 部門(mén)名, 職稱, 職務(wù), 工作時(shí)間 from PERSONEL, WORK, DEPART where PERSONEL.姓名='"& name&"' and WORK.姓名='"&name&"'and WORK.部門(mén)號(hào)=DEPART.部門(mén)號(hào)", cn, adOpenStatic
%>
?
?
??? <%
? IF Not rs.EOF THEN %>
?
身份證號(hào): | ?????? <% Response.Write rs.Fields("身份證號(hào)").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 %> ??????? ? |
部門(mén)名: | ???? <% Response.Write ??? rs.Fields("部門(mén)名").Value %> ??????? ? |
職稱: | ???? <% Response.Write ??? rs.Fields("職稱").Value %> ??????? ? |
職務(wù): | ???? <% Response.Write ??? rs.Fields("職務(wù)").Value %> ??????? ? |
工作時(shí)間: | ???? <% Response.Write ??? rs.Fields("工作時(shí)間").Value %> ??????? ? |
??????? <%
ELSE
??? Response.write "您所查找的人沒(méi)有信息!"
END IF
rs.close
cn.close
%>
?
?
按姓名直詢的運(yùn)行情況分別如圖5和6所示。
圖5選擇要查詢的姓名
圖6查詢結(jié)果
思考與練習(xí):
設(shè)計(jì)按職稱、按單位查詢?nèi)耸滦畔⒌腁SP程序。
???
項(xiàng)目3? 數(shù)據(jù)添加程序設(shè)計(jì)
實(shí)驗(yàn)?zāi)康?/p>
??? 掌握在 ASP中對(duì) SQL Server數(shù)據(jù)庫(kù)進(jìn)行添加的方法。
實(shí)驗(yàn)內(nèi)容
(1)設(shè)計(jì)數(shù)據(jù)輸入界面。
(2)設(shè)計(jì)數(shù)據(jù)添加程序。
實(shí)驗(yàn)步驟
??? 數(shù)據(jù)添加的處理分為兩部分,一部分是通過(guò)表單接收用戶輸入的數(shù)據(jù),這部分由文件append.html實(shí)現(xiàn);另一部分是對(duì)表單提交的數(shù)據(jù)的處理,即將數(shù)據(jù)分別寫(xiě)入PERSONEL表和WORK表,由ASP程序append.asp完成。
??? (l)設(shè)計(jì)數(shù)據(jù)輸入界面。使用頁(yè)面開(kāi)發(fā)工具設(shè)計(jì)如圖7所示的界面, 注意各輸入元素的命名及屬性須按照表5所列。
????????????????????????? 表11? 數(shù)據(jù)輸入界面各表單元素屬性及含義
表單元素 屬性值 說(shuō)明 表單元素 屬性值 說(shuō)明 Form Action=”append.asp” 輸入表單 Text文本框 Name=”sfzh” 身份證號(hào) Text文本框 Name=”xm” 姓名 Text文本框 Name=”xb” 性別 Text文本框 Name=”sr” 出生年月 Text文本框 Name=”gzsj” 工作時(shí)間 Text文本框 Name=”jc” 獎(jiǎng)懲情況 Text文本框 Name=”jbgz” 基本工資 Text文本框 Name=”dh” 電話 Text文本框 Name=”bmbh” 部門(mén)編號(hào) Text文本框 Name=”zc” 職稱 Text文本框 Name=”zw” 職務(wù) Text文本框 Name=”dz” 地址 Text文本框 Name=”mz” 民族 Text文本框 Name=”jg” 籍貫 Text文本框 Name=”tc” 特長(zhǎng)
????????????????????????????? 圖7 人事數(shù)據(jù)輸入表單
(2)設(shè)計(jì)數(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("身份證號(hào)")=sfzh
rs("姓名") = xm
rs("部門(mén)號(hào)")=bmh
rs("職稱") = zc
rs("職務(wù)") =zw
rs("工作時(shí)間") =gzsj
rs("特長(zhǎng)")=tc
rs("獎(jiǎng)懲記錄") =jc
rs("基本工資")=jbgz
rs.Update
Set rs1 = Server.CreateObject("ADODB.Recordset" )
rs1.Open "select * from PERSONEL",? cn,? adOpenDynamic,? adLockPessimistic
rs1.AddNew
rs1("身份證號(hào)")=sfzh
rs1("姓名") = xm
rs1("性別")=xb
rs1("出生年月")= sr
rs1("籍貫")=jg
rs1("民族")=mz
rs1("地址")=dz
rs1("電話")=dh
rs1.Update
cn.close
Response.Write "已添加了該條信息!"
%>
項(xiàng)目4? 數(shù)據(jù)修改程序設(shè)計(jì)
實(shí)驗(yàn)?zāi)康?/p>
? (l) 掌握在 ASP中對(duì) SQL Server數(shù)據(jù)庫(kù)進(jìn)行修改的方法。
(2) 掌握在 ASP中對(duì) SQL Server數(shù)據(jù)庫(kù)的數(shù)據(jù)進(jìn)行刪除的方法。
實(shí)驗(yàn)內(nèi)容
(1)設(shè)計(jì)修改信息文件。
(2)設(shè)計(jì)處理修改文件。
(3)設(shè)計(jì)數(shù)據(jù)庫(kù)修改處理程序。
(4)刪除界面設(shè)計(jì)。
(5)設(shè)計(jì)數(shù)據(jù)庫(kù)刪除處理程序。
實(shí)驗(yàn)步驟?
對(duì)數(shù)據(jù)修改是人事管理中經(jīng)常要進(jìn)行的操作, 本系統(tǒng)中設(shè)計(jì)了修改基本信息和修改工作信息兩部分ASP程序, 兩部分程序的設(shè)計(jì)原理是相同的, 所以下面只給出修改基本信息部分的程序。修改基本信息功能由3個(gè)ASP程序組成。程序change_pop.asp從PERSONEL表中提取出所有人的身份證號(hào), 由用戶進(jìn)行選擇。用戶選擇了要修改信息的身份證號(hào)后提交給chane_pop_handle.asp程序, 該程序返回該人的基本信息, 由用戶輸入新信息, 輸入完畢提交后由update_pop.asp程序?qū)⑿滦畔?xiě)入PERSONEL表。
??? (1)設(shè)計(jì)修改信息文件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 身份證號(hào) from PERSONEL”, cn, adOpenstatic
??????????? %>
???????????
?????????
?????????
請(qǐng)選擇身份證號(hào):
?????????
???????????
? <% DO %>
???
??? <%=Server.HTMLEnode(rs.Fields(”身份證號(hào)”).Value)%>
????? <%
????? rs.MoveNext
????? LOOP UNTIL rs.EOF
????? rs.close
????? cn.closeN
????? %>
?????
??? %nbsp;
???
(2)設(shè)計(jì)處理修改文件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 身份證號(hào)='"&id&"'", cn, adOpenStatic
?%>
???
<%
?? IF Not rs.EOF THEN
????? Response.Write "請(qǐng)?zhí)顚?xiě)新信息:
本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點(diǎn)和立場(chǎng)。
轉(zhuǎn)載請(qǐng)注明,如有侵權(quán),聯(lián)系刪除。