第一篇:2015-2 13計科數(shù)據(jù)庫編程 實驗教案 oracle11g
湘南學院 實驗教案
授課學期:2015年度第二學期 課程名稱:數(shù)據(jù)庫編程課時安排:專
業(yè):計算機科學與技術(shù)班
級:年
級:任課教師:陸汝華
實驗 16課時
1班 2013級 實驗一 Oracle安裝配置與基本操作實驗
教學目的要求:
1.掌握Oracle數(shù)據(jù)庫的安裝,包括服務(wù)器端數(shù)據(jù)庫管理系統(tǒng)安裝和客戶端工具的安裝。2.掌握Oracle數(shù)據(jù)庫的登錄、啟動和關(guān)閉 重點:
Oracle 11g數(shù)據(jù)庫的安裝 難點:
服務(wù)端和客戶端的安裝 課時安排:實驗2課時
預備知識:
一、安裝:
1、選擇安裝方法:默認為基本安裝,一般選擇高級安裝
2、選擇安裝類型:企業(yè)版 標準版 個人版
一般選擇企業(yè)版
3、安裝位置:即ORACLE基目錄和主目錄設(shè)置
4、先決條件檢查
5、選擇配置選項:創(chuàng)建數(shù)據(jù)庫
6、選擇數(shù)據(jù)庫配置:一般用途/事務(wù)處理
7、輸入全局數(shù)據(jù)庫名和SID
8、數(shù)據(jù)庫存儲選項:數(shù)據(jù)文件存儲位置
9、備份和恢復選項
10、口令
11、概要
點擊安裝按鈕開始安裝,直到出現(xiàn)安裝結(jié)束界面。
二、操作:
1、程序組,系統(tǒng)服務(wù),文件夾目錄等的變化
2、從開始進入SQL Plus進行登錄操作 用戶名:sys as sysdba
3、進入控制臺進行操作 https://localhost:1158/em
三、當oracle11g計算機名修改后需要重新配置 1 監(jiān)聽程序配置 本地NET服務(wù)名配置 3 控制臺重新配置
(1)cmd
(2)emctl start dbconsole 提示:Environment variable ORACLE_SID not defined.Please define it.(3)set oracle_sid=orcl
(4)emctl start dbconsole 提示:OC4J Configuration issue.c:appAdministratorproduct11.1.0db_1/oc4j/j2ee/OC4 J_DBConsole_j1390_orcl not found.(5)復制上述文件改名為:OC4J_DBConsole_j1390_orcl
(6)emctl start dbconsole 提示:EM Configuration issue.c:appAdministratorproduct11.1.0db_1/j1390_orcl not found.(7)emctl start dbconsole 服務(wù)已經(jīng)啟動成功。還可以通過修改資料檔案庫或新建數(shù)據(jù)庫來完成。
實驗內(nèi)容:
1、Oracle服務(wù)端軟件的安裝;
2、Oracle數(shù)據(jù)庫的安裝;
3、Oracle數(shù)據(jù)庫客戶端的安裝;
4、Oracle數(shù)據(jù)庫的登錄、啟動和關(guān)閉等基本操作。實驗二 Oracle網(wǎng)絡(luò)結(jié)構(gòu)與管理實驗
教學目的要求:
1.理解Oracle網(wǎng)絡(luò)服務(wù)組成及Oracle NET、監(jiān)聽程序、管理連接器和網(wǎng)絡(luò)工具的功能和作用;
2.理解服務(wù)名、連接描述符、連接標識符等基本概念; 3.掌握Oracle網(wǎng)絡(luò)在服務(wù)器端和客戶端的配置方法。重點:
Oracle 服務(wù)器端監(jiān)聽程序和網(wǎng)絡(luò)服務(wù)名的配置 難點:
Oracle 服務(wù)器端監(jiān)聽程序的配置 課時安排:實驗2課時
預備知識:
一、監(jiān)聽程序的配置
1、監(jiān)聽程序配置文件內(nèi)容
默認路徑為%Oracle-Home%networkadmin,存在文件名為listener.ora的配置文件,包含內(nèi)容:配置監(jiān)聽程序所監(jiān)聽的一個或多個協(xié)議地址。配置監(jiān)聽程序所支持的數(shù)據(jù)庫服務(wù)信息。設(shè)置控制監(jiān)聽程序運行的參數(shù)。
2、監(jiān)聽程序配置方法
使用ONCA或Oracle net manager修改配置文件listener.ora的內(nèi)容,可以配置多個監(jiān)聽程序,ONCA配置方法步驟如下。
(1)歡迎使用(2)監(jiān)聽程序
(3)輸入監(jiān)聽程序名稱(4)選擇協(xié)議(5)選擇端口(6)配置完成
3、監(jiān)聽程序管理
在Windows環(huán)境下,可用命令行程序LSNRCTL(listener control 監(jiān)聽控制)啟動、關(guān)閉和管理監(jiān)聽程序。
二、命名方法的配置
1、選擇命名方法的配置
選擇的命名方法記錄在sqlnet.ora的文件中,該文件默認路徑為networkadmin,默認內(nèi)容為:
# sqlnet.ora Network Configuration File: D:appAdministratorproduct11.1.0db_1networkadminsqlnet.ora # Generated by Oracle configuration tools.# This file is actually generated by netca.But if customers choose to # install “Software Only”, this file wont exist and without the native # authentication, they will not be able to connect to the database on NT.SQLNET.AUTHENTICATION_SERVICES=(NTS)NAMES.DIRECTORY_PATH=(TNSNAMES, EZCONNECT)
2、配置本地命名方法 本地命名方法將連接標識符到連接描述符的映射關(guān)系保存在名稱為tnsnames.ora文件中,默認內(nèi)容為:
# tnsnames.ora Network Configuration File: D:appAdministratorproduct11.1.0db_1networkadmintnsnames.ora # Generated by Oracle configuration tools.ORCL =
(DESCRIPTION =
(ADDRESS =(PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = orcl)))也可通過ONCA進行配置:
(1)選擇“本地Net服務(wù)名配置”(2)服務(wù)名配置(3)服務(wù)名(4)選擇協(xié)議(5)主機名(6)測試
(7)測試成功,可編輯網(wǎng)絡(luò)服務(wù)名
實驗內(nèi)容:
1、對Oracle 服務(wù)器端進行監(jiān)聽程序和網(wǎng)絡(luò)服務(wù)名等配置,并查看listener.ora、sqlnet.ora、tnsnames.ora等相關(guān)文件和Net Manager等相關(guān)界面的數(shù)據(jù)信息;
2、修改服務(wù)端的計算機名,對Oracle進行重新配置,使其能正常工作,同時查看上述相關(guān)數(shù)據(jù)并與之比較變化;
3、使用命令對監(jiān)聽程序進行操作管理。
實驗三 Oracle數(shù)據(jù)庫管理實驗
教學目的要求:
1.掌握數(shù)據(jù)庫的建立方法。
2.了解手動建立數(shù)據(jù)庫的基本步驟。3.掌握數(shù)據(jù)庫啟動、關(guān)閉和刪除的方法 重點:
數(shù)據(jù)庫啟動、關(guān)閉和刪除的方法 難點:
手動建立數(shù)據(jù)庫 課時安排:實驗2課時
預備知識:
一、數(shù)據(jù)庫的建立
(1)DBCA建立數(shù)據(jù)庫
點擊:OracleHome、Configuration And Migration Tools、Database Configuration Assistant進入DBCA界面。
(2)SQL命令建立數(shù)據(jù)庫
1、確定數(shù)據(jù)庫名和實例名SID SQL>setenv Oracle_SID=student
2、確定環(huán)境變量設(shè)置正確
在啟動SQL Plus之前,必須正確設(shè)置環(huán)境變量。如Oracle_sid,Oracle_hom,PATH等。
3、確定DBA認證方式
新建數(shù)據(jù)庫,必須以DBA身份連接,并具有相應(yīng)的系統(tǒng)權(quán)限。
4、創(chuàng)建初始化參數(shù)文件
可復制樣本初始化參數(shù)文件,也可復制其它數(shù)據(jù)庫的初始化 參數(shù)文件。
5、創(chuàng)建實例
C:>oradim –NEW –SID student –STARTMODE MANUAL-PFILE=??INIT.ORA
6、連接到實例
SQL>CONNECT SYS AS SYSDBA;連接正確,則提示connected to an idle instance.7、建立服務(wù)器參數(shù)文件
SQL>CREATE SPFILE FROM PFILE;
8、啟動實例
SQL>STARTUP NOMOUNT;以非加載方式啟動實例
9、執(zhí)行CREATE DATABASE命令
二、數(shù)據(jù)庫的操作(1)數(shù)據(jù)庫的啟動
1、啟動實例但不加載數(shù)據(jù)庫(NOMOUNT狀態(tài))SQL>STARTUP NOMOUNT;SQL>STARTUP NOMOUNT PFILE=?.init.ora;
2、啟動實例并加載數(shù)據(jù)庫(MOUNT狀態(tài))SQL>STARTUP MOUNT;SQL>STARTUP MOUNT PFILE=?.init.ora;
3、啟動實例并加載、打開數(shù)據(jù)庫(OPEN狀態(tài))SQL>STARTUP OPEN;SQL>STARTUP;SQL>STARTUP MOUNT PFILE=?.init.ora;SQL>STARTUP PFILE=?.init.ora;
4、數(shù)據(jù)庫啟動模式之間的轉(zhuǎn)換
從NOMOUNT狀態(tài)到MOUNT狀態(tài): SQL>ALTER DATABASE MOUNT; 從MOUNT狀態(tài)到OPEN狀態(tài): SQL>ALTER DATABASE OPEN; 只讀模式
SQL>ALTER DATABASE OPEN READ ONLY; 讀寫模式
SQL>ALTER DATABASE OPEN READ WRITE;(2)數(shù)據(jù)庫的關(guān)閉
1、正常關(guān)閉方式(NORMAL)SQL>SHUTDOWN NORMAL;
2、立即關(guān)閉方式(IMMEDIATE)SQL>SHUTDOWN IMMEDIATE;
3、事務(wù)關(guān)閉方式(TRANSACTIONAL)SQL>SHUTDOWN TRANSACTIONAL;
4、終止關(guān)閉方式(ABORT)SQL>SHUTDOWN ABORT;
三、數(shù)據(jù)庫的刪除
啟動DBCA,選擇刪除數(shù)據(jù)庫。單擊“下一步”,將顯示所有可以被刪除的數(shù)據(jù)庫例程。
實驗內(nèi)容:
1、使用DBCA建立數(shù)據(jù)庫;
2、使用命令建立數(shù)據(jù)庫;
3、使用DBCA和命令對所建立的數(shù)據(jù)庫進行修改、刪除等操作;
4、練習數(shù)據(jù)庫的啟動和關(guān)閉等操作,重點練習三種啟動模式和三種關(guān)閉方式,并了解數(shù)據(jù)庫處于各種打開或關(guān)閉狀態(tài)下所能進行和不能進行的基本操作。實驗四 Oracle數(shù)據(jù)庫對象管理實驗
教學目的要求:
1.了解各類數(shù)據(jù)庫對象的作用。
2.掌握表、視圖、索引、序列、同義詞等數(shù)據(jù)庫對象的建立、刪除、修改和查詢等方法。3.掌握表內(nèi)容的插入、刪除、更新和查詢等方法。4.掌握表的約束的使用方法 重點:
表內(nèi)容的插入、刪除、更新和查詢等方法 難點:
手動建立表、視圖、索引、序列等數(shù)據(jù)庫對象 課時安排:實驗4課時 實驗內(nèi)容:
1、使用SQL語句創(chuàng)建表(至少包含三種不同類型的字段),使用SQL語句向表中插入數(shù)據(jù)、修改表中數(shù)據(jù)、刪除表中數(shù)據(jù)和查詢數(shù)據(jù)。
2、使用SQL語句創(chuàng)建索引、視圖。
3、創(chuàng)建序列,并在插入語句中使用序列。實驗五Oracle數(shù)據(jù)庫安全管理實驗
教學目的要求:
1.了解數(shù)據(jù)庫用戶、權(quán)限、事務(wù)、概要文件、并發(fā)和會話等基本概念。2.掌握建立、刪除和修改、查詢用戶等的方法。3.掌握用戶授予和回收權(quán)限或角色的方法。4.掌握整個數(shù)據(jù)庫安全的綜合管理 重點:
用戶授予和回收權(quán)限或角色 難點:
用戶授予和回收權(quán)限或角色 課時安排:實驗4課時 實驗內(nèi)容:
1、使用命令創(chuàng)建數(shù)據(jù)庫認證用戶。
2、為用戶授予和回收權(quán)限或角色操作。
3、使用新用戶登錄,進行有權(quán)限和無權(quán)限操作。
第二篇:計科2008級 數(shù)據(jù)庫課程設(shè)計題目
題目1高校教務(wù)管理系統(tǒng)(4人)
某高校有若干系,每系又分為若干專業(yè),每系有若干學生和教師。學生被分在若干班級中,一個學生只能屬于一個班級,一個班級的學生都是一個專業(yè)的;教師則被分在不同的課程組,一個教師可以屬于多個課程組,某個課程組的老師才有資格講授該門課程。學生須在大學四年中修滿規(guī)定的學分,其中有一部分為必修課,另一部分是選修課;必修課以班級為最小單位安排上課教室及上課老師,多個班級可以安排在一個教室上課。每個專業(yè)都有自已的培養(yǎng)計劃,規(guī)定該專業(yè)的學生應(yīng)在大學四個學年或8 個學期中修完哪些必修課,并在指定的選修課修滿選修學分。該計劃同時指定了這些必修課或選修課所開設(shè)的學期。所有教學活動均在教室進行,但上機與實驗則在機房或?qū)嶒炇疫M行。不同的教室、實驗室或機房可容納不同的人數(shù)。有的教室有多媒體設(shè)施,有的沒有。有的課程必須在多媒體教室完成教學,有的則不然。
根據(jù)上述描述,設(shè)計并開發(fā)一個教務(wù)管理系統(tǒng),功能至少包括:
學生、教師、課程、專業(yè)、教室等信息管理;
培養(yǎng)計劃的制訂;
排課系統(tǒng);
選修課的選修系統(tǒng)(先有課表,然后方許學生選修);
成績登記系統(tǒng)(只有任課老師才有權(quán)登記該門課程的成績,但只能在該課程結(jié)束后一個月內(nèi)登記,登記完畢后,任課老師要給予確認,此后再不能修改。在一個月快要結(jié)束的前一個星期,教務(wù)管理員應(yīng)收到提醒,得知哪些老師尚未完成成績的登記,以便電話通知這些任課老師);
成績的統(tǒng)計、查詢與打印(單人、單科、班級等成績的打印);
學分的查詢與統(tǒng)計;
根據(jù)需要的其它功能;
題目2圖書銷售系統(tǒng)(4人)
圖書銷售系統(tǒng)提供給書店包括圖書編目、進退貨、銷售、財務(wù)報表等方面的一體化解決方案。同時還提供會員折扣功能,B/S 模式下的網(wǎng)上會員系統(tǒng)等。功能包括:
圖書零售購買:顧客購書后收銀臺進行結(jié)賬。對于書店的會員可以提供相應(yīng)的折扣。輸入需要購買的圖書和數(shù)量,計算出總金額,由用戶選擇使用現(xiàn)金或會員卡進行結(jié)賬。并提供銷售小票流水號作為銷售的單據(jù)。對于會員,還要計算相應(yīng)的積分。
圖書零售退貨:顧客對已購買的圖書進行退貨。需要提供圖書和銷售的小票以作為購買憑證。系統(tǒng)查詢數(shù)據(jù)庫進行數(shù)據(jù)驗證,對符合要求的圖書進行退貨。
新書編目:書店從出版社購買新的圖書后在這里進行編目。只有編目后的圖書才可以進行銷售。
圖書查找:可以使用ISBN、書名、作者、出版社等多種方式進行查找已編目的圖書。
圖書資料修改:對已編目的圖書修改圖書的基本信息、零售價和最低折扣價。圖書進貨:對已編目的圖書再進貨,同時處理其金額差異。
圖書退貨:對已編目的圖書退貨,同時處理其金額差異。
出版社管理:添加、刪除、修改出版社,同時查詢出版社的資料。
會員添加:添加新的會員,同時登記會員的基本信息、有效期、指定會員組等。會員查找:提供會員編號、身份證號、會員姓名等方式復合查詢。
會員刪除:刪除已存在的會員。
會員信息修改:對會員的基本資料進行修改。
會員充值:向會員的虛擬賬戶充值。
掛失與特別處理:將會員的狀態(tài)在正常、掛失、特別處理之間調(diào)整。也可以找回會員的密碼。
會員組管理:添加、刪除和列出會員組??梢詫T組的名稱、折扣、積分換算等方面進行設(shè)置。
系統(tǒng)設(shè)置:添加、刪除、修改系統(tǒng)操作員,同時為相應(yīng)的操作員設(shè)置其控制權(quán)限。
密碼修改:對當前的系統(tǒng)操作員的密碼進行修改。
數(shù)據(jù)管理:提供系統(tǒng)數(shù)據(jù)庫的備份與恢復。
報表處理:提供圖書銷售單、圖書進貨單、會員列表、出版社列表、銷售單等報表。
題目3自來水公司水費管理系統(tǒng)(3人)
某市自來水公司負責該市所有民用和工業(yè)用水的供應(yīng),并負責水費的收取。工業(yè)用水與民用水采取不同的收費標準。無論工業(yè)用水或民用水均一月抄表一次,原則上每月收費一次。由于抄表的工作量較大,并不能保證兩次抄表期間正好跨度一個月,因此以每月抄表的期間為當月收費期間。工業(yè)水費都由單位繳納。民用水費有的由個人繳納,有的由單位或住宅小區(qū)統(tǒng)一繳納(然后單位再從職工工資中扣取,或由小區(qū)物業(yè)代收)。水費有的是由單位代理人或個人在收費大廳繳納,有的由收費人員上門收取,再上繳財務(wù)。收費應(yīng)當出具收費憑證(發(fā)票)。偶有單位或個人多個收費期間并繳現(xiàn)象,此時,可按收費期間出具多張收費憑證。對拖欠水費超過一定額度的出打印催繳通知。
根據(jù)上述描述,設(shè)計與開發(fā)一個自來水收費管理系統(tǒng)。功能至少
包括:
水費帳戶的建立;
帳戶初始化;
水表期末數(shù)的讀?。?/p>
水費帳單的建立;
催繳通知;
水費收取與發(fā)票打??;
水費查詢、統(tǒng)計與報表;
根據(jù)需要的其它功能。
單位和個人可在網(wǎng)上查詢本單位或本人繳費情況和欠費情況,以及繳費歷記錄。
題目4銀行儲蓄管理系統(tǒng)(3人)
某儲蓄所接受定期和活期儲蓄業(yè)務(wù),儲戶采用實名存款,需登記真實姓名,并
出具身份證號碼。儲戶可以辦理多個存折。系統(tǒng)除了管理存取款業(yè)務(wù)外,還應(yīng)管理儲蓄所每天的業(yè)務(wù)交接與對帳、扎帳業(yè)務(wù)。儲蓄所每天上班前可能接受運鈔車送來的現(xiàn)金,下班時則將所內(nèi)現(xiàn)金送回金庫,零星款項也可能留在所內(nèi)。每天下班前都要盤點每個營業(yè)員準備金、收取儲戶的存款、支付儲戶的取款以及繳回的余款,以驗證帳目的正確。這些比較記錄除了存儲數(shù)據(jù)庫外,都將打印憑證,交由當事人簽字后存檔。儲戶存款依法支付扣稅后利息,定期存款依照到期日計息,活期存款在每年的6 月30 日計息(以存款天數(shù)計算)。此外,某個單位可能為本單位職工在該銀行辦理了工資卡,應(yīng)予以考慮本項業(yè)務(wù)??蛻舸嬲刍蚩▉G失后,可以申請掛失,掛失后該帳戶即被凍結(jié),直到儲戶補辦新折或卡后。
根據(jù)上述描述,設(shè)計并開發(fā)一個儲蓄管理系統(tǒng)。功能至少包括:
開戶、銷戶、掛失等管理;
存款(包括活期存款和定期存款);
取款(包括活期取款、定期到期取款和定期提前取款);
轉(zhuǎn)帳(一次轉(zhuǎn)帳可以從一個帳戶資金轉(zhuǎn)到多個帳戶,一如代發(fā)工資的情況)。儲戶可以通過網(wǎng)絡(luò)查詢自已的帳戶信息;還可以通過網(wǎng)絡(luò)掛失。
查詢、統(tǒng)計與報表(如查詢交易歷史);
其它管理功能。
題目5個人信息管理系統(tǒng)(3人)
設(shè)計一個個人信息管理系統(tǒng),包括一下信息:
1.通訊錄信息:包括通訊人姓名、聯(lián)系方式、工作地點、城市、備注等。
2.備忘錄信息:包括什么時間、事件、地點等。
3.日記信息:包括什么時間、天氣、事件等。
4.個人財物管理:包括總收入,消費項目、消費金額、消費時間、剩余資金。系統(tǒng)要實現(xiàn)下列操作
根據(jù)相應(yīng)的用戶名密碼,顯示相應(yīng)的所有記錄。如果沒有對應(yīng)的UID或PWD和UID不對應(yīng)則報錯。顯示用戶的通訊錄具體內(nèi)容,可以查詢聯(lián)系人的資料和添加新的聯(lián)系人。顯示用戶的日記本,供用戶查閱和編寫。若日記較長,窗口能顯示部分信息。雙擊窗口能顯示日記詳細內(nèi)容顯示用戶的財務(wù)信息,記錄新的收支信息。計算出用戶的總收入,總支出,和剩余金額。顯示用戶的備忘錄內(nèi)容,提醒用戶重要事件的時間地點。用于注冊新用戶。若新用戶的用戶名已經(jīng)存在,則報錯。
題目6教務(wù)管理系統(tǒng)(3人)
背景資料:
某大學的某個學院下設(shè)若干系,每個系包含一個或幾個班級,每個系有若干名教師。每個班級有若干名學生。教師每學期講授多門課程,每門課程每學期由一名教師講授。負責教務(wù)工作的教師的日常工作包括:
1、每學期開始時打印每個系的每個班級的基本信息(班名,入學時間,班長等)以及學生的基本狀況報表,包括每個學生的基本信息(學號、姓名、性別、出生日期、照片等)和聯(lián)系方式,如宿舍號,電話,E-MAIL地址等。
2、每學期重新打印一份教師名單,包含教師的基本信息,以及便于聯(lián)系
等方面的信息(工作證號碼、姓名、性別、出生日期、職稱,職務(wù),辦公室房間號,電話號碼)。假設(shè)每個教師的辦公室房間號有一個,不同的教師也可以有相同的房間號。每個教師可有多個聯(lián)系電話。
設(shè)計要求:
(1)進行需求分析,編寫數(shù)據(jù)字典。
(2)設(shè)計E-R圖。
(3)采用友好的界面對系、班級、學生、教師、課程、選課等內(nèi)容進行增、刪、改。
(4)具有方便的查詢功能,例如,對于學生,可以按照學生的學號、姓名、年齡、性別、系別等屬性的任意組合條件進行查詢。同樣為課程以及選課等內(nèi)容進行查詢。
(5)具有豐富的報表統(tǒng)計功能,例如,對于學生選課信息,可以進行如下報表匯總操作:
1)打印出某學生某學期所選修的全部課程的學分,學時以及成績。
2)打印出某教師所講授的全部課程的信息。
3)打印出某班某學期所有學生按總成績降序列出的學號、姓名以及總成績報表。
4)打印出各系具有的各級職稱的教師人數(shù)。
5)打印出該學院所開設(shè)的各門課程的名稱、學時以及先修課的名稱和學時。
題目7房屋中介管理系統(tǒng)(3人)
背景資料:
某房屋中介公司擁有多名職員分管不同業(yè)務(wù),公司與多名房主具有業(yè)務(wù)聯(lián)系,每個房主在委托房屋中介公司進行房屋的出租或出售時都要填寫一張表格,說明房屋的地址、面積、朝向、類別以及價格等相關(guān)信息。需要租住或購買房屋的客戶在向中介公司尋求服務(wù)時,也需要登記需要租住或購買的房屋的細節(jié)要求。職員負責與客戶約定時間,并陪同客戶看房,若客戶看中房屋,公司將記錄客戶購買或租住房屋的合同的相關(guān)信息。試為此公司設(shè)計一個數(shù)據(jù)庫應(yīng)用系統(tǒng)。
功能要求:
(1)管理公司職員的基本信息,以及所進行的業(yè)務(wù)信息,如聯(lián)系客戶、陪同客戶看房的信息
(2)登記房屋、房主以及客戶的信息,并能進行方便地增、刪、改。
(3)方便房主查詢所需要的房屋的查詢功能。
(4)統(tǒng)計待租或待售的房屋信息等。
題目8產(chǎn)品生產(chǎn)與銷售管理系統(tǒng)(3人)
背景資料:
某家具公司生產(chǎn)和銷售多種家具產(chǎn)品。公司擁有多個生產(chǎn)家具的車間,每個車間有多名工人,負責生產(chǎn)多種產(chǎn)品??蛻艨稍诠鞠略O(shè)的多個銷售點購買家具,所購買的家具記錄在訂單中,銷售點根據(jù)訂單向客戶運送家具。請根據(jù)如上
應(yīng)用環(huán)境,為該公司設(shè)計和實現(xiàn)一個產(chǎn)品生產(chǎn)與銷售管理系統(tǒng)。
功能要求:
(1)記錄公司的產(chǎn)品和工人的基本信息,并能進行方便的增、刪、改。
(2)記錄公司的每個銷售點、客戶以及每個訂單的信息。
(3)對工人、產(chǎn)品、客戶以及訂單等信息進行多條件任意組合查詢。
(4)統(tǒng)計產(chǎn)品的銷售信息。
題目9教師工資管理系統(tǒng)(3人)
背景資料:
(1)某學?,F(xiàn)有100名教職工,按職稱分為教授、副教授、講師、助教。(可根據(jù)本人所在學校實際情況確定具體名額。
(2)工資由基本工資、福利津貼和獎勵工資構(gòu)成,失業(yè)保險和住房公積金在工資中扣除。
(3)該學?;竟べY是根據(jù)教師職稱等級分配工資數(shù)額,其余無差別。
(4)每位教師的基本資料有姓名、性別、年齡、職稱。
(5)工資按月發(fā)放,實際發(fā)放的工資金額為工資減去扣除。
以上信息可供參考,學員可根據(jù)本人所在學校具體情況設(shè)計。
設(shè)計要求:
(1)進行需求分析,編寫數(shù)據(jù)字典。
(2)設(shè)計E-R圖。
(3)實現(xiàn)個人的基本資料、工資和扣除金額數(shù)據(jù)的錄入。
(4)計算個人的實際發(fā)放工資。
(5)按職稱分類統(tǒng)計人數(shù)和工資金額。
(6)實現(xiàn)分類查詢。
(7)能夠刪除辭職人員的數(shù)據(jù)。
題目10學生學籍管理信息系統(tǒng)(3人)
學生學籍管理工作包括學生檔案、學籍、成績、升學等內(nèi)容的管理;面對大量的學生數(shù)據(jù)、報表,手工處理方式已經(jīng)很難跟上現(xiàn)代化的步伐。隨著計算機技術(shù)及網(wǎng)絡(luò)通訊技術(shù)的飛速發(fā)展,許多學校已經(jīng)有了較好的計算機應(yīng)用甚至網(wǎng)絡(luò)硬件建設(shè)基礎(chǔ)。因此為提高學校管理工作的現(xiàn)代化、科學化水平,保證信息處理的即時化、準確化,開發(fā)一套對學生學籍進行管理的軟件是極其重要的。
應(yīng)完成的主要功能:(1)學生檔案的管理,即錄入、修改、查詢、輸出學生檔案信息,這些信息包括學生基本情況、學生簡歷情況、學生獎勵情況、學生處分情況、學生家庭信息、學生體檢情況。(2)學生學籍管理,錄入、修改、查詢、輸出學生學籍信息,這些信息包括學生獎貸學金情況、學生注冊、學生異動情況、學生軍訓情況、學生畢業(yè)情況。(3)學生成績管理,錄入修改、查詢、輸出學生入校成績,各學期、各門課程的成績信息,并支持按年級、班級等條件的統(tǒng)計、查詢、報表輸出。
第三篇:數(shù)據(jù)庫原理實驗教案
《數(shù)據(jù)庫原理》課程實驗
實驗1 創(chuàng)建數(shù)據(jù)庫和數(shù)據(jù)表
一、實驗?zāi)康?/p>
熟悉SQL Server Management Studio界面;掌握通過圖形化向?qū)Ш蛨?zhí)行Transact-SQL語句創(chuàng)建數(shù)據(jù)庫的方法。
二、實驗環(huán)境
Windows XP操作系統(tǒng),SQL Server 2005軟件。
三、實驗課時
2課時。
四、實驗內(nèi)容
SQL Server中的一個數(shù)據(jù)庫必須至少包含一個數(shù)據(jù)文件和一個事務(wù)日志文件,所以創(chuàng)建數(shù)據(jù)庫就是建立主數(shù)據(jù)文件和日志文件。
在SQL Server 2005中創(chuàng)建數(shù)據(jù)庫的方法主要有兩種:一是在SQL Server Management Studio窗口中使用可視化界面,通過方便的圖形化向?qū)?chuàng)建,二是通過執(zhí)行Transact-SQL語句創(chuàng)建。
(一)向?qū)Х绞絼?chuàng)建
1、從“開始”菜單選擇“所有程序”→“Microsoft SQL Server 2005”,打開“SQL Server Management Studio”窗口,使用Windows或SQL Server身份驗證建立連接。
2、在“對象資源管理器”窗格中展開服務(wù)器,選擇“數(shù)據(jù)庫”節(jié)點右擊,從彈出的快捷菜單中選擇“新建數(shù)據(jù)庫”命令,打開“新建數(shù)據(jù)庫”窗口。
3、該窗口中有3個頁,分別是“常規(guī)”、“選項”和“文件組”,完成這3個頁的內(nèi)容即可完成數(shù)據(jù)庫的創(chuàng)建。這里,我們僅設(shè)置“常規(guī)”的相應(yīng)內(nèi)容,其他2個頁的內(nèi)容按照默認設(shè)置即可。
(1)“數(shù)據(jù)庫名稱”文本框中輸入數(shù)據(jù)庫的名稱,如“sample_st”,再輸入該數(shù)據(jù)庫的所有者,這里使用默認值即可。(也可以通過單擊文本框右邊的“瀏覽”按鈕選擇所有者。
(2)“數(shù)據(jù)庫文件”列表中包括兩行,一個是數(shù)據(jù)文件,一個是日志文件。通過單擊下面相應(yīng)的按鈕可以添加或刪除相應(yīng)的數(shù)據(jù)文件。
? 邏輯名稱:指定該文件的文件名。
? 文件類型:用于區(qū)別當前文件是數(shù)據(jù)文件還是日志文件。? 文件組:顯示當前數(shù)據(jù)庫文件所屬的文件組。
? 初始大?。褐付ㄔ撐募某跏既萘?。在SQL Server 2005中數(shù)據(jù)文件的默認值為3MB,日志文件的默認值為1MB。? 自動增長:用于設(shè)置在文件容量不夠用時,文件根據(jù)何種增長方式自動增長。
? 路徑:指定存放在文件的目錄。默認情況下,SQL Server 2005將存放路徑設(shè)置為其安裝目錄下的data子目錄,單擊該列中的按鈕可以在打開的“定位文件夾”對話框中更改數(shù)據(jù)庫的存儲路徑。
完成上述操作后,單擊“確定”按鈕關(guān)閉“新建數(shù)據(jù)庫”窗口,即完成了數(shù)據(jù)庫的創(chuàng)建,可以在“對象資源管理器”窗格中看到新建的數(shù)據(jù)庫。
(二)語言方式創(chuàng)建
SQL Server 2005使用的Transact-SQL語言是標準SQL的增強版本,使用它提供的Create Database語句同樣可以完成對數(shù)據(jù)庫的建立(參考內(nèi)容見附錄)。
1、單擊“新建查詢”按鈕,創(chuàng)建一個查詢輸入窗口將附錄中的語句復制到該窗口。選擇創(chuàng)建數(shù)據(jù)庫的命令,單擊工具欄中的“分析”按鈕,可以檢查語法錯誤;單擊“執(zhí)行”按鈕即可執(zhí)行語句,在查詢窗口內(nèi)的“查詢”窗格中可以看到“命令已成功完成”的提示消息。在“對象資源管理器”窗格中刷新,即可看到新建的數(shù)據(jù)庫。
2、繼續(xù)執(zhí)行Create Database之后的語句,在“sample_st”數(shù)據(jù)庫中用Create Table命令依次建立Student、Course和SC這三個數(shù)據(jù)表,利用Insert命令為各數(shù)據(jù)表添加數(shù)據(jù)。(參考內(nèi)容見教材P84)
(三)知識鞏固
仿照附錄內(nèi)容,用SQL-DDL語言創(chuàng)建“產(chǎn)品訂購”數(shù)據(jù)庫,包含四個數(shù)據(jù)表S、P、J和SPJ,表結(jié)構(gòu)及內(nèi)容見教材P122。
實驗2 數(shù)據(jù)庫的簡單查詢
一、實驗?zāi)康?/p>
掌握單表查詢中各個子句(Select、From、Where、Group、Having、Order)的用法,特別要掌握比較運算符和邏輯運算符的使用。
二、實驗環(huán)境
Windows XP操作系統(tǒng),SQL Server 2005軟件。
三、實驗課時
2課時。
四、實驗內(nèi)容
在已建立的數(shù)據(jù)庫和數(shù)據(jù)表的基礎(chǔ)上,用Select語句完成下列查詢操作。
1、查詢?nèi)w學生的學號和姓名。
select sn,sno from s
2、查詢?nèi)w學生的所有基本信息(僅針對Student表)。
select * from s
3、對SC表查詢?nèi)w學生的選課記錄,在顯示結(jié)果中為“Grade”列增加5分。select score+5 from sc
4、查詢?nèi)w學生的學號和姓名,將原來的英文列名設(shè)置中文別名。select sn as 姓名,sno as 學號 from s
5、顯示所有選課學生的學號,去掉重復結(jié)果。
select distinct sno from sc
6、查詢成績在80分以上的學生選課記錄
select * from sc where score>80
7、查詢經(jīng)濟系所有學生的學號和姓名。
select sn,sno from s where dept='經(jīng)濟系'
8、查詢成績在80~90分的學生選課記錄。
select * from sc where score between 80 and 90
9、查詢年齡不在22~25的學生記錄。
select * from s where age not between 22 and 25
10、查詢所有姓“劉”的學生記錄。
select * from s where sn like'劉%'
11、查詢無考試成績(成績?yōu)榭罩担┑膶W號、課程號。5
select sno ,cno from sc where score is null
12、查詢考試成績非空值的學號、課程號。
select sno ,cno from sc where score is null
13、查詢數(shù)學系年齡小于20歲的學生記錄。
select * from s where dept ='數(shù)學系'and age <28
14、查詢選修了“101”或“102”課程的選課記錄。select * from c where cno ='101' or cno ='102'
15、查詢學生總?cè)藬?shù)。
select count(sno)from s
16、查詢選修了課程的學生人數(shù)。
select count(distinct sno)from sc
17、查詢選修了“101”課程的學生的平均成績。
select AVG(score)from sc
where cno='101'
18、查詢學號為“01003”的學生的考試總成績。
select sum(score)from sc
where sno=01003
19、查詢“101”課程的最高分和最低分。
select max(score),MIN(score)from sc
where cno='101'
20、查詢每門課程的選課人數(shù)。
select cno,COUNT(sno)from sc
group by cno
21、查詢每個學生的學號、選課數(shù)、平均成績和總成績。
select sno,COUNT(cno)/*,AVG(score),sum(score)*/ from sc group by sno
22、查詢選課數(shù)超過2的學生學號及其選課數(shù)。
select sno,COUNT(cno)from sc
group by sno
having COUNT(*)>2
23、查詢所有學生信息,查詢結(jié)果按年齡降序排列。(針對Student表操作)
select * from s order by AGE desc
24、查詢所有學生信息,查詢結(jié)果按系名升序,同系學生按年齡降序排列。
select * from s order by dept,AGE desc
25、查詢選課數(shù)超過2的學生學號及其選課數(shù),查詢結(jié)果按選課數(shù)降序排列。
select sno,COUNT(cno)from sc group by sno having COUNT(*)>2 order by count(cno)desc
實驗3 數(shù)據(jù)庫的多表查詢
一、實驗?zāi)康?/p>
繼續(xù)熟練SQL-SELECT語句的使用;理解多表查詢的概念;掌握多表連接查詢中各個子句的用法,特別要比較內(nèi)連接和外連接的結(jié)果。掌握非相關(guān)子查詢、相關(guān)子查詢的用法,理解它們的執(zhí)行過程;學會在SQL Server中用Exists實現(xiàn)交運算,用Not Exists實現(xiàn)差運算。
二、實驗環(huán)境
Windows XP操作系統(tǒng),SQL Server 2005軟件。
三、實驗課時
2課時。
四、實驗內(nèi)容
(一)、在已建立的數(shù)據(jù)庫和數(shù)據(jù)表的基礎(chǔ)上,用Select語句的連接查詢完成下列操作。
1、查詢每個學生的基本信息及其選課情況。
2、查詢選修“101”課程的學生學號、姓名和成績。
3、查詢與“李平”在同一個系學習的學生記錄。
4、查詢與“李平”年齡相同的學生記錄。
5、查詢選修課程名為“數(shù)據(jù)庫原理”的選課記錄。
6、查詢選修課程名為“數(shù)據(jù)庫原理”的學生記錄。
7、查詢選修“101”課程且成績≥90的學號、姓名和成績。
8、查詢“李平”的所有選課記錄。
9、查詢數(shù)學系學生選修的課程號,要求結(jié)果中去掉重復記錄。
10、查詢計算機系選修課程數(shù)≥2的學號、姓名及平均成績,查詢結(jié)果按平均成績降序。
11、查詢每個學生的學號、選修課程號、課程名及成績。
12、查詢所有學生的選修情況(包括選課和未選課的學生),要求顯示學號、姓名、課程號和成績。
(二)、在已建立的數(shù)據(jù)庫和數(shù)據(jù)表的基礎(chǔ)上,用Select語句的嵌套查詢完成下列操作。
1、查詢選修“101”課程且成績≥90的學號、姓名。
2、查詢“李平”的所有選課記錄。
3、查詢與“李平”在同一個系學習的學生記錄。
4、查詢與“李平”年齡相同的學生記錄。
5、查詢選修課程名為“數(shù)據(jù)庫原理”的選課記錄,輸出結(jié)果包括學號和成績。
6、查詢選修課程名為“數(shù)據(jù)庫原理”的學生記錄,輸出結(jié)果包括學號、姓名和所在系。
7、查詢學號為“01003”學生的選修課程號和課程名。
8、查詢沒有選修“101”課程的學生學號和姓名。
9、查詢選修“101”課程或“102”課程的學生姓名。
10、查詢選修“101”課程和“102”課程的學生學號。
11、查詢選修“101”課程但沒選修“102”課程的學生學號。
12、查詢沒有選修任何課程的學生記錄,輸出結(jié)果包括學號、姓名和所在系。
13、查詢數(shù)學系學生選修的課程號,要求結(jié)果中去掉重復記錄。
14、查詢選修課程至少包含“01003”選修課程的學生學號。實驗4 數(shù)據(jù)庫更新、視圖定義及使用
一、實驗?zāi)康?/p>
掌握Insert、Update、Delete語句的使用;對于Insert語句,要求理解默認值約束、空值約束在插入記錄時所起的作用。理解視圖的概念,掌握Create View、Drop View語句的使用;掌握基于視圖的查詢語句的使用。
二、實驗環(huán)境
Windows XP操作系統(tǒng),SQL Server 2005軟件。
三、實驗課時
2課時。
四、實驗內(nèi)容
(一)、在已建立的數(shù)據(jù)庫和數(shù)據(jù)表的基礎(chǔ)上,向數(shù)據(jù)庫中添加一個臨時表ST,其結(jié)構(gòu)比Student表結(jié)構(gòu)多一個score字段。用Insert語句向臨時表輸入數(shù)據(jù),輸入有誤時用Update語句進行修改。再用三個更新語句完成下列操作。
1、向Student表添加若干新記錄,內(nèi)容自定。(觀察已定義的表的約束情況)
2、向SC表添加新記錄,內(nèi)容自定,不低于10條(注意不能違反參照完整性)。
3、為臨時表ST添加記錄。
4、把Student表的所有行一次性地加到臨時表ST中。
5、在ST表中把所有學生的成績加2分。
6、在ST表中把所有學生的年齡增加1。
7、在ST表中把“李平”的所在系改為“計算機”。
8、在ST表中將選修課程“數(shù)據(jù)庫原理”的學生成績加2分。
9、在SC表中刪除所有成績?yōu)榭罩档倪x修記錄。
10、刪除計算機系選修成績不及格的選課記錄。
(二)、在已建立的數(shù)據(jù)庫和數(shù)據(jù)表的基礎(chǔ)上,完成下列操作。
1、建立數(shù)學系學生的視圖MAST。
2、建立計算機系選修課程名為“數(shù)據(jù)庫原理”的學生視圖,視圖名:CSTVIEW,該視圖中應(yīng)包括屬性列:學號、姓名、成績。
3、創(chuàng)建一個名為STSUMVIEW的視圖,包括所有學生的學號和總成績。
4、建立學生選課視圖SCVIEW,包括所有學生的學號、姓名、課程號、課程名和成績。
5、通過MAST視圖查詢學生基本信息。
6、通過SCVIEW查詢成績大于90分的學生的學號和成績。
7、查詢計算機系選修課程名為“數(shù)據(jù)庫原理”并且成績大于85分的學生的學號和成績。
8、通過MAST視圖將學號為“01008”學生的年齡修改為21歲。
9、通過MAST視圖將學號為“01009”學生所在系改為“經(jīng)濟”,是否能成功執(zhí)行?若不能成功請說明理由;若修改成功,請再次通過MAST視圖查詢學生基本信息,是否能查詢到該生?若不能查詢請說明理由。
10、通過SCVIEW視圖將學號為“01004”學生的總成績修改為380分,是否能成功執(zhí)行?若不能成功請說明理由。
實驗5 數(shù)據(jù)庫的安全與保護
一、實驗?zāi)康?/p>
理解SQL Server的用戶與權(quán)限管理機制,掌握用對象資源管理器創(chuàng)建服務(wù)器登錄帳號,并同時建立用戶。掌握如何為給定的用戶分配權(quán)限。
二、實驗環(huán)境
Windows XP操作系統(tǒng),SQL Server 2005軟件。
三、實驗課時
2課時。
四、實驗內(nèi)容
用戶與權(quán)限管理
(1)打開“SQL Server Management Studio”窗口,使用對象資源管理器創(chuàng)建兩個服務(wù)器登錄帳號Test1和Test2,并在“sample_st”數(shù)據(jù)庫中創(chuàng)建兩個對應(yīng)的同名用戶。設(shè)置Test1用戶和Test2用戶的默認架構(gòu)為guest。
(2)使用Test1身份登錄,并為Test2分配創(chuàng)建數(shù)據(jù)表的權(quán)限;用Test2身份登錄來驗證權(quán)限分配成功。
(3)使用Test1身份登錄,收回剛剛分配給Test2的創(chuàng)建數(shù)據(jù)表的權(quán)限;用Test2身份登錄來驗證權(quán)限回收成功。
五、實驗步驟
1、使用對象資源管理器創(chuàng)建兩個服務(wù)器登錄帳號。以系統(tǒng)管理員身份登錄SQL Server。打開“SQL Server Management Studio”窗口,在對象資源管理器列表中,打開展開“安全性”文件夾,選擇“登錄名”圖標,單擊鼠標右鍵,在彈出的菜單中選擇“新建登錄名”。在打開的對話框中依次建立Test1和Test2,選擇“SQL Server身份驗證”,同時還要輸入密碼,默認數(shù)據(jù)庫為“sample_st”。
(2)在“用戶映射”中列出了當前登錄帳號可以選擇訪問的數(shù)據(jù)庫如“sample_st”,在其左側(cè)的復選框中打勾,表示當前登錄帳號可以訪問對應(yīng)的數(shù)據(jù)庫,默認用戶名與登錄帳號相同。
(3)單擊“確定”按鈕完成創(chuàng)建。
2、創(chuàng)建新的數(shù)據(jù)庫用戶。
在對象資源管理器中選中要訪問操作的數(shù)據(jù)庫,展開“安全性”文件夾,在“用戶”文件夾中查找是否已建立與登錄名Test1和Test2同名的數(shù)據(jù)庫用戶,若已建立,則在屬性中修改其默認架構(gòu)為guest;否則右擊鼠標在菜單中選擇“新建用戶”選項,出現(xiàn)“數(shù)據(jù)庫用戶-新建”對話框,建立相應(yīng)的用戶。最后,在sample_st數(shù)據(jù)庫的“安全性?架構(gòu)?guest?屬性?權(quán)限”中,為test1和test2用戶分配相應(yīng)權(quán)限。
3、用Grant、Revoke命令實現(xiàn)對用戶的授權(quán)和收權(quán)。
4、用Create命令創(chuàng)建數(shù)據(jù)表驗證授權(quán)和收權(quán)是否成功。
5、以系統(tǒng)管理員身份登錄SQL Server。使用:“GRANT SELECT ON SC TO Test1 WITH GRANT OPTION”命令,再分別以Test1和Test2身份登錄,進行授權(quán)及查詢數(shù)據(jù)表,驗證“WITH GRANT OPTION”能否成功執(zhí)行。
6、以系統(tǒng)管理員身份使用“REVOKE”命令回收上述授權(quán)。
實驗6 數(shù)據(jù)庫的完整性
一、實驗?zāi)康?/p>
通過實驗掌握數(shù)據(jù)庫完整性概念,掌握利用SQL Server 2005實現(xiàn)數(shù)據(jù)庫完整性的基本方法和步驟。
二、實驗環(huán)境
Windows XP操作系統(tǒng),SQL Server 2005軟件。
三、實驗課時
2課時。
四、實驗內(nèi)容
1、建立關(guān)系模式。
完成教材P164第6題,用SQL語言定義“職工”和“部門”兩個關(guān)系模式: 職工(職工號,姓名,年齡,職務(wù),工資,部門號),職工號為主碼 部門(部門號,名稱,經(jīng)理名,電話), 部門號為主碼 要求在模式中完成以下完整性約束條件的定義:(1)定義每個模式的主碼;(2)定義參照完整性;
(3)定義職工年齡不得超過60歲;(4)定義部門名稱必須取值唯一。
2、驗證完整性約束。
使用Insert Values語句向兩個表中各插入5~10條記錄,對下列內(nèi)容進行驗證。(1)驗證主鍵約束:“職工”和“部門”兩個表中是否能接受主碼值相同的記錄,通過實例驗證。
(2)驗證唯一約束:“部門”表中是否能接受名稱相同的兩個不同記錄?為什么?
(3)驗證檢查約束:“職工”表中能否接受年齡不滿足條件的記錄?為什么?
(4)驗證參照完整性:若“部門”表中不存在部門號為“008”的記錄,是否能在“職工”表中插入部門號為“008”的職工記錄?若刪除“001”部門的所有信息,正確的操作步驟是什么?
實驗7 數(shù)據(jù)庫設(shè)計實驗
一、實驗?zāi)康?/p>
通過實驗掌握數(shù)據(jù)庫設(shè)計的基本方法和步驟。
二、實驗環(huán)境
Windows XP操作系統(tǒng),SQL Server 2005軟件。
三、實驗課時
2課時。
四、實驗內(nèi)容
1、選定實驗題目,為某個單位或部門設(shè)計數(shù)據(jù)庫應(yīng)用系統(tǒng),比如:學生成績管理、機房上機管理、職工檔案管理、商品庫存管理、圖書管理、工資管理等。
2、根據(jù)選定的題目進行需求分析,重點分析數(shù)據(jù)需求和功能需求。
3、概念結(jié)構(gòu)設(shè)計:畫出E-R圖。
4、邏輯結(jié)構(gòu)設(shè)計:設(shè)計數(shù)據(jù)庫和數(shù)據(jù)表的具體結(jié)構(gòu),指出各表的屬性名稱、數(shù)據(jù)類型;說明各表的主碼及表之間的關(guān)聯(lián)情況;說明本設(shè)計是否已達到3NF要求。
5、簡要評價系統(tǒng)設(shè)計的優(yōu)點和不足。
五、實驗要求
1、提交設(shè)計報告,涵蓋實驗內(nèi)容的全部信息,不低于1000字。
2、提交建立應(yīng)用系統(tǒng)數(shù)據(jù)庫的代碼,所有數(shù)據(jù)表中的記錄總數(shù)不低于50條。(請參照實驗2的附錄建立數(shù)據(jù)庫)
實驗8 存儲過程實驗
一、實驗?zāi)康?/p>
通過實驗熟悉使用存儲過程進行數(shù)據(jù)庫應(yīng)用程序設(shè)計的方法
二、實驗環(huán)境
Windows XP操作系統(tǒng),SQL Server 2005軟件。
三、實驗課時
2課時。
四、實驗內(nèi)容
對sample_st數(shù)據(jù)庫,編寫存儲過程,完成下面功能
1、統(tǒng)計任意一門課程的平均成績
2、統(tǒng)計所有課程的平均成績
3、統(tǒng)計任意一門課程的成績分布情況,即按照分數(shù)段統(tǒng)計人數(shù)(即<60、60-69、70-79、80-89、90以上)
第四篇:數(shù)據(jù)庫原理實驗教案
《數(shù)據(jù)庫原理》課程實驗
實驗1 創(chuàng)建數(shù)據(jù)庫和數(shù)據(jù)表
一、實驗?zāi)康?/p>
熟悉SQL Server Management Studio界面;掌握通過圖形化向?qū)Ш蛨?zhí)行Transact-SQL語句創(chuàng)建數(shù)據(jù)庫的方法。
二、實驗環(huán)境
Windows XP操作系統(tǒng),SQL Server 2005軟件。
三、實驗課時
2課時。
四、實驗內(nèi)容
SQL Server中的一個數(shù)據(jù)庫必須至少包含一個數(shù)據(jù)文件和一個事務(wù)日志文件,所以創(chuàng)建數(shù)據(jù)庫就是建立主數(shù)據(jù)文件和日志文件。
在SQL Server 2005中創(chuàng)建數(shù)據(jù)庫的方法主要有兩種:一是在SQL Server Management Studio窗口中使用可視化界面,通過方便的圖形化向?qū)?chuàng)建,二是通過執(zhí)行Transact-SQL語句創(chuàng)建。
(一)向?qū)Х绞絼?chuàng)建
1、從“開始”菜單選擇“所有程序”→“Microsoft SQL Server 2005”,打開“SQL Server Management Studio”窗口,使用Windows或SQL Server身份驗證建立連接。
2、在“對象資源管理器”窗格中展開服務(wù)器,選擇“數(shù)據(jù)庫”節(jié)點右擊,從彈出的快捷菜單中選擇“新建數(shù)據(jù)庫”命令,打開“新建數(shù)據(jù)庫”窗口。
3、該窗口中有3個頁,分別是“常規(guī)”、“選項”和“文件組”,完成這3個頁的內(nèi)容即可完成數(shù)據(jù)庫的創(chuàng)建。這里,我們僅設(shè)置“常規(guī)”的相應(yīng)內(nèi)容,其他2個頁的內(nèi)容按照默認設(shè)置即可。
(1)“數(shù)據(jù)庫名稱”文本框中輸入數(shù)據(jù)庫的名稱,如“sample_st”,再輸入該數(shù)據(jù)庫的所有者,這里使用默認值即可。(也可以通過單擊文本框右邊的“瀏覽”按鈕選擇所有者。
(2)“數(shù)據(jù)庫文件”列表中包括兩行,一個是數(shù)據(jù)文件,一個是日志文件。通過單擊下面相應(yīng)的按鈕可以添加或刪除相應(yīng)的數(shù)據(jù)文件。
? 邏輯名稱:指定該文件的文件名。
? 文件類型:用于區(qū)別當前文件是數(shù)據(jù)文件還是日志文件。? 文件組:顯示當前數(shù)據(jù)庫文件所屬的文件組。
? 初始大小:指定該文件的初始容量。在SQL Server 2005中數(shù)據(jù)文件的默認值為3MB,日志文件的默認值為1MB。? 自動增長:用于設(shè)置在文件容量不夠用時,文件根據(jù)何種增長方式自動增長。
? 路徑:指定存放在文件的目錄。默認情況下,SQL Server 2005將存放路徑設(shè)置為其安裝目錄下的data子目錄,單擊該列中的按鈕可以在打開的“定位文件夾”對話框中更改數(shù)據(jù)庫的存儲路徑。
完成上述操作后,單擊“確定”按鈕關(guān)閉“新建數(shù)據(jù)庫”窗口,即完成了數(shù)據(jù)庫的創(chuàng)建,可以在“對象資源管理器”窗格中看到新建的數(shù)據(jù)庫。
(二)語言方式創(chuàng)建
SQL Server 2005使用的Transact-SQL語言是標準SQL的增強版本,使用它提供的Create Database語句同樣可以完成對數(shù)據(jù)庫的建立(參考內(nèi)容見附錄)。
1、單擊“新建查詢”按鈕,創(chuàng)建一個查詢輸入窗口將附錄中的語句復制到該窗口。選擇創(chuàng)建數(shù)據(jù)庫的命令,單擊工具欄中的“分析”按鈕,可以檢查語法錯誤;單擊“執(zhí)行”按鈕即可執(zhí)行語句,在查詢窗口內(nèi)的“查詢”窗格中可以看到“命令已成功完成”的提示消息。在“對象資源管理器”窗格中刷新,即可看到新建的數(shù)據(jù)庫。
2、繼續(xù)執(zhí)行Create Database之后的語句,在“sample_st”數(shù)據(jù)庫中用Create Table命令依次建立Student、Course和SC這三個數(shù)據(jù)表,并建立各自的約束及它們之間的聯(lián)系(外鍵),利用Insert命令為各數(shù)據(jù)表添加數(shù)據(jù)。
(三)知識鞏固
用SQL-DDL語言創(chuàng)建“產(chǎn)品訂購”數(shù)據(jù)庫,包含四個數(shù)據(jù)表S、P、J和SPJ,表結(jié)構(gòu)及內(nèi)容見教材P122。
實驗2 數(shù)據(jù)庫的簡單查詢
一、實驗?zāi)康?/p>
掌握單表查詢中各個子句(Select、From、Where、Group、Having、Order)的用法,特別要掌握比較運算符和邏輯運算符的使用。
二、實驗環(huán)境
Windows XP操作系統(tǒng),SQL Server 2005軟件。
三、實驗課時
2課時。
四、實驗內(nèi)容
在已建立的數(shù)據(jù)庫和數(shù)據(jù)表的基礎(chǔ)上,用Select語句完成下列查詢操作。
1、查詢?nèi)w學生的學號和姓名。
2、查詢?nèi)w學生的所有基本信息(僅針對Student表)。
3、對SC表查詢?nèi)w學生的選課記錄,在顯示結(jié)果中為“Grade”列增加5分。
4、查詢?nèi)w學生的學號和姓名,將原來的英文列名設(shè)置中文別名。
5、顯示所有選課學生的學號,去掉重復結(jié)果。
6、查詢成績在80分以上的學生選課記錄。
7、查詢經(jīng)濟系所有學生的學號和姓名。
8、查詢成績在80~90分的學生選課記錄。
9、查詢年齡不在22~25的學生記錄。
10、查詢所有姓“劉”的學生記錄。
11、查詢無考試成績(成績?yōu)榭罩担┑膶W號、課程號。
12、查詢考試成績非空值的學號、課程號。
13、查詢數(shù)學系年齡小于20歲的學生記錄。
14、查詢選修了“101”或“102”課程的選課記錄。
15、查詢學生總?cè)藬?shù)。
16、查詢選修了課程的學生人數(shù)。
17、查詢選修了“101”課程的學生的平均成績。
18、查詢學號為“01003”的學生的考試總成績。
19、查詢“101”課程的最高分和最低分。20、查詢每門課程的選課人數(shù)。
21、查詢每個學生的學號、選課數(shù)、平均成績和總成績。
22、查詢選課數(shù)超過2的學生學號及其選課數(shù)。
23、查詢所有學生信息,查詢結(jié)果按年齡降序排列。(針對Student表操作)
24、查詢所有學生信息,查詢結(jié)果按系名升序,同系學生按年齡降序排列。
25、查詢選課數(shù)超過2的學生學號及其選課數(shù),查詢結(jié)果按選課數(shù)降序排列。
實驗3 數(shù)據(jù)庫的多表查詢
一、實驗?zāi)康?/p>
繼續(xù)熟練SQL-SELECT語句的使用;理解多表查詢的概念;掌握多表連接查詢中各個子句的用法,特別要比較內(nèi)連接和外連接的結(jié)果。掌握非相關(guān)子查詢、相關(guān)子查詢的用法,理解它們的執(zhí)行過程;學會在SQL Server中用Exists實現(xiàn)交運算,用Not Exists實現(xiàn)差運算。
二、實驗環(huán)境
Windows XP操作系統(tǒng),SQL Server 2005軟件。
三、實驗課時
2課時。
四、實驗內(nèi)容
(一)、在已建立的數(shù)據(jù)庫和數(shù)據(jù)表的基礎(chǔ)上,用Select語句的連接查詢完成下列操作。
1、查詢每個學生的基本信息及其選課情況。
2、查詢選修“101”課程的學生學號、姓名和成績。
3、查詢與“李平”在同一個系學習的學生記錄。
4、查詢與“李平”年齡相同的學生記錄。
5、查詢選修課程名為“數(shù)據(jù)庫原理”的選課記錄。
6、查詢選修課程名為“數(shù)據(jù)庫原理”的學生記錄。
7、查詢選修“101”課程且成績≥90的學號、姓名和成績。
8、查詢“李平”的所有選課記錄。
9、查詢數(shù)學系學生選修的課程號,要求結(jié)果中去掉重復記錄。
10、查詢計算機系選修課程數(shù)≥2的學號、姓名及平均成績,查詢結(jié)果按平均成績降序。
11、查詢每個學生的學號、選修課程號、課程名及成績。
12、查詢所有學生的選修情況(包括選課和未選課的學生),要求顯示學號、姓名、課程號和成績。
(二)、在已建立的數(shù)據(jù)庫和數(shù)據(jù)表的基礎(chǔ)上,用Select語句的嵌套查詢完成下列操作(含EXISTS量詞)。
1、查詢選修“101”課程且成績≥90的學號、姓名。
2、查詢“李平”的所有選課記錄。
3、查詢與“李平”在同一個系學習的學生記錄。
4、查詢與“李平”年齡相同的學生記錄。
5、查詢選修課程名為“數(shù)據(jù)庫原理”的選課記錄,輸出結(jié)果包括學號和成績。
6、查詢選修課程名為“數(shù)據(jù)庫原理”的學生記錄,輸出結(jié)果包括學號、姓名和所在系。
7、查詢學號為“01003”學生的選修課程號和課程名。
8、查詢沒有選修“101”課程的學生學號和姓名。
9、查詢選修“101”課程或“102”課程的學生姓名。
10、查詢選修“101”課程和“102”課程的學生學號。
11、查詢選修“101”課程但沒選修“102”課程的學生學號。
12、查詢沒有選修任何課程的學生記錄,輸出結(jié)果包括學號、姓名和所在系。
13、查詢數(shù)學系學生選修的課程號,要求結(jié)果中去掉重復記錄。
14、查詢選修課程至少包含“01003”選修課程的學生學號。實驗4 數(shù)據(jù)庫更新、視圖定義及使用
一、實驗?zāi)康?/p>
掌握Insert、Update、Delete語句的使用;對于Insert語句,要求理解默認值約束、空值約束在插入記錄時所起的作用。理解視圖的概念,掌握Create View、Drop View等語句的使用;掌握基于視圖的查詢語句的使用。
二、實驗環(huán)境
Windows XP操作系統(tǒng),SQL Server 2005軟件。
三、實驗課時
2課時。
四、實驗內(nèi)容
(一)、在已建立的數(shù)據(jù)庫和數(shù)據(jù)表的基礎(chǔ)上,向數(shù)據(jù)庫中添加一個臨時表ST(sno,sname,dept,sage,cno,cname,score)。用Insert語句向臨時表輸入數(shù)據(jù),輸入有誤時用Update語句進行修改。再用三個更新語句完成下列操作。
1、向Student表添加若干新記錄,內(nèi)容自定。(觀察已定義的表的約束情況)
2、向SC表添加新記錄,內(nèi)容自定,不低于10條(注意不能違反參照完整性)。
3、為臨時表ST添加記錄。
4、把Student表的所有行及其對應(yīng)的選課一次性地加到臨時表ST中。
5、在ST表中把所有學生的成績加2分。
6、在ST表中把所有學生的年齡增加1。
7、在ST表中把“李平”的所在系改為“計算機”。
8、在ST表中將選修課程“數(shù)據(jù)庫原理”的學生成績加2分。
9、在SC表中刪除所有成績?yōu)榭罩档倪x修記錄。
10、刪除計算機系選修成績不及格的選課記錄。
(二)、在已建立的數(shù)據(jù)庫和數(shù)據(jù)表的基礎(chǔ)上,完成下列操作。
1、建立數(shù)學系學生的視圖MAST。
2、建立計算機系選修課程名為“數(shù)據(jù)庫原理”的學生視圖,視圖名:CSTVIEW,該視圖中應(yīng)包括屬性列:學號、姓名、成績。
3、創(chuàng)建一個名為STSUMVIEW的視圖,包括所有學生的學號和總成績。
4、建立學生選課視圖SCVIEW,包括所有學生的學號、姓名、課程號、課程名和成績。
5、通過MAST視圖查詢學生基本信息。
6、通過SCVIEW查詢成績大于90分的學生的學號和成績。
7、查詢計算機系選修課程名為“數(shù)據(jù)庫原理”并且成績大于85分的學生的學號和成績。
8、通過MAST視圖將學號為“01008”學生的年齡修改為21歲。
9、通過MAST視圖將學號為“01009”學生所在系改為“經(jīng)濟”,是否能成功執(zhí)行?若不能成功請說明理由;若修改成功,請再次通過MAST視圖查詢學生基本信息,是否能查詢到該生?若不能查詢請說明理由。
10、通過SCVIEW視圖將學號為“01004”學生的總成績修改為380分,是否能成功執(zhí)行?若不能成功請說明理由。
實驗5 數(shù)據(jù)庫的安全與保護
一、實驗?zāi)康?/p>
理解SQL Server的用戶與權(quán)限管理機制,掌握用對象資源管理器創(chuàng)建服務(wù)器登錄帳號,并同時建立用戶。掌握如何為給定的用戶分配權(quán)限。
二、實驗環(huán)境
Windows XP操作系統(tǒng),SQL Server 2005軟件。
三、實驗課時
2課時。
四、實驗內(nèi)容
用戶與權(quán)限管理
(1)打開“SQL Server Management Studio”窗口,使用對象資源管理器創(chuàng)建兩個服務(wù)器登錄帳號Test1和Test2,并在“sample_st”數(shù)據(jù)庫中創(chuàng)建兩個對應(yīng)的同名用戶。設(shè)置Test1用戶和Test2用戶的默認架構(gòu)為guest。
(2)使用Test1身份登錄,并為Test2分配創(chuàng)建數(shù)據(jù)表的權(quán)限;用Test2身份登錄來驗證權(quán)限分配成功。
(3)使用Test1身份登錄,收回剛剛分配給Test2的創(chuàng)建數(shù)據(jù)表的權(quán)限;用Test2身份登錄來驗證權(quán)限回收成功。
五、實驗步驟
1、使用對象資源管理器創(chuàng)建兩個服務(wù)器登錄帳號。以系統(tǒng)管理員身份登錄SQL Server。打開“SQL Server Management Studio”窗口,在對象資源管理器列表中,打開展開“安全性”文件夾,選擇“登錄名”圖標,單擊鼠標右鍵,在彈出的菜單中選擇“新建登錄名”。在打開的對話框中依次建立Test1和Test2,選擇“SQL Server身份驗證”,同時還要輸入密碼,默認數(shù)據(jù)庫為“sample_st”。
(2)在“用戶映射”中列出了當前登錄帳號可以選擇訪問的數(shù)據(jù)庫如“sample_st”,在其左側(cè)的復選框中打勾,表示當前登錄帳號可以訪問對應(yīng)的數(shù)據(jù)庫,默認用戶名與登錄帳號相同。
(3)單擊“確定”按鈕完成創(chuàng)建。
2、創(chuàng)建新的數(shù)據(jù)庫用戶。
在對象資源管理器中選中要訪問操作的數(shù)據(jù)庫,展開“安全性”文件夾,在“用戶”文件夾中查找是否已建立與登錄名Test1和Test2同名的數(shù)據(jù)庫用戶,若已建立,則在屬性中修改其默認架構(gòu)為guest;否則右擊鼠標在菜單中選擇“新建用戶”選項,出現(xiàn)“數(shù)據(jù)庫用戶-新建”對話框,建立相應(yīng)的用戶。
3、用Grant、Revoke命令實現(xiàn)對用戶的授權(quán)和收權(quán)。
4、用Create命令創(chuàng)建數(shù)據(jù)表驗證授權(quán)和收權(quán)是否成功。
5、以系統(tǒng)管理員身份登錄SQL Server。使用:“GRANT SELECT ON SC TO Test1 WITH GRANT OPTION”命令,再分別以Test1和Test2身份登錄,進行授權(quán)及查詢數(shù)據(jù)表,驗證“WITH GRANT OPTION”能否成功執(zhí)行。
6、以系統(tǒng)管理員身份使用“REVOKE”命令回收上述授權(quán)。
實驗6 數(shù)據(jù)庫的事務(wù)及并發(fā)控制
一、實驗?zāi)康?/p>
通過實驗加深學生對事務(wù)的基本概念理解語掌握;加深學生對并發(fā)控制的基本概念理解,認識不正確的并發(fā)控制所帶來的危害;加深學生對鎖的基本概念的掌握與理解,認識鎖帶來的問題;
二、實驗環(huán)境
Windows XP操作系統(tǒng),SQL Server 2005軟件。
三、實驗課時
2課時。
四、實驗內(nèi)容
1、事務(wù)的控制
數(shù)據(jù)準備:執(zhí)行如下命令Select * into ##temp from student,將student的數(shù)據(jù)倒入到##temp表中。? 啟動事務(wù),執(zhí)行刪除后,回滾事務(wù)
? ? ? ? ? ? 選擇##temp的數(shù)據(jù),察看記錄總數(shù) 顯式啟動事務(wù) 刪除##temp表的數(shù)據(jù)
選擇##temp數(shù)據(jù),察看記錄總數(shù) 回滾事務(wù)
選擇##temp數(shù)據(jù),察看記錄總數(shù)
? 啟動事務(wù),執(zhí)行刪除后,提交事務(wù)
?
選擇##temp數(shù)據(jù),察看記錄總數(shù) ? ? ? ? ? 顯式啟動事務(wù) 刪除##temp表的數(shù)據(jù)
選擇##temp的數(shù)據(jù),察看記錄總數(shù) 回滾事務(wù)
選擇##temp數(shù)據(jù),察看記錄總數(shù)
比較這兩次執(zhí)行效果的差異,為什么會有這些差異?
2、事務(wù)的隔離級別試驗
數(shù)據(jù)準備:執(zhí)行如下命令Select * into ##temp from student,將student的數(shù)據(jù)倒入到##temp表中。? 臟讀
? 啟動兩個分析器,分別叫(A,B)
? 在A中,選擇##temp表中數(shù)據(jù),察看記錄總數(shù) ? 在A中,顯式啟動事務(wù) ? 在A中,刪除##temp表的數(shù)據(jù)
? 在B中,將事務(wù)隔離級別設(shè)為UNCOMMITTED ? 在該查詢分析器中選擇##temp表數(shù)據(jù),察看記錄總數(shù) ? 回到先前窗口,回滾事務(wù) ? 選擇##temp數(shù)據(jù),察看記錄總數(shù) ? 再次切查詢分析器窗口
? 選擇##temp數(shù)據(jù),察看記錄總數(shù) 觀察結(jié)果,為什么會有這些現(xiàn)象? ? 不可重復讀
? 啟動兩個分析器,分別叫(A,B)
? 在A中,顯式啟動事務(wù),察看dept = 'math'的記錄(注意地址中的數(shù)據(jù))
? 在B中,顯式啟動事務(wù),察看dept = 'math'的記錄。在B中,將dept = 'math’地址更新為’AAAAAA’
? 在B中,再次察看dept = 'math'的記錄。在B中,提交事務(wù) ? 在A中,再次察看dept = 'math'的記錄。? 在A中,提交事務(wù)
觀察結(jié)果,為什么會有這些現(xiàn)象? ? 丟失修改
? 啟動兩個查詢分析器,分別叫(A,B)
? 在A中,顯式啟動事務(wù),察看dept = 'math'的記錄(注意地址中的數(shù)據(jù))
? 在B中,顯式啟動事務(wù),察看dept = 'math'的記錄。? 在B中,將dept = 'math’地址更新為’AAAAAA’ ? 在B中,再次察看dept = 'math'的記錄。? 在B中,提交事務(wù)
? 在A中,再次察看dept = 'math'的記錄。? 在A中,將dept = 'math’地址更新為’BBBBBB’ ? 在A中,提交事務(wù)
? 在A,B窗口分別察看dept = 'math’的記錄,結(jié)果如何? ? 鎖的模擬
? 啟動兩個分析器,分別叫(A,B)
? 在A中,顯式啟動事務(wù),察看dept = 'math'的記錄 ? 在B中,顯式啟動事務(wù),察看dept = 'math'的記錄 ? 在B中,將dept = 'math’地址更新為’AAAAAA’ ? 在A中,將dept = 'math’地址更新為’BBBBBB’ 觀察A窗口的結(jié)果,為什么?
事務(wù)隔離級別設(shè)置:set transaction isolation level {read committed, read uncommitted, repeatable read, serializable}
實驗7 數(shù)據(jù)庫設(shè)計實驗
一、實驗?zāi)康?/p>
通過實驗掌握數(shù)據(jù)庫設(shè)計的基本方法和步驟。
二、實驗環(huán)境
Windows XP操作系統(tǒng),SQL Server 2005軟件。
三、實驗課時
2課時。
四、實驗內(nèi)容
1、選定實驗題目,為某個單位或部門設(shè)計數(shù)據(jù)庫應(yīng)用系統(tǒng),比如:學生成績管理、機房上機管理、職工檔案管理、商品庫存管理、圖書管理、工資管理等。
2、根據(jù)選定的題目進行需求分析,重點分析數(shù)據(jù)需求和功能需求。
3、概念結(jié)構(gòu)設(shè)計:畫出E-R圖。步驟如下:
(1)設(shè)計局部E-R圖。設(shè)計依據(jù)是需求分析階段的DFD/DD。主要內(nèi)容是確定實體集合、聯(lián)系、屬性及主關(guān)鍵字
(2)集成局部E-R圖。集成時要解決沖突和冗余等問題。(3)合并局部E-R圖。合并局部E-R圖中相同部分,盡可能的保留特殊部分,刪除冗余部分,用累加的方式集成若干個局部E-R圖。
(4)優(yōu)化全局E-R圖,得到最佳的全局E-R圖方案。
4、邏輯結(jié)構(gòu)設(shè)計:設(shè)計數(shù)據(jù)庫和數(shù)據(jù)表的具體結(jié)構(gòu),指出各表的屬性名稱、數(shù)據(jù)類型;說明各表的主碼及表之間的關(guān)聯(lián)情況;說明本設(shè)計是否已達到3NF要求。
5、簡要評價系統(tǒng)設(shè)計的優(yōu)點和不足。
五、實驗要求
1、提交設(shè)計報告,涵蓋實驗內(nèi)容的全部信息,不低于1000字。
2、提交建立應(yīng)用系統(tǒng)數(shù)據(jù)庫的代碼,所有數(shù)據(jù)表中的記錄總數(shù)不低于50條。
實驗8 存儲過程實驗
一、實驗?zāi)康?/p>
通過實驗熟悉使用存儲過程進行數(shù)據(jù)庫應(yīng)用程序設(shè)計的方法
二、實驗環(huán)境
Windows XP操作系統(tǒng),SQL Server 2005軟件。
三、實驗課時
2課時。
四、實驗內(nèi)容
對sample_st數(shù)據(jù)庫,編寫存儲過程,完成下面功能
1、統(tǒng)計任意一門課程的平均成績
2、統(tǒng)計所有課程的平均成績
3、統(tǒng)計任意一門課程的成績分布情況,即按照分數(shù)段統(tǒng)計人數(shù)(即<60、60-69、70-79、80-89、90以上)
第五篇:數(shù)據(jù)庫編程總結(jié)(推薦)
數(shù)據(jù)庫編程總結(jié)
當前各種主流數(shù)據(jù)庫有很多,包括Oracle, MS SQL Server, Sybase, Informix, MySQL, DB2, Interbase / Firebird, PostgreSQL, SQLite, SAP/DB, TimesTen, MS ACCESS等等。數(shù)據(jù)庫編程是對數(shù)據(jù)庫的創(chuàng)建、讀寫等一列的操作。數(shù)據(jù)庫編程分為數(shù)據(jù)庫客戶端編程與數(shù)據(jù)庫服務(wù)器端編程。數(shù)據(jù)庫客戶端編程主要使用ODBC API、ADO、ADO.NET、OCI、OTL等方法;數(shù)據(jù)庫服務(wù)端編程主要使用OLE DB等方法。數(shù)據(jù)庫編程需要掌握一些訪問數(shù)據(jù)庫技術(shù)方法,還需要注意怎么設(shè)計高效的數(shù)據(jù)庫、數(shù)據(jù)庫管理與運行的優(yōu)化、數(shù)據(jù)庫語句的優(yōu)化。
一、訪問數(shù)據(jù)庫技術(shù)方法
數(shù)據(jù)庫編程分為數(shù)據(jù)庫客戶端編程與數(shù)據(jù)庫服務(wù)器端編程。數(shù)據(jù)庫客戶端編程主要使用ODBC API、ADO、ADO.NET、OCI、OTL等方法;數(shù)據(jù)庫服務(wù)端編程主要使用OLE DB等方法。
1、幾種是數(shù)據(jù)庫訪問方法比較
ODBC
API是一種適合數(shù)據(jù)庫底層開發(fā)的編程方法,ODBC
API提供大量對數(shù)據(jù)源的操作,ODBC
API能夠靈活地操作游標,支持各種幫定選項,在所有ODBC相關(guān)編程中,API編程具有最高的執(zhí)行速度。DAO提供了很好的數(shù)據(jù)庫編程的對象模型.但是,對數(shù)據(jù)庫的所有調(diào)用以及輸出的數(shù)據(jù)都必須通過Access/Jet數(shù)據(jù)庫引擎,這對于使用數(shù)據(jù)庫應(yīng)用程序,是嚴重的瓶頸。
OLE
DB提供了COM接口,與傳統(tǒng)的數(shù)據(jù)庫接口相比,有更好的健壯性和靈活性,具有很強的錯誤處理能力,能夠同非關(guān)系數(shù)據(jù)源進行通信。
ADO最主要的優(yōu)點在于易于使用、速度快、內(nèi)存支出少和磁盤遺跡小。
ADO.NET 是利用數(shù)據(jù)集的概念將數(shù)據(jù)庫數(shù)據(jù)讀入內(nèi)存中,然后在內(nèi)存中對數(shù)據(jù)進行操作,最后將數(shù)據(jù)集數(shù)據(jù)回寫到源數(shù)據(jù)庫中。
OTL 是 Oracle, Odbc and DB2-CLI Template Library 的縮寫,是一個C++編譯中操控關(guān)系數(shù)據(jù)庫的模板庫,OTL中直接操作Oracle主要是通過Oracle提供的OCI接口進行,進行操作DB2數(shù)據(jù)庫則是通過CLI接口來進行,至于MS的數(shù)據(jù)庫和其它一些數(shù)據(jù)庫,則OTL只提供了ODBC來操作的方式。當然Oracle和DB2也可以由OTL間接使用ODBC的方式來進行操縱。具有以下優(yōu)點:跨平臺;運行效率高,與C語言直接調(diào)用API相當;開發(fā)效率高,起碼比ADO.net使用起來更簡單,更簡潔;部署容易,不需要ADO組件,不需要.net framework 等。
2、VC數(shù)據(jù)庫編程幾種方法
VC數(shù)據(jù)庫編程幾種方法,包括ODBC連接、MFC
ODBC連接、DAO連接、OLE
DB、OLE
DB
Templates連接、ADO、Oracle專用方法(OCI(Oracle
Call
Interface)訪問、Oracle
Object
OLE
C++
Class
Library)。
<1.>通用方法
1.ODBC連接
ODBC(Open
DataBase
Connectivity)是MSOA的一部分,是一個標準數(shù)據(jù)庫接口。它提供對關(guān)系數(shù)據(jù)庫訪問的統(tǒng)一接口,實現(xiàn)對異構(gòu)數(shù)據(jù)源的一致訪問。ODBC數(shù)據(jù)訪問由以下部分組成:
<1>句柄(Handles):ODBC使用句柄來標識ODBC環(huán)境、連接、語句和描述器.<2>緩存區(qū)(Buffers):
<3>數(shù)據(jù)類型(Data
types)
<4>一致性級別(Conformance
levels)
用ODBC設(shè)計客戶端的一般步驟:
<1>分配ODBC環(huán)境
<2>分配連接句柄
<3>連接數(shù)據(jù)源
<4>構(gòu)造和執(zhí)行SQL語句
<5>獲得查詢結(jié)果
<6>斷開數(shù)據(jù)源的連接
<7>釋放ODBC環(huán)境
ODBC
API是一種適合數(shù)據(jù)庫底層開發(fā)的編程方法,ODBC
API提供大量對數(shù)據(jù)源的操作,ODBC
API能夠靈活地操作游標,支持各種幫定選項,在所有ODBC相關(guān)編程中,API編程具有最高的執(zhí)行速度.因此,ODBC
API編程屬于底層編程。
2.MFC
ODBC連接
MFC
ODBC是MFC對ODBC進行的封裝,以簡化對ODBC
API的 調(diào)用,從而實現(xiàn)面向?qū)ο蟮臄?shù)據(jù)庫編程接口.MFC
ODBC的封裝主要開發(fā)了CDatabase類和CRecordSet類
(1)CDatabase類
CDatabase類用于應(yīng)用程序建立同數(shù)據(jù)源的連接。CDatabase類中包含一個m_hdbc變量,它代表了數(shù)據(jù)源的連接句柄。如果要建立CDatabase類的實例,應(yīng)先調(diào)用該類的構(gòu)造函數(shù),再調(diào)用Open函數(shù),通過調(diào)用,初始化環(huán)境變量,并執(zhí)行與數(shù)據(jù)源的連接。在通過Close函數(shù)關(guān)閉數(shù)據(jù)源。
CDatabase類提供了對數(shù)據(jù)庫進行操作的函數(shù)及事務(wù)操作。
(2)CRecordSet類
CRecordSet類定義了從數(shù)據(jù)庫接收或者發(fā)送數(shù)據(jù)到數(shù)據(jù)庫的成員變量,以實現(xiàn)對數(shù)據(jù)集的數(shù)據(jù)操作。
CRecordSet類的成員變量m_hstmt代表了定義該記錄集的SQL語句句柄,m_nFields為記錄集中字段的個數(shù),m_nParams為記錄集所使用的參數(shù)個數(shù)。
CRecordSet的記錄集通過CDatabase實例的指針實現(xiàn)同數(shù)據(jù)源的連接,即CRecordSet的成員變量m_pDatabase.MFC
ODBC編程更適合于界面型數(shù)據(jù)庫應(yīng)用程序的開發(fā),但由于CDatabase類和CRecordSet類提供的數(shù)據(jù)庫操作函數(shù)有限,支持的游標類型也有限,限制了高效的數(shù)據(jù)庫開發(fā)。在編程層次上屬于高級編程。
應(yīng)用實例: 1.打開數(shù)據(jù)庫
CDatabase database;
database.OpenEx(_T(“DSN=zhuxue”),CDatabase::noOdbcDialog);//zhuxue為數(shù)據(jù)源名稱
2.關(guān)聯(lián)記錄集
CRecordset recset(&database);
3.查詢記錄
CString sSql1=“";
sSql1 = ”SELECT * FROM tablename“;
recset.Open(CRecordset::forwardOnly, sSql1, CRecordset::readOnly);
int ti=0;
CDBVariant var;//var可以轉(zhuǎn)換為其他類型的值
while(!recset.IsEOF())
{
//讀取Excel內(nèi)部數(shù)值
recset.GetFieldValue(”id“,var);
jiangxiang[ti].id=var.m_iVal;
recset.GetFieldValue(”name“, jiangxiang[ti].name);
ti++;
recset.MoveNext();
}
recset.Close();//關(guān)閉記錄集
4.執(zhí)行sql語句
CString sSql=”“;
sSql+=”delete * from 院系審核“;//清空表
database.ExecuteSQL(sSql);
sSql也可以為Insert ,Update等語句
5.讀取字段名
sSql = ”SELECT * FROM Sheet1“;
//讀取的文件有Sheet1表的定義,或為本程序生成的表.// 執(zhí)行查詢語句
recset.Open(CRecordset::forwardOnly, sSql, CRecordset::readOnly);
int excelColCount=recset.GetODBCFieldCount();//列數(shù)
CString excelfield[30];
//得到記錄集的字段集合中的字段的總個數(shù)
for(i=0;i { CODBCFieldInfo fieldinfo; recset.GetODBCFieldInfo(i,fieldinfo); excelfield[i].name =fieldinfo.m_strName;//字段名 } 6.打開excel文件 CString sDriver = ”MICROSOFT EXCEL DRIVER(*.XLS)“;// Excel安裝驅(qū)動 CString sSql,sExcelFile;//sExcelFile為excel的文件路徑 TRY { // 創(chuàng)建進行存取的字符串 sSql.Format(”DRIVER={%s};DSN='';FIRSTROWHASNAMES=1;READONLY=FALSE;CREATE_DB=/“%s/”;DBQ=%s“,sDriver, sExcelFile, sExcelFile); // 創(chuàng)建數(shù)據(jù)庫(既Excel表格文件) if(database.OpenEx(sSql,CDatabase::noOdbcDialog)) { //可以把excel作為一個數(shù)據(jù)庫操作 } } catch(e) { TRACE1(”Excel驅(qū)動沒有安裝: %s“,sDriver); AfxMessageBox(”讀取失敗,請檢查是否定義數(shù)據(jù)區(qū)Sheet1“); } 3.DAO連接 DAO(Data Access Object)是一組Microsoft Access/Jet數(shù)據(jù)庫引擎的COM自動化接口.DAO直接與Access/Jet數(shù)據(jù)庫通信.通過Jet數(shù)據(jù)庫引擎,DAO也可以同其他數(shù)據(jù)庫進行通信。DAO還封裝了Access數(shù)據(jù)庫的結(jié)構(gòu)單元,通過DAO可以直接修改Access數(shù)據(jù)庫的結(jié)構(gòu),而不必使用SQL的數(shù)據(jù)定義語言(DDL)。 DAO的體系結(jié)構(gòu)如下: DAO封裝的類: (1)CdaoWorkspace:對DAO工作區(qū)(數(shù)據(jù)庫處理事務(wù)管理器)的封裝 (2)CdaoDatabase:對DAO數(shù)據(jù)庫對象的封裝,負責數(shù)據(jù)庫連接.(3)CdaoRecordset:對DAO記錄集對象的封裝,代表所選的一組記錄.(4)CdaoTableDef:對表定義對象的封裝,代表基本表或附加表定義.(5)CdaoQueryDef:對查詢對象的封裝,包含所有查詢的定義.(6)CdaoException:DAO用于接收數(shù)據(jù)庫操作異常的類.(7)CDaoFieldExchange DAO提供了很好的數(shù)據(jù)庫編程的對象模型.但是,對數(shù)據(jù)庫的所有調(diào)用以及輸出的數(shù)據(jù)都必須通過Access/Jet數(shù)據(jù)庫引擎,這對于使用數(shù)據(jù)庫應(yīng)用程序,是嚴重的瓶頸。 DAO相對于ODBC來說,屬于高層的數(shù)據(jù)庫接口.4.OLE DB連接 OLE DB對ODBC進行了兩方面的擴展:一是提供了數(shù)據(jù)庫編程的OLE接口即COM,二是提供了一個可用于關(guān)系型和非關(guān)系型數(shù)據(jù)源的接口。 OLE DB提供了COM接口,與傳統(tǒng)的數(shù)據(jù)庫接口相比,有更好的健壯性和靈活性,具有很強的錯誤處理能力,能夠同非關(guān)系數(shù)據(jù)源進行通信。 與ODBC API一樣,OLE DB也屬于底層的數(shù)據(jù)庫編程接口,OLE DB結(jié)合了ODBC對關(guān)系數(shù)據(jù)庫的操作功能,并進行擴展,可以訪問非關(guān)系數(shù)據(jù)庫。 OLE DB訪問數(shù)據(jù)庫的原理如下: OLE DB程序結(jié)構(gòu): OLE DB由客戶(Consumer)和服務(wù)器(Provider)??蛻羰鞘褂脭?shù)據(jù)的應(yīng)用程序,它通過OLE DB接口對數(shù)據(jù)提供者的數(shù)據(jù)進行訪問和控制。OLE DB服務(wù)器是提供OLE DB接口的軟件組件。根據(jù)提供的內(nèi)容可以分為數(shù)據(jù)提供程序(Data Provider)和服務(wù)提供程序(Service Provider)。 程序結(jié)構(gòu)原理圖如下: <1>數(shù)據(jù)提供程序 數(shù)據(jù)提供程序擁有自己的數(shù)據(jù)并把數(shù)據(jù)以表格的形式呈現(xiàn)給使用者使用.<2>服務(wù)提供程序 服務(wù)提供程序是數(shù)據(jù)提供程序和使用者的結(jié)合。它是OLE DB體系結(jié)構(gòu)中的中間件,它是OLE DB數(shù)據(jù)源的使用者和數(shù)據(jù)使用程序的提供者 <3>數(shù)據(jù)使用程序 數(shù)據(jù)使用程序?qū)Υ鎯υ跀?shù)據(jù)提供程序中的數(shù)據(jù)進行使用和控制.OLE DB開發(fā)程序的一般步驟: <1>初始化COM環(huán)境 <2>連接數(shù)據(jù)源 <3>打開對話 <4>執(zhí)行命令 <5>處理結(jié)果 <6>清除對象 應(yīng)用實例: 使用OLEDB編寫數(shù)據(jù)庫應(yīng)用程序 1 概述 OLE DB的存在為用戶提供了一種統(tǒng)一的方法來訪問所有不同種類的數(shù)據(jù)源。OLE DB可以在不同的數(shù)據(jù)源中進行轉(zhuǎn)換。利用OLE DB,客戶端的開發(fā)人員在進行數(shù)據(jù)訪問時只需把精力集中在很少的一些細節(jié)上,而不必弄懂大量不同數(shù)據(jù)庫的訪問協(xié)議。OLE DB是一套通過COM接口訪問數(shù)據(jù)的ActiveX接口。這個OLE DB接口相當通用,足以提供一種訪問數(shù)據(jù)的統(tǒng)一手段,而不管存儲數(shù)據(jù)所使用的方法如何。同時,OLE DB還允許開發(fā)人員繼續(xù)利用基礎(chǔ)數(shù)據(jù)庫技術(shù)的優(yōu)點,而不必為了利用這些優(yōu)點而把數(shù)據(jù)移出來。 使用ATL使用OLE DB數(shù)據(jù)使用程序 由于直接使用OLE DB的對象和接口設(shè)計數(shù)據(jù)庫應(yīng)用程序需要書寫大量的代碼。為了簡化程序設(shè)計,Visual C++提供了ATL模板用于設(shè)計OLE DB數(shù)據(jù)應(yīng)用程序和數(shù)據(jù)提供程序。利用ATL模板可以很容易地將OLE DB與MFC結(jié)合起來,使數(shù)據(jù)庫的參數(shù)查詢等復雜的編程得到簡化。MFC提供的數(shù)據(jù)庫類使OLE DB的編程更具有面向?qū)ο蟮奶匦?。Viual C++所提供用于OLE DB的ATL模板可分為數(shù)據(jù)提供程序的模板和數(shù)據(jù)使用程序的模板。 使用ATL模板創(chuàng)建數(shù)據(jù)應(yīng)用程序一般有以下幾步驟: 1)、創(chuàng)建應(yīng)用框架 2)、加入ATL產(chǎn)生的模板類 3)、在應(yīng)用中使用產(chǎn)生的數(shù)據(jù)訪問對象3 不用ATL使用OLE DB數(shù)據(jù)使用程序 利用ATL模板產(chǎn)生數(shù)據(jù)使用程序較為簡單,但適用性不廣,不能動態(tài)適應(yīng)數(shù)據(jù)庫的變化。下面我們介紹直接使用MFC OLE DB類來生成數(shù)據(jù)使用程序。模板的使用 OLE DB數(shù)據(jù)使用者模板是由一些模板組成的,包括如下一些模板,下面對一些常用類作一些介紹。1)、會話類 CDataSource類 CDataSource類與OLE DB的數(shù)據(jù)源對象相對應(yīng)。這個類代表了OLE DB數(shù)據(jù)提供程序和數(shù)據(jù)源之間的連接。只有當數(shù)據(jù)源的連接被建立之后,才能產(chǎn)生會話對象,可以調(diào)用Open來打開數(shù)據(jù)源的連接。CSession類 CSession所創(chuàng)建的對象代表了一個單獨的數(shù)據(jù)庫訪問的會話。一個用CDataSource類產(chǎn)生的數(shù)據(jù)源對象可以創(chuàng)建一個或者多個會話,要在數(shù)據(jù)源對象上產(chǎn)生一個會話對象,需要調(diào)用函數(shù)Open()來打開。同時,會話對象還可用于創(chuàng)建事務(wù)操作。 CEnumeratorAccessor類 CEnumeratorAccessor類是用來訪問枚舉器查詢后所產(chǎn)生的行集中可用數(shù)據(jù)提供程序的信息的訪問器,可提供當前可用的數(shù)據(jù)提供程序和可見的訪問器。2)、訪問器類 CAcessor類 CAccessor類代表與訪問器的類型。當用戶知道數(shù)據(jù)庫的類型和結(jié)構(gòu)時,可以使用此類。它支持對一個行集采用多個訪問器,并且,存放數(shù)據(jù)的緩沖區(qū)是由用戶分配的。CDynamicAccessor類 CDynamicAccessor類用來在程序運行時動態(tài)的創(chuàng)建訪問器。當系統(tǒng)運行時,可以動態(tài)地從行集中獲得列的信息,可根據(jù)此信息動態(tài)地創(chuàng)建訪問器。CManualAccessor類 CManualAccessor類中以在程序運行時將列與變量綁定或者是將參數(shù)與變量捆定。3)、行集類 CRowSet類 CRowSet類封裝了行集對象和相應(yīng)的接口,并且提供了一些方法用于查詢、設(shè)置數(shù)據(jù)等??梢杂肕ove()等函數(shù)進行記錄移動,用GetData()函數(shù)讀取數(shù)據(jù),用Insert()、Delete()、SetData()來更新數(shù)據(jù)。CBulkRowset類 CBulkRowset類用于在一次調(diào)用中取回多個行句柄或者對多個行進行操作。CArrayRowset類 CArrayRowset類提供用數(shù)組下標進行數(shù)據(jù)訪問。4)、命令類 CTable類 CTable類用于對數(shù)據(jù)庫的簡單訪問,用數(shù)據(jù)源的名稱得到行集,從而得到數(shù)據(jù)。CCommand類 CCommand類用于支持命令的數(shù)據(jù)源。可以用Open()函數(shù)來執(zhí)行SQL命令,也可以Prepare()函數(shù)先對命令進行準備,對于支持命令的數(shù)據(jù)源,可以提高程序的靈活性和健壯性。 在stdafx.h頭文件里,加入如下代碼。#include 在打開數(shù)據(jù)源,會話,行集對象后就可以獲取數(shù)據(jù)了。所獲取的數(shù)據(jù)類型取決于所用的存取程序,可能需要綁定列。按以下步驟。 1、用正確的命令打開行集對象。 2、如果使用CManualAccessor,在使用之前與相應(yīng)列進行綁定。要綁定列,可以用函數(shù)GetColumnInfo,如下所示: // Get the column information ULONG ulColumns = 0;DBCOLUMNINFO* pColumnInfo = NULL;LPOLESTR pStrings = NULL;if(rs.GetColumnInfo(&ulColumns, &pColumnInfo, &pStrings)!= S_OK)AfxThrowOLEDBException(rs.m_pRowset, IID_IColumnsInfo);struct MYBIND* pBind = new MYBIND[ulColumns];rs.CreateAccessor(ulColumns, &pBind[0], sizeof(MYBIND)*ulColumns);for(ULONG l=0;l 3、用while循環(huán)來取數(shù)據(jù)。在循環(huán)中,調(diào)用MoveNext來測試光標的返回值是否為S_OK,如下所示: while(rs.MoveNext()== S_OK){ // Add code to fetch data here // If you are not using an auto accessor, call rs.GetData()} 4、在while循環(huán)內(nèi),可以通過不同的存取程序獲取數(shù)據(jù)。1)如果使用的是CAccessor類,可以通過使用它們的數(shù)據(jù)成員進行直接訪問。如下所示: 2)如果使用的是CDynamicAccessor 或CDynamicParameterAccessor 類,可以通過GetValue或GetColumn函數(shù)來獲取數(shù)據(jù)??梢杂肎etType來獲取所用數(shù)據(jù)類型。如下所示: while(rs.MoveNext()== S_OK){ // Use the dynamic accessor functions to retrieve your // data ULONG ulColumns = rs.GetColumnCount(); for(ULONG i=0;i { rs.GetValue(i); } } 3)如果使用的是CManualAccessor,可以指定自己的數(shù)據(jù)成員,綁定它們。就可以直接存取。如下所示: while(rs.MoveNext()== S_OK){ // Use the data members you specified in the calls to // AddBindEntry.wsprintf(”%s“, szFoo);} 決定行集的數(shù)據(jù)類型 在運行時決定數(shù)據(jù)類型,要用動態(tài)或手工的存取程序。如果用的是手工存取程序,可以用GetColumnInfo函數(shù)得到行集的列信息。從這里可以得到數(shù)據(jù)類型。4 總結(jié) 由于現(xiàn)在有多種數(shù)據(jù)源,想要對這些數(shù)據(jù)進行訪問管理的唯一途徑就是通過一些同類機制來實現(xiàn),如OLE DB。高級OLE DB結(jié)構(gòu)分成兩部分:客戶和提供者??蛻羰褂糜商峁┱呱傻臄?shù)據(jù)。 就像其它基于COM的多數(shù)結(jié)構(gòu)一樣,OLE DB的開發(fā)人員需要實現(xiàn)很多的接口,其中大部分是模板文件。 當生成一個客戶對象時,可以通過ATL對象向?qū)е赶蛞粋€數(shù)據(jù)源而創(chuàng)建一個簡單的客戶。ATL對象向?qū)z查數(shù)據(jù)源并創(chuàng)建數(shù)據(jù)庫的客戶端代理。從那里,可以通過OLE DB客戶模板使用標準的瀏覽函數(shù)。 當生成一個提供者時,向?qū)峁┝艘粋€很好的開端,它們僅僅是生成了一個簡單的提供者來列舉某一目錄下的文件。然后,提供者模板包含了OLE DB支持的完全補充內(nèi)容。在這種支持下,用戶可以創(chuàng)建OLE DB提供者,來實現(xiàn)行集定位策略、數(shù)據(jù)的讀寫以及建立書簽。應(yīng)用案例: Visual C++中使用OLE DB讀寫SQL Server 在需要對數(shù)據(jù)庫進行操作時,OLE DB總是被認為是一種效率最高但最難的方法。但是以我最近使用OLE DB的經(jīng)驗看來,OLE DB的效率高則高矣,但卻一點都不難。說它難恐怕主要是因為可參考的中文資料太少,為了幫助以后需要接觸OLE DB的同行,我撰寫了這篇文章。本文包含如下內(nèi)容: 1.OLE DB寫數(shù)據(jù)庫; 2.OLE DB讀數(shù)據(jù)庫; 3.OLE DB對二進制數(shù)據(jù)(text、ntext、image等)的處理。 首先來看看對SQL Server進行寫操作的代碼,有一定VC基礎(chǔ)的讀者應(yīng)該可以很順利地看懂。OLE DB寫數(shù)據(jù)庫,就是這么簡單! 注: 1.以下代碼中使用的模板類EAutoReleasePtr 2.以下代碼均在UNICODE環(huán)境下編譯,因為執(zhí)行的SQL語句必須是UNICODE的。設(shè)置工程為UNICODE的方法是:首先在project->settings->C/C++的屬性頁中的Preprocessor中,刪除_MBCS寫入UNICODE,_UNICODE。然后在link屬性頁中Category中選擇output,在Entry-Point symbol 中添加wWinMainCRTStartup。 EAutoReleasePtr //失敗,可能是因為數(shù)據(jù)庫沒有啟動、用戶名密碼錯等等 return;}EAutoReleasePtr //出錯 return;}EAutoReleasePtr //出錯 return;}hResult = ExecuteSQL(pICommand, pICommandText, _T(”USE PBDATA“));if(FAILED(hResult)){ //如果這里失敗,那就是SQL語句執(zhí)行失敗。在此處,就是PBDATA還未創(chuàng)建 return;} // 創(chuàng)建表 ExecuteSQL(pICommand, pICommandText, _T(”CREATE TABLE 2005_1(Volume real NOT NULL,ID int NOT NULL IDENTITY)“)); // 添加記錄 ExecuteSQL(pICommand, pICommandText, _T(”INSERT INTO 2005_1 VALUES(100.0)“));//...其中幾個函數(shù)的代碼如下: HRESULT ConnectDatabase(IDBInitialize** ppIDBInitialize, LPCTSTR pszDataSource, LPCTSTR pszUserID, LPCTSTR pszPassword){ ASSERT(ppIDBInitialize!= NULL && pszDataSource!= NULL && pszUserID!= NULL && pszPassword!= NULL); UINT uTimeout = 15U;// 連接數(shù)據(jù)庫超時(秒) TCHAR szInitStr[1024]; VERIFY(1023 >= wsprintf(szInitStr, _T(”Provider=SQLOLEDB;Data Source=%s;Initial Catalog=master;User Id=%s;Password=%s;Connect Timeout=%u“), pszDataSource, pszUserID, pszPassword, uTimeout)); //Initial Catalog=master指明連接成功后,”USE master“。 EAutoReleasePtr HRESULT hResult = ::CoCreateInstance(CLSID_MSDAINITIALIZE, NULL, CLSCTX_INPROC_SERVER,IID_IDataInitialize,(void**)&pIDataInitialize); if(FAILED(hResult)) { return hResult; } EAutoReleasePtr hResult = pIDataInitialize->GetDataSource(NULL, CLSCTX_INPROC_SERVER,(LPCOLESTR)szInitStr,IID_IDBInitialize,(IUnknown**)&pIDBInitialize); if(FAILED(hResult)) { return hResult; } hResult = pIDBInitialize->Initialize(); if(FAILED(hResult)) { return hResult; } * ppIDBInitialize = pIDBInitialize.Detach(); return S_OK;} HRESULT CreateSession(IDBInitialize* pIDBInitialize, IOpenRowset** ppIOpenRowset){ ASSERT(pIDBInitialize!= NULL && ppIOpenRowset!= NULL); EAutoReleasePtr HRESULT hResult = pIDBInitialize->QueryInterface(IID_IDBCreateSession,(void**)&pSession); if(FAILED(hResult)) { return hResult; } EAutoReleasePtr hResult = pSession->CreateSession(NULL, IID_IOpenRowset,(IUnknown**)&pIOpenRowset); if(FAILED(hResult)) { return hResult; } * ppIOpenRowset = pIOpenRowset.Detach(); return S_OK;} HRESULT CreateCommand(IOpenRowset* pIOpenRowset, ICommand** ppICommand, ICommandText** ppICommandText){ ASSERT(pIOpenRowset!= NULL && ppICommand!= NULL && ppICommandText!= NULL); HRESULT hResult; EAutoReleasePtr { EAutoReleasePtr hResult = pIOpenRowset->QueryInterface(IID_IDBCreateCommand,(void**)&pICreateCommand); if(FAILED(hResult)) { return hResult; } hResult = pICreateCommand->CreateCommand(NULL, IID_ICommand,(IUnknown**)&pICommand); if(FAILED(hResult)) { return hResult; } } EAutoReleasePtr hResult = pICommand->QueryInterface(&pICommandText); if(FAILED(hResult)) { return hResult; } * ppICommand = pICommand.Detach(); * ppICommandText = pICommandText.Detach(); return S_OK;} HRESULT ExecuteSQL(ICommand* pICommand, ICommandText* pICommandText, LPCTSTR pszCommand, LONG* plRowsAffected){ ASSERT(pICommand!= NULL && pICommandText!= NULL && pszCommand!= NULL && pszCommand[0]!= 0); HRESULT hResult = pICommandText->SetCommandText(DBGUID_DBSQL,(LPCOLESTR)pszCommand); if(FAILED(hResult)) { return hResult; } LONG lAffected; hResult = pICommand->Execute(NULL, IID_NULL, NULL, plRowsAffected == NULL ? &lAffected : plRowsAffected,(IUnknown**)NULL); return hResult;} 以上就是寫數(shù)據(jù)庫的全部代碼了,是不是很簡單呢?下面再來讀的。 // 先用與上面代碼中一樣的步驟獲取pICommand,pICommandText。此處省略 HRESULT hResult = pICommandText->SetCommandText(DBGUID_DBSQL,(LPCOLESTR)_T(”SELECT Volume FROM 2005_1 WHERE ID = @@IDENTITY"));//取我們剛剛添加的那一條記錄 if(FAILED(hResult)){ return;} LONG lAffected;EAutoReleasePtr return;} EAutoReleasePtr return;} // 一個根據(jù)表中各字段的數(shù)值類型而定義的結(jié)構(gòu),用于存儲返回的各字段的值 struct CLoadLastFromDB { DBSTATUS dwdsVolume; DWORD dwLenVolume; float fVolume;}; // 此處我們只查詢了一個字段。如果要查詢多個字段,CLoadLastFromDB中要添加相應(yīng)的字段定義,下面的dbBinding也要相應(yīng)擴充。dbBinding[].iOrdinal要分別指向各個字段,dbBinding[].wType要根據(jù)字段類型賦合適的值。 DBBINDING dbBinding[1];dbBinding[0].iOrdinal = 1; // Volume 字段的位置,從 1 開始 dbBinding[0].obValue = offsetof(CLoadLastFromDB, fVolume);dbBinding[0].obLength = offsetof(CLoadLastFromDB, dwLenVolume);dbBinding[0].obStatus = offsetof(CLoadLastFromDB, dwdsVolume);dbBinding[0].pTypeInfo = NULL;dbBinding[0].pObject = NULL;dbBinding[0].pBindExt = NULL;dbBinding[0].dwPart = DBPART_VALUE | DBPART_STATUS | DBPART_LENGTH;dbBinding[0].dwMemOwner = DBMEMOWNER_CLIENTOWNED;dbBinding[0].eParamIO = DBPARAMIO_NOTPARAM;dbBinding[0].cbMaxLen = 0;dbBinding[0].dwFlags = 0;