第一篇:2015-2 13計科數據庫編程 實驗教案 oracle11g
湘南學院 實驗教案
授課學期:2015年度第二學期 課程名稱:數據庫編程課時安排:專
業:計算機科學與技術班
級:年
級:任課教師:陸汝華
實驗 16課時
1班 2013級 實驗一 Oracle安裝配置與基本操作實驗
教學目的要求:
1.掌握Oracle數據庫的安裝,包括服務器端數據庫管理系統安裝和客戶端工具的安裝。2.掌握Oracle數據庫的登錄、啟動和關閉 重點:
Oracle 11g數據庫的安裝 難點:
服務端和客戶端的安裝 課時安排:實驗2課時
預備知識:
一、安裝:
1、選擇安裝方法:默認為基本安裝,一般選擇高級安裝
2、選擇安裝類型:企業版 標準版 個人版
一般選擇企業版
3、安裝位置:即ORACLE基目錄和主目錄設置
4、先決條件檢查
5、選擇配置選項:創建數據庫
6、選擇數據庫配置:一般用途/事務處理
7、輸入全局數據庫名和SID
8、數據庫存儲選項:數據文件存儲位置
9、備份和恢復選項
10、口令
11、概要
點擊安裝按鈕開始安裝,直到出現安裝結束界面。
二、操作:
1、程序組,系統服務,文件夾目錄等的變化
2、從開始進入SQL Plus進行登錄操作 用戶名:sys as sysdba
3、進入控制臺進行操作 https://localhost:1158/em
三、當oracle11g計算機名修改后需要重新配置 1 監聽程序配置 本地NET服務名配置 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 服務已經啟動成功。還可以通過修改資料檔案庫或新建數據庫來完成。
實驗內容:
1、Oracle服務端軟件的安裝;
2、Oracle數據庫的安裝;
3、Oracle數據庫客戶端的安裝;
4、Oracle數據庫的登錄、啟動和關閉等基本操作。實驗二 Oracle網絡結構與管理實驗
教學目的要求:
1.理解Oracle網絡服務組成及Oracle NET、監聽程序、管理連接器和網絡工具的功能和作用;
2.理解服務名、連接描述符、連接標識符等基本概念; 3.掌握Oracle網絡在服務器端和客戶端的配置方法。重點:
Oracle 服務器端監聽程序和網絡服務名的配置 難點:
Oracle 服務器端監聽程序的配置 課時安排:實驗2課時
預備知識:
一、監聽程序的配置
1、監聽程序配置文件內容
默認路徑為%Oracle-Home%networkadmin,存在文件名為listener.ora的配置文件,包含內容:配置監聽程序所監聽的一個或多個協議地址。配置監聽程序所支持的數據庫服務信息。設置控制監聽程序運行的參數。
2、監聽程序配置方法
使用ONCA或Oracle net manager修改配置文件listener.ora的內容,可以配置多個監聽程序,ONCA配置方法步驟如下。
(1)歡迎使用(2)監聽程序
(3)輸入監聽程序名稱(4)選擇協議(5)選擇端口(6)配置完成
3、監聽程序管理
在Windows環境下,可用命令行程序LSNRCTL(listener control 監聽控制)啟動、關閉和管理監聽程序。
二、命名方法的配置
1、選擇命名方法的配置
選擇的命名方法記錄在sqlnet.ora的文件中,該文件默認路徑為networkadmin,默認內容為:
# 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、配置本地命名方法 本地命名方法將連接標識符到連接描述符的映射關系保存在名稱為tnsnames.ora文件中,默認內容為:
# 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服務名配置”(2)服務名配置(3)服務名(4)選擇協議(5)主機名(6)測試
(7)測試成功,可編輯網絡服務名
實驗內容:
1、對Oracle 服務器端進行監聽程序和網絡服務名等配置,并查看listener.ora、sqlnet.ora、tnsnames.ora等相關文件和Net Manager等相關界面的數據信息;
2、修改服務端的計算機名,對Oracle進行重新配置,使其能正常工作,同時查看上述相關數據并與之比較變化;
3、使用命令對監聽程序進行操作管理。
實驗三 Oracle數據庫管理實驗
教學目的要求:
1.掌握數據庫的建立方法。
2.了解手動建立數據庫的基本步驟。3.掌握數據庫啟動、關閉和刪除的方法 重點:
數據庫啟動、關閉和刪除的方法 難點:
手動建立數據庫 課時安排:實驗2課時
預備知識:
一、數據庫的建立
(1)DBCA建立數據庫
點擊:OracleHome、Configuration And Migration Tools、Database Configuration Assistant進入DBCA界面。
(2)SQL命令建立數據庫
1、確定數據庫名和實例名SID SQL>setenv Oracle_SID=student
2、確定環境變量設置正確
在啟動SQL Plus之前,必須正確設置環境變量。如Oracle_sid,Oracle_hom,PATH等。
3、確定DBA認證方式
新建數據庫,必須以DBA身份連接,并具有相應的系統權限。
4、創建初始化參數文件
可復制樣本初始化參數文件,也可復制其它數據庫的初始化 參數文件。
5、創建實例
C:>oradim –NEW –SID student –STARTMODE MANUAL-PFILE=??INIT.ORA
6、連接到實例
SQL>CONNECT SYS AS SYSDBA;連接正確,則提示connected to an idle instance.7、建立服務器參數文件
SQL>CREATE SPFILE FROM PFILE;
8、啟動實例
SQL>STARTUP NOMOUNT;以非加載方式啟動實例
9、執行CREATE DATABASE命令
二、數據庫的操作(1)數據庫的啟動
1、啟動實例但不加載數據庫(NOMOUNT狀態)SQL>STARTUP NOMOUNT;SQL>STARTUP NOMOUNT PFILE=?.init.ora;
2、啟動實例并加載數據庫(MOUNT狀態)SQL>STARTUP MOUNT;SQL>STARTUP MOUNT PFILE=?.init.ora;
3、啟動實例并加載、打開數據庫(OPEN狀態)SQL>STARTUP OPEN;SQL>STARTUP;SQL>STARTUP MOUNT PFILE=?.init.ora;SQL>STARTUP PFILE=?.init.ora;
4、數據庫啟動模式之間的轉換
從NOMOUNT狀態到MOUNT狀態: SQL>ALTER DATABASE MOUNT; 從MOUNT狀態到OPEN狀態: SQL>ALTER DATABASE OPEN; 只讀模式
SQL>ALTER DATABASE OPEN READ ONLY; 讀寫模式
SQL>ALTER DATABASE OPEN READ WRITE;(2)數據庫的關閉
1、正常關閉方式(NORMAL)SQL>SHUTDOWN NORMAL;
2、立即關閉方式(IMMEDIATE)SQL>SHUTDOWN IMMEDIATE;
3、事務關閉方式(TRANSACTIONAL)SQL>SHUTDOWN TRANSACTIONAL;
4、終止關閉方式(ABORT)SQL>SHUTDOWN ABORT;
三、數據庫的刪除
啟動DBCA,選擇刪除數據庫。單擊“下一步”,將顯示所有可以被刪除的數據庫例程。
實驗內容:
1、使用DBCA建立數據庫;
2、使用命令建立數據庫;
3、使用DBCA和命令對所建立的數據庫進行修改、刪除等操作;
4、練習數據庫的啟動和關閉等操作,重點練習三種啟動模式和三種關閉方式,并了解數據庫處于各種打開或關閉狀態下所能進行和不能進行的基本操作。實驗四 Oracle數據庫對象管理實驗
教學目的要求:
1.了解各類數據庫對象的作用。
2.掌握表、視圖、索引、序列、同義詞等數據庫對象的建立、刪除、修改和查詢等方法。3.掌握表內容的插入、刪除、更新和查詢等方法。4.掌握表的約束的使用方法 重點:
表內容的插入、刪除、更新和查詢等方法 難點:
手動建立表、視圖、索引、序列等數據庫對象 課時安排:實驗4課時 實驗內容:
1、使用SQL語句創建表(至少包含三種不同類型的字段),使用SQL語句向表中插入數據、修改表中數據、刪除表中數據和查詢數據。
2、使用SQL語句創建索引、視圖。
3、創建序列,并在插入語句中使用序列。實驗五Oracle數據庫安全管理實驗
教學目的要求:
1.了解數據庫用戶、權限、事務、概要文件、并發和會話等基本概念。2.掌握建立、刪除和修改、查詢用戶等的方法。3.掌握用戶授予和回收權限或角色的方法。4.掌握整個數據庫安全的綜合管理 重點:
用戶授予和回收權限或角色 難點:
用戶授予和回收權限或角色 課時安排:實驗4課時 實驗內容:
1、使用命令創建數據庫認證用戶。
2、為用戶授予和回收權限或角色操作。
3、使用新用戶登錄,進行有權限和無權限操作。
第二篇:計科2008級 數據庫課程設計題目
題目1高校教務管理系統(4人)
某高校有若干系,每系又分為若干專業,每系有若干學生和教師。學生被分在若干班級中,一個學生只能屬于一個班級,一個班級的學生都是一個專業的;教師則被分在不同的課程組,一個教師可以屬于多個課程組,某個課程組的老師才有資格講授該門課程。學生須在大學四年中修滿規定的學分,其中有一部分為必修課,另一部分是選修課;必修課以班級為最小單位安排上課教室及上課老師,多個班級可以安排在一個教室上課。每個專業都有自已的培養計劃,規定該專業的學生應在大學四個學年或8 個學期中修完哪些必修課,并在指定的選修課修滿選修學分。該計劃同時指定了這些必修課或選修課所開設的學期。所有教學活動均在教室進行,但上機與實驗則在機房或實驗室進行。不同的教室、實驗室或機房可容納不同的人數。有的教室有多媒體設施,有的沒有。有的課程必須在多媒體教室完成教學,有的則不然。
根據上述描述,設計并開發一個教務管理系統,功能至少包括:
學生、教師、課程、專業、教室等信息管理;
培養計劃的制訂;
排課系統;
選修課的選修系統(先有課表,然后方許學生選修);
成績登記系統(只有任課老師才有權登記該門課程的成績,但只能在該課程結束后一個月內登記,登記完畢后,任課老師要給予確認,此后再不能修改。在一個月快要結束的前一個星期,教務管理員應收到提醒,得知哪些老師尚未完成成績的登記,以便電話通知這些任課老師);
成績的統計、查詢與打印(單人、單科、班級等成績的打印);
學分的查詢與統計;
根據需要的其它功能;
題目2圖書銷售系統(4人)
圖書銷售系統提供給書店包括圖書編目、進退貨、銷售、財務報表等方面的一體化解決方案。同時還提供會員折扣功能,B/S 模式下的網上會員系統等。功能包括:
圖書零售購買:顧客購書后收銀臺進行結賬。對于書店的會員可以提供相應的折扣。輸入需要購買的圖書和數量,計算出總金額,由用戶選擇使用現金或會員卡進行結賬。并提供銷售小票流水號作為銷售的單據。對于會員,還要計算相應的積分。
圖書零售退貨:顧客對已購買的圖書進行退貨。需要提供圖書和銷售的小票以作為購買憑證。系統查詢數據庫進行數據驗證,對符合要求的圖書進行退貨。
新書編目:書店從出版社購買新的圖書后在這里進行編目。只有編目后的圖書才可以進行銷售。
圖書查找:可以使用ISBN、書名、作者、出版社等多種方式進行查找已編目的圖書。
圖書資料修改:對已編目的圖書修改圖書的基本信息、零售價和最低折扣價。圖書進貨:對已編目的圖書再進貨,同時處理其金額差異。
圖書退貨:對已編目的圖書退貨,同時處理其金額差異。
出版社管理:添加、刪除、修改出版社,同時查詢出版社的資料。
會員添加:添加新的會員,同時登記會員的基本信息、有效期、指定會員組等。會員查找:提供會員編號、身份證號、會員姓名等方式復合查詢。
會員刪除:刪除已存在的會員。
會員信息修改:對會員的基本資料進行修改。
會員充值:向會員的虛擬賬戶充值。
掛失與特別處理:將會員的狀態在正常、掛失、特別處理之間調整。也可以找回會員的密碼。
會員組管理:添加、刪除和列出會員組。可以對會員組的名稱、折扣、積分換算等方面進行設置。
系統設置:添加、刪除、修改系統操作員,同時為相應的操作員設置其控制權限。
密碼修改:對當前的系統操作員的密碼進行修改。
數據管理:提供系統數據庫的備份與恢復。
報表處理:提供圖書銷售單、圖書進貨單、會員列表、出版社列表、銷售單等報表。
題目3自來水公司水費管理系統(3人)
某市自來水公司負責該市所有民用和工業用水的供應,并負責水費的收取。工業用水與民用水采取不同的收費標準。無論工業用水或民用水均一月抄表一次,原則上每月收費一次。由于抄表的工作量較大,并不能保證兩次抄表期間正好跨度一個月,因此以每月抄表的期間為當月收費期間。工業水費都由單位繳納。民用水費有的由個人繳納,有的由單位或住宅小區統一繳納(然后單位再從職工工資中扣取,或由小區物業代收)。水費有的是由單位代理人或個人在收費大廳繳納,有的由收費人員上門收取,再上繳財務。收費應當出具收費憑證(發票)。偶有單位或個人多個收費期間并繳現象,此時,可按收費期間出具多張收費憑證。對拖欠水費超過一定額度的出打印催繳通知。
根據上述描述,設計與開發一個自來水收費管理系統。功能至少
包括:
水費帳戶的建立;
帳戶初始化;
水表期末數的讀取;
水費帳單的建立;
催繳通知;
水費收取與發票打印;
水費查詢、統計與報表;
根據需要的其它功能。
單位和個人可在網上查詢本單位或本人繳費情況和欠費情況,以及繳費歷記錄。
題目4銀行儲蓄管理系統(3人)
某儲蓄所接受定期和活期儲蓄業務,儲戶采用實名存款,需登記真實姓名,并
出具身份證號碼。儲戶可以辦理多個存折。系統除了管理存取款業務外,還應管理儲蓄所每天的業務交接與對帳、扎帳業務。儲蓄所每天上班前可能接受運鈔車送來的現金,下班時則將所內現金送回金庫,零星款項也可能留在所內。每天下班前都要盤點每個營業員準備金、收取儲戶的存款、支付儲戶的取款以及繳回的余款,以驗證帳目的正確。這些比較記錄除了存儲數據庫外,都將打印憑證,交由當事人簽字后存檔。儲戶存款依法支付扣稅后利息,定期存款依照到期日計息,活期存款在每年的6 月30 日計息(以存款天數計算)。此外,某個單位可能為本單位職工在該銀行辦理了工資卡,應予以考慮本項業務。客戶存折或卡丟失后,可以申請掛失,掛失后該帳戶即被凍結,直到儲戶補辦新折或卡后。
根據上述描述,設計并開發一個儲蓄管理系統。功能至少包括:
開戶、銷戶、掛失等管理;
存款(包括活期存款和定期存款);
取款(包括活期取款、定期到期取款和定期提前取款);
轉帳(一次轉帳可以從一個帳戶資金轉到多個帳戶,一如代發工資的情況)。儲戶可以通過網絡查詢自已的帳戶信息;還可以通過網絡掛失。
查詢、統計與報表(如查詢交易歷史);
其它管理功能。
題目5個人信息管理系統(3人)
設計一個個人信息管理系統,包括一下信息:
1.通訊錄信息:包括通訊人姓名、聯系方式、工作地點、城市、備注等。
2.備忘錄信息:包括什么時間、事件、地點等。
3.日記信息:包括什么時間、天氣、事件等。
4.個人財物管理:包括總收入,消費項目、消費金額、消費時間、剩余資金。系統要實現下列操作
根據相應的用戶名密碼,顯示相應的所有記錄。如果沒有對應的UID或PWD和UID不對應則報錯。顯示用戶的通訊錄具體內容,可以查詢聯系人的資料和添加新的聯系人。顯示用戶的日記本,供用戶查閱和編寫。若日記較長,窗口能顯示部分信息。雙擊窗口能顯示日記詳細內容顯示用戶的財務信息,記錄新的收支信息。計算出用戶的總收入,總支出,和剩余金額。顯示用戶的備忘錄內容,提醒用戶重要事件的時間地點。用于注冊新用戶。若新用戶的用戶名已經存在,則報錯。
題目6教務管理系統(3人)
背景資料:
某大學的某個學院下設若干系,每個系包含一個或幾個班級,每個系有若干名教師。每個班級有若干名學生。教師每學期講授多門課程,每門課程每學期由一名教師講授。負責教務工作的教師的日常工作包括:
1、每學期開始時打印每個系的每個班級的基本信息(班名,入學時間,班長等)以及學生的基本狀況報表,包括每個學生的基本信息(學號、姓名、性別、出生日期、照片等)和聯系方式,如宿舍號,電話,E-MAIL地址等。
2、每學期重新打印一份教師名單,包含教師的基本信息,以及便于聯系
等方面的信息(工作證號碼、姓名、性別、出生日期、職稱,職務,辦公室房間號,電話號碼)。假設每個教師的辦公室房間號有一個,不同的教師也可以有相同的房間號。每個教師可有多個聯系電話。
設計要求:
(1)進行需求分析,編寫數據字典。
(2)設計E-R圖。
(3)采用友好的界面對系、班級、學生、教師、課程、選課等內容進行增、刪、改。
(4)具有方便的查詢功能,例如,對于學生,可以按照學生的學號、姓名、年齡、性別、系別等屬性的任意組合條件進行查詢。同樣為課程以及選課等內容進行查詢。
(5)具有豐富的報表統計功能,例如,對于學生選課信息,可以進行如下報表匯總操作:
1)打印出某學生某學期所選修的全部課程的學分,學時以及成績。
2)打印出某教師所講授的全部課程的信息。
3)打印出某班某學期所有學生按總成績降序列出的學號、姓名以及總成績報表。
4)打印出各系具有的各級職稱的教師人數。
5)打印出該學院所開設的各門課程的名稱、學時以及先修課的名稱和學時。
題目7房屋中介管理系統(3人)
背景資料:
某房屋中介公司擁有多名職員分管不同業務,公司與多名房主具有業務聯系,每個房主在委托房屋中介公司進行房屋的出租或出售時都要填寫一張表格,說明房屋的地址、面積、朝向、類別以及價格等相關信息。需要租住或購買房屋的客戶在向中介公司尋求服務時,也需要登記需要租住或購買的房屋的細節要求。職員負責與客戶約定時間,并陪同客戶看房,若客戶看中房屋,公司將記錄客戶購買或租住房屋的合同的相關信息。試為此公司設計一個數據庫應用系統。
功能要求:
(1)管理公司職員的基本信息,以及所進行的業務信息,如聯系客戶、陪同客戶看房的信息
(2)登記房屋、房主以及客戶的信息,并能進行方便地增、刪、改。
(3)方便房主查詢所需要的房屋的查詢功能。
(4)統計待租或待售的房屋信息等。
題目8產品生產與銷售管理系統(3人)
背景資料:
某家具公司生產和銷售多種家具產品。公司擁有多個生產家具的車間,每個車間有多名工人,負責生產多種產品。客戶可在公司下設的多個銷售點購買家具,所購買的家具記錄在訂單中,銷售點根據訂單向客戶運送家具。請根據如上
應用環境,為該公司設計和實現一個產品生產與銷售管理系統。
功能要求:
(1)記錄公司的產品和工人的基本信息,并能進行方便的增、刪、改。
(2)記錄公司的每個銷售點、客戶以及每個訂單的信息。
(3)對工人、產品、客戶以及訂單等信息進行多條件任意組合查詢。
(4)統計產品的銷售信息。
題目9教師工資管理系統(3人)
背景資料:
(1)某學校現有100名教職工,按職稱分為教授、副教授、講師、助教。(可根據本人所在學校實際情況確定具體名額。
(2)工資由基本工資、福利津貼和獎勵工資構成,失業保險和住房公積金在工資中扣除。
(3)該學校基本工資是根據教師職稱等級分配工資數額,其余無差別。
(4)每位教師的基本資料有姓名、性別、年齡、職稱。
(5)工資按月發放,實際發放的工資金額為工資減去扣除。
以上信息可供參考,學員可根據本人所在學校具體情況設計。
設計要求:
(1)進行需求分析,編寫數據字典。
(2)設計E-R圖。
(3)實現個人的基本資料、工資和扣除金額數據的錄入。
(4)計算個人的實際發放工資。
(5)按職稱分類統計人數和工資金額。
(6)實現分類查詢。
(7)能夠刪除辭職人員的數據。
題目10學生學籍管理信息系統(3人)
學生學籍管理工作包括學生檔案、學籍、成績、升學等內容的管理;面對大量的學生數據、報表,手工處理方式已經很難跟上現代化的步伐。隨著計算機技術及網絡通訊技術的飛速發展,許多學校已經有了較好的計算機應用甚至網絡硬件建設基礎。因此為提高學校管理工作的現代化、科學化水平,保證信息處理的即時化、準確化,開發一套對學生學籍進行管理的軟件是極其重要的。
應完成的主要功能:(1)學生檔案的管理,即錄入、修改、查詢、輸出學生檔案信息,這些信息包括學生基本情況、學生簡歷情況、學生獎勵情況、學生處分情況、學生家庭信息、學生體檢情況。(2)學生學籍管理,錄入、修改、查詢、輸出學生學籍信息,這些信息包括學生獎貸學金情況、學生注冊、學生異動情況、學生軍訓情況、學生畢業情況。(3)學生成績管理,錄入修改、查詢、輸出學生入校成績,各學期、各門課程的成績信息,并支持按年級、班級等條件的統計、查詢、報表輸出。
第三篇:數據庫原理實驗教案
《數據庫原理》課程實驗
實驗1 創建數據庫和數據表
一、實驗目的
熟悉SQL Server Management Studio界面;掌握通過圖形化向導和執行Transact-SQL語句創建數據庫的方法。
二、實驗環境
Windows XP操作系統,SQL Server 2005軟件。
三、實驗課時
2課時。
四、實驗內容
SQL Server中的一個數據庫必須至少包含一個數據文件和一個事務日志文件,所以創建數據庫就是建立主數據文件和日志文件。
在SQL Server 2005中創建數據庫的方法主要有兩種:一是在SQL Server Management Studio窗口中使用可視化界面,通過方便的圖形化向導創建,二是通過執行Transact-SQL語句創建。
(一)向導方式創建
1、從“開始”菜單選擇“所有程序”→“Microsoft SQL Server 2005”,打開“SQL Server Management Studio”窗口,使用Windows或SQL Server身份驗證建立連接。
2、在“對象資源管理器”窗格中展開服務器,選擇“數據庫”節點右擊,從彈出的快捷菜單中選擇“新建數據庫”命令,打開“新建數據庫”窗口。
3、該窗口中有3個頁,分別是“常規”、“選項”和“文件組”,完成這3個頁的內容即可完成數據庫的創建。這里,我們僅設置“常規”的相應內容,其他2個頁的內容按照默認設置即可。
(1)“數據庫名稱”文本框中輸入數據庫的名稱,如“sample_st”,再輸入該數據庫的所有者,這里使用默認值即可。(也可以通過單擊文本框右邊的“瀏覽”按鈕選擇所有者。
(2)“數據庫文件”列表中包括兩行,一個是數據文件,一個是日志文件。通過單擊下面相應的按鈕可以添加或刪除相應的數據文件。
? 邏輯名稱:指定該文件的文件名。
? 文件類型:用于區別當前文件是數據文件還是日志文件。? 文件組:顯示當前數據庫文件所屬的文件組。
? 初始大小:指定該文件的初始容量。在SQL Server 2005中數據文件的默認值為3MB,日志文件的默認值為1MB。? 自動增長:用于設置在文件容量不夠用時,文件根據何種增長方式自動增長。
? 路徑:指定存放在文件的目錄。默認情況下,SQL Server 2005將存放路徑設置為其安裝目錄下的data子目錄,單擊該列中的按鈕可以在打開的“定位文件夾”對話框中更改數據庫的存儲路徑。
完成上述操作后,單擊“確定”按鈕關閉“新建數據庫”窗口,即完成了數據庫的創建,可以在“對象資源管理器”窗格中看到新建的數據庫。
(二)語言方式創建
SQL Server 2005使用的Transact-SQL語言是標準SQL的增強版本,使用它提供的Create Database語句同樣可以完成對數據庫的建立(參考內容見附錄)。
1、單擊“新建查詢”按鈕,創建一個查詢輸入窗口將附錄中的語句復制到該窗口。選擇創建數據庫的命令,單擊工具欄中的“分析”按鈕,可以檢查語法錯誤;單擊“執行”按鈕即可執行語句,在查詢窗口內的“查詢”窗格中可以看到“命令已成功完成”的提示消息。在“對象資源管理器”窗格中刷新,即可看到新建的數據庫。
2、繼續執行Create Database之后的語句,在“sample_st”數據庫中用Create Table命令依次建立Student、Course和SC這三個數據表,利用Insert命令為各數據表添加數據。(參考內容見教材P84)
(三)知識鞏固
仿照附錄內容,用SQL-DDL語言創建“產品訂購”數據庫,包含四個數據表S、P、J和SPJ,表結構及內容見教材P122。
實驗2 數據庫的簡單查詢
一、實驗目的
掌握單表查詢中各個子句(Select、From、Where、Group、Having、Order)的用法,特別要掌握比較運算符和邏輯運算符的使用。
二、實驗環境
Windows XP操作系統,SQL Server 2005軟件。
三、實驗課時
2課時。
四、實驗內容
在已建立的數據庫和數據表的基礎上,用Select語句完成下列查詢操作。
1、查詢全體學生的學號和姓名。
select sn,sno from s
2、查詢全體學生的所有基本信息(僅針對Student表)。
select * from s
3、對SC表查詢全體學生的選課記錄,在顯示結果中為“Grade”列增加5分。select score+5 from sc
4、查詢全體學生的學號和姓名,將原來的英文列名設置中文別名。select sn as 姓名,sno as 學號 from s
5、顯示所有選課學生的學號,去掉重復結果。
select distinct sno from sc
6、查詢成績在80分以上的學生選課記錄
select * from sc where score>80
7、查詢經濟系所有學生的學號和姓名。
select sn,sno from s where dept='經濟系'
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、查詢無考試成績(成績為空值)的學號、課程號。5
select sno ,cno from sc where score is null
12、查詢考試成績非空值的學號、課程號。
select sno ,cno from sc where score is null
13、查詢數學系年齡小于20歲的學生記錄。
select * from s where dept ='數學系'and age <28
14、查詢選修了“101”或“102”課程的選課記錄。select * from c where cno ='101' or cno ='102'
15、查詢學生總人數。
select count(sno)from s
16、查詢選修了課程的學生人數。
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、查詢每門課程的選課人數。
select cno,COUNT(sno)from sc
group by cno
21、查詢每個學生的學號、選課數、平均成績和總成績。
select sno,COUNT(cno)/*,AVG(score),sum(score)*/ from sc group by sno
22、查詢選課數超過2的學生學號及其選課數。
select sno,COUNT(cno)from sc
group by sno
having COUNT(*)>2
23、查詢所有學生信息,查詢結果按年齡降序排列。(針對Student表操作)
select * from s order by AGE desc
24、查詢所有學生信息,查詢結果按系名升序,同系學生按年齡降序排列。
select * from s order by dept,AGE desc
25、查詢選課數超過2的學生學號及其選課數,查詢結果按選課數降序排列。
select sno,COUNT(cno)from sc group by sno having COUNT(*)>2 order by count(cno)desc
實驗3 數據庫的多表查詢
一、實驗目的
繼續熟練SQL-SELECT語句的使用;理解多表查詢的概念;掌握多表連接查詢中各個子句的用法,特別要比較內連接和外連接的結果。掌握非相關子查詢、相關子查詢的用法,理解它們的執行過程;學會在SQL Server中用Exists實現交運算,用Not Exists實現差運算。
二、實驗環境
Windows XP操作系統,SQL Server 2005軟件。
三、實驗課時
2課時。
四、實驗內容
(一)、在已建立的數據庫和數據表的基礎上,用Select語句的連接查詢完成下列操作。
1、查詢每個學生的基本信息及其選課情況。
2、查詢選修“101”課程的學生學號、姓名和成績。
3、查詢與“李平”在同一個系學習的學生記錄。
4、查詢與“李平”年齡相同的學生記錄。
5、查詢選修課程名為“數據庫原理”的選課記錄。
6、查詢選修課程名為“數據庫原理”的學生記錄。
7、查詢選修“101”課程且成績≥90的學號、姓名和成績。
8、查詢“李平”的所有選課記錄。
9、查詢數學系學生選修的課程號,要求結果中去掉重復記錄。
10、查詢計算機系選修課程數≥2的學號、姓名及平均成績,查詢結果按平均成績降序。
11、查詢每個學生的學號、選修課程號、課程名及成績。
12、查詢所有學生的選修情況(包括選課和未選課的學生),要求顯示學號、姓名、課程號和成績。
(二)、在已建立的數據庫和數據表的基礎上,用Select語句的嵌套查詢完成下列操作。
1、查詢選修“101”課程且成績≥90的學號、姓名。
2、查詢“李平”的所有選課記錄。
3、查詢與“李平”在同一個系學習的學生記錄。
4、查詢與“李平”年齡相同的學生記錄。
5、查詢選修課程名為“數據庫原理”的選課記錄,輸出結果包括學號和成績。
6、查詢選修課程名為“數據庫原理”的學生記錄,輸出結果包括學號、姓名和所在系。
7、查詢學號為“01003”學生的選修課程號和課程名。
8、查詢沒有選修“101”課程的學生學號和姓名。
9、查詢選修“101”課程或“102”課程的學生姓名。
10、查詢選修“101”課程和“102”課程的學生學號。
11、查詢選修“101”課程但沒選修“102”課程的學生學號。
12、查詢沒有選修任何課程的學生記錄,輸出結果包括學號、姓名和所在系。
13、查詢數學系學生選修的課程號,要求結果中去掉重復記錄。
14、查詢選修課程至少包含“01003”選修課程的學生學號。實驗4 數據庫更新、視圖定義及使用
一、實驗目的
掌握Insert、Update、Delete語句的使用;對于Insert語句,要求理解默認值約束、空值約束在插入記錄時所起的作用。理解視圖的概念,掌握Create View、Drop View語句的使用;掌握基于視圖的查詢語句的使用。
二、實驗環境
Windows XP操作系統,SQL Server 2005軟件。
三、實驗課時
2課時。
四、實驗內容
(一)、在已建立的數據庫和數據表的基礎上,向數據庫中添加一個臨時表ST,其結構比Student表結構多一個score字段。用Insert語句向臨時表輸入數據,輸入有誤時用Update語句進行修改。再用三個更新語句完成下列操作。
1、向Student表添加若干新記錄,內容自定。(觀察已定義的表的約束情況)
2、向SC表添加新記錄,內容自定,不低于10條(注意不能違反參照完整性)。
3、為臨時表ST添加記錄。
4、把Student表的所有行一次性地加到臨時表ST中。
5、在ST表中把所有學生的成績加2分。
6、在ST表中把所有學生的年齡增加1。
7、在ST表中把“李平”的所在系改為“計算機”。
8、在ST表中將選修課程“數據庫原理”的學生成績加2分。
9、在SC表中刪除所有成績為空值的選修記錄。
10、刪除計算機系選修成績不及格的選課記錄。
(二)、在已建立的數據庫和數據表的基礎上,完成下列操作。
1、建立數學系學生的視圖MAST。
2、建立計算機系選修課程名為“數據庫原理”的學生視圖,視圖名:CSTVIEW,該視圖中應包括屬性列:學號、姓名、成績。
3、創建一個名為STSUMVIEW的視圖,包括所有學生的學號和總成績。
4、建立學生選課視圖SCVIEW,包括所有學生的學號、姓名、課程號、課程名和成績。
5、通過MAST視圖查詢學生基本信息。
6、通過SCVIEW查詢成績大于90分的學生的學號和成績。
7、查詢計算機系選修課程名為“數據庫原理”并且成績大于85分的學生的學號和成績。
8、通過MAST視圖將學號為“01008”學生的年齡修改為21歲。
9、通過MAST視圖將學號為“01009”學生所在系改為“經濟”,是否能成功執行?若不能成功請說明理由;若修改成功,請再次通過MAST視圖查詢學生基本信息,是否能查詢到該生?若不能查詢請說明理由。
10、通過SCVIEW視圖將學號為“01004”學生的總成績修改為380分,是否能成功執行?若不能成功請說明理由。
實驗5 數據庫的安全與保護
一、實驗目的
理解SQL Server的用戶與權限管理機制,掌握用對象資源管理器創建服務器登錄帳號,并同時建立用戶。掌握如何為給定的用戶分配權限。
二、實驗環境
Windows XP操作系統,SQL Server 2005軟件。
三、實驗課時
2課時。
四、實驗內容
用戶與權限管理
(1)打開“SQL Server Management Studio”窗口,使用對象資源管理器創建兩個服務器登錄帳號Test1和Test2,并在“sample_st”數據庫中創建兩個對應的同名用戶。設置Test1用戶和Test2用戶的默認架構為guest。
(2)使用Test1身份登錄,并為Test2分配創建數據表的權限;用Test2身份登錄來驗證權限分配成功。
(3)使用Test1身份登錄,收回剛剛分配給Test2的創建數據表的權限;用Test2身份登錄來驗證權限回收成功。
五、實驗步驟
1、使用對象資源管理器創建兩個服務器登錄帳號。以系統管理員身份登錄SQL Server。打開“SQL Server Management Studio”窗口,在對象資源管理器列表中,打開展開“安全性”文件夾,選擇“登錄名”圖標,單擊鼠標右鍵,在彈出的菜單中選擇“新建登錄名”。在打開的對話框中依次建立Test1和Test2,選擇“SQL Server身份驗證”,同時還要輸入密碼,默認數據庫為“sample_st”。
(2)在“用戶映射”中列出了當前登錄帳號可以選擇訪問的數據庫如“sample_st”,在其左側的復選框中打勾,表示當前登錄帳號可以訪問對應的數據庫,默認用戶名與登錄帳號相同。
(3)單擊“確定”按鈕完成創建。
2、創建新的數據庫用戶。
在對象資源管理器中選中要訪問操作的數據庫,展開“安全性”文件夾,在“用戶”文件夾中查找是否已建立與登錄名Test1和Test2同名的數據庫用戶,若已建立,則在屬性中修改其默認架構為guest;否則右擊鼠標在菜單中選擇“新建用戶”選項,出現“數據庫用戶-新建”對話框,建立相應的用戶。最后,在sample_st數據庫的“安全性?架構?guest?屬性?權限”中,為test1和test2用戶分配相應權限。
3、用Grant、Revoke命令實現對用戶的授權和收權。
4、用Create命令創建數據表驗證授權和收權是否成功。
5、以系統管理員身份登錄SQL Server。使用:“GRANT SELECT ON SC TO Test1 WITH GRANT OPTION”命令,再分別以Test1和Test2身份登錄,進行授權及查詢數據表,驗證“WITH GRANT OPTION”能否成功執行。
6、以系統管理員身份使用“REVOKE”命令回收上述授權。
實驗6 數據庫的完整性
一、實驗目的
通過實驗掌握數據庫完整性概念,掌握利用SQL Server 2005實現數據庫完整性的基本方法和步驟。
二、實驗環境
Windows XP操作系統,SQL Server 2005軟件。
三、實驗課時
2課時。
四、實驗內容
1、建立關系模式。
完成教材P164第6題,用SQL語言定義“職工”和“部門”兩個關系模式: 職工(職工號,姓名,年齡,職務,工資,部門號),職工號為主碼 部門(部門號,名稱,經理名,電話), 部門號為主碼 要求在模式中完成以下完整性約束條件的定義:(1)定義每個模式的主碼;(2)定義參照完整性;
(3)定義職工年齡不得超過60歲;(4)定義部門名稱必須取值唯一。
2、驗證完整性約束。
使用Insert Values語句向兩個表中各插入5~10條記錄,對下列內容進行驗證。(1)驗證主鍵約束:“職工”和“部門”兩個表中是否能接受主碼值相同的記錄,通過實例驗證。
(2)驗證唯一約束:“部門”表中是否能接受名稱相同的兩個不同記錄?為什么?
(3)驗證檢查約束:“職工”表中能否接受年齡不滿足條件的記錄?為什么?
(4)驗證參照完整性:若“部門”表中不存在部門號為“008”的記錄,是否能在“職工”表中插入部門號為“008”的職工記錄?若刪除“001”部門的所有信息,正確的操作步驟是什么?
實驗7 數據庫設計實驗
一、實驗目的
通過實驗掌握數據庫設計的基本方法和步驟。
二、實驗環境
Windows XP操作系統,SQL Server 2005軟件。
三、實驗課時
2課時。
四、實驗內容
1、選定實驗題目,為某個單位或部門設計數據庫應用系統,比如:學生成績管理、機房上機管理、職工檔案管理、商品庫存管理、圖書管理、工資管理等。
2、根據選定的題目進行需求分析,重點分析數據需求和功能需求。
3、概念結構設計:畫出E-R圖。
4、邏輯結構設計:設計數據庫和數據表的具體結構,指出各表的屬性名稱、數據類型;說明各表的主碼及表之間的關聯情況;說明本設計是否已達到3NF要求。
5、簡要評價系統設計的優點和不足。
五、實驗要求
1、提交設計報告,涵蓋實驗內容的全部信息,不低于1000字。
2、提交建立應用系統數據庫的代碼,所有數據表中的記錄總數不低于50條。(請參照實驗2的附錄建立數據庫)
實驗8 存儲過程實驗
一、實驗目的
通過實驗熟悉使用存儲過程進行數據庫應用程序設計的方法
二、實驗環境
Windows XP操作系統,SQL Server 2005軟件。
三、實驗課時
2課時。
四、實驗內容
對sample_st數據庫,編寫存儲過程,完成下面功能
1、統計任意一門課程的平均成績
2、統計所有課程的平均成績
3、統計任意一門課程的成績分布情況,即按照分數段統計人數(即<60、60-69、70-79、80-89、90以上)
第四篇:數據庫原理實驗教案
《數據庫原理》課程實驗
實驗1 創建數據庫和數據表
一、實驗目的
熟悉SQL Server Management Studio界面;掌握通過圖形化向導和執行Transact-SQL語句創建數據庫的方法。
二、實驗環境
Windows XP操作系統,SQL Server 2005軟件。
三、實驗課時
2課時。
四、實驗內容
SQL Server中的一個數據庫必須至少包含一個數據文件和一個事務日志文件,所以創建數據庫就是建立主數據文件和日志文件。
在SQL Server 2005中創建數據庫的方法主要有兩種:一是在SQL Server Management Studio窗口中使用可視化界面,通過方便的圖形化向導創建,二是通過執行Transact-SQL語句創建。
(一)向導方式創建
1、從“開始”菜單選擇“所有程序”→“Microsoft SQL Server 2005”,打開“SQL Server Management Studio”窗口,使用Windows或SQL Server身份驗證建立連接。
2、在“對象資源管理器”窗格中展開服務器,選擇“數據庫”節點右擊,從彈出的快捷菜單中選擇“新建數據庫”命令,打開“新建數據庫”窗口。
3、該窗口中有3個頁,分別是“常規”、“選項”和“文件組”,完成這3個頁的內容即可完成數據庫的創建。這里,我們僅設置“常規”的相應內容,其他2個頁的內容按照默認設置即可。
(1)“數據庫名稱”文本框中輸入數據庫的名稱,如“sample_st”,再輸入該數據庫的所有者,這里使用默認值即可。(也可以通過單擊文本框右邊的“瀏覽”按鈕選擇所有者。
(2)“數據庫文件”列表中包括兩行,一個是數據文件,一個是日志文件。通過單擊下面相應的按鈕可以添加或刪除相應的數據文件。
? 邏輯名稱:指定該文件的文件名。
? 文件類型:用于區別當前文件是數據文件還是日志文件。? 文件組:顯示當前數據庫文件所屬的文件組。
? 初始大小:指定該文件的初始容量。在SQL Server 2005中數據文件的默認值為3MB,日志文件的默認值為1MB。? 自動增長:用于設置在文件容量不夠用時,文件根據何種增長方式自動增長。
? 路徑:指定存放在文件的目錄。默認情況下,SQL Server 2005將存放路徑設置為其安裝目錄下的data子目錄,單擊該列中的按鈕可以在打開的“定位文件夾”對話框中更改數據庫的存儲路徑。
完成上述操作后,單擊“確定”按鈕關閉“新建數據庫”窗口,即完成了數據庫的創建,可以在“對象資源管理器”窗格中看到新建的數據庫。
(二)語言方式創建
SQL Server 2005使用的Transact-SQL語言是標準SQL的增強版本,使用它提供的Create Database語句同樣可以完成對數據庫的建立(參考內容見附錄)。
1、單擊“新建查詢”按鈕,創建一個查詢輸入窗口將附錄中的語句復制到該窗口。選擇創建數據庫的命令,單擊工具欄中的“分析”按鈕,可以檢查語法錯誤;單擊“執行”按鈕即可執行語句,在查詢窗口內的“查詢”窗格中可以看到“命令已成功完成”的提示消息。在“對象資源管理器”窗格中刷新,即可看到新建的數據庫。
2、繼續執行Create Database之后的語句,在“sample_st”數據庫中用Create Table命令依次建立Student、Course和SC這三個數據表,并建立各自的約束及它們之間的聯系(外鍵),利用Insert命令為各數據表添加數據。
(三)知識鞏固
用SQL-DDL語言創建“產品訂購”數據庫,包含四個數據表S、P、J和SPJ,表結構及內容見教材P122。
實驗2 數據庫的簡單查詢
一、實驗目的
掌握單表查詢中各個子句(Select、From、Where、Group、Having、Order)的用法,特別要掌握比較運算符和邏輯運算符的使用。
二、實驗環境
Windows XP操作系統,SQL Server 2005軟件。
三、實驗課時
2課時。
四、實驗內容
在已建立的數據庫和數據表的基礎上,用Select語句完成下列查詢操作。
1、查詢全體學生的學號和姓名。
2、查詢全體學生的所有基本信息(僅針對Student表)。
3、對SC表查詢全體學生的選課記錄,在顯示結果中為“Grade”列增加5分。
4、查詢全體學生的學號和姓名,將原來的英文列名設置中文別名。
5、顯示所有選課學生的學號,去掉重復結果。
6、查詢成績在80分以上的學生選課記錄。
7、查詢經濟系所有學生的學號和姓名。
8、查詢成績在80~90分的學生選課記錄。
9、查詢年齡不在22~25的學生記錄。
10、查詢所有姓“劉”的學生記錄。
11、查詢無考試成績(成績為空值)的學號、課程號。
12、查詢考試成績非空值的學號、課程號。
13、查詢數學系年齡小于20歲的學生記錄。
14、查詢選修了“101”或“102”課程的選課記錄。
15、查詢學生總人數。
16、查詢選修了課程的學生人數。
17、查詢選修了“101”課程的學生的平均成績。
18、查詢學號為“01003”的學生的考試總成績。
19、查詢“101”課程的最高分和最低分。20、查詢每門課程的選課人數。
21、查詢每個學生的學號、選課數、平均成績和總成績。
22、查詢選課數超過2的學生學號及其選課數。
23、查詢所有學生信息,查詢結果按年齡降序排列。(針對Student表操作)
24、查詢所有學生信息,查詢結果按系名升序,同系學生按年齡降序排列。
25、查詢選課數超過2的學生學號及其選課數,查詢結果按選課數降序排列。
實驗3 數據庫的多表查詢
一、實驗目的
繼續熟練SQL-SELECT語句的使用;理解多表查詢的概念;掌握多表連接查詢中各個子句的用法,特別要比較內連接和外連接的結果。掌握非相關子查詢、相關子查詢的用法,理解它們的執行過程;學會在SQL Server中用Exists實現交運算,用Not Exists實現差運算。
二、實驗環境
Windows XP操作系統,SQL Server 2005軟件。
三、實驗課時
2課時。
四、實驗內容
(一)、在已建立的數據庫和數據表的基礎上,用Select語句的連接查詢完成下列操作。
1、查詢每個學生的基本信息及其選課情況。
2、查詢選修“101”課程的學生學號、姓名和成績。
3、查詢與“李平”在同一個系學習的學生記錄。
4、查詢與“李平”年齡相同的學生記錄。
5、查詢選修課程名為“數據庫原理”的選課記錄。
6、查詢選修課程名為“數據庫原理”的學生記錄。
7、查詢選修“101”課程且成績≥90的學號、姓名和成績。
8、查詢“李平”的所有選課記錄。
9、查詢數學系學生選修的課程號,要求結果中去掉重復記錄。
10、查詢計算機系選修課程數≥2的學號、姓名及平均成績,查詢結果按平均成績降序。
11、查詢每個學生的學號、選修課程號、課程名及成績。
12、查詢所有學生的選修情況(包括選課和未選課的學生),要求顯示學號、姓名、課程號和成績。
(二)、在已建立的數據庫和數據表的基礎上,用Select語句的嵌套查詢完成下列操作(含EXISTS量詞)。
1、查詢選修“101”課程且成績≥90的學號、姓名。
2、查詢“李平”的所有選課記錄。
3、查詢與“李平”在同一個系學習的學生記錄。
4、查詢與“李平”年齡相同的學生記錄。
5、查詢選修課程名為“數據庫原理”的選課記錄,輸出結果包括學號和成績。
6、查詢選修課程名為“數據庫原理”的學生記錄,輸出結果包括學號、姓名和所在系。
7、查詢學號為“01003”學生的選修課程號和課程名。
8、查詢沒有選修“101”課程的學生學號和姓名。
9、查詢選修“101”課程或“102”課程的學生姓名。
10、查詢選修“101”課程和“102”課程的學生學號。
11、查詢選修“101”課程但沒選修“102”課程的學生學號。
12、查詢沒有選修任何課程的學生記錄,輸出結果包括學號、姓名和所在系。
13、查詢數學系學生選修的課程號,要求結果中去掉重復記錄。
14、查詢選修課程至少包含“01003”選修課程的學生學號。實驗4 數據庫更新、視圖定義及使用
一、實驗目的
掌握Insert、Update、Delete語句的使用;對于Insert語句,要求理解默認值約束、空值約束在插入記錄時所起的作用。理解視圖的概念,掌握Create View、Drop View等語句的使用;掌握基于視圖的查詢語句的使用。
二、實驗環境
Windows XP操作系統,SQL Server 2005軟件。
三、實驗課時
2課時。
四、實驗內容
(一)、在已建立的數據庫和數據表的基礎上,向數據庫中添加一個臨時表ST(sno,sname,dept,sage,cno,cname,score)。用Insert語句向臨時表輸入數據,輸入有誤時用Update語句進行修改。再用三個更新語句完成下列操作。
1、向Student表添加若干新記錄,內容自定。(觀察已定義的表的約束情況)
2、向SC表添加新記錄,內容自定,不低于10條(注意不能違反參照完整性)。
3、為臨時表ST添加記錄。
4、把Student表的所有行及其對應的選課一次性地加到臨時表ST中。
5、在ST表中把所有學生的成績加2分。
6、在ST表中把所有學生的年齡增加1。
7、在ST表中把“李平”的所在系改為“計算機”。
8、在ST表中將選修課程“數據庫原理”的學生成績加2分。
9、在SC表中刪除所有成績為空值的選修記錄。
10、刪除計算機系選修成績不及格的選課記錄。
(二)、在已建立的數據庫和數據表的基礎上,完成下列操作。
1、建立數學系學生的視圖MAST。
2、建立計算機系選修課程名為“數據庫原理”的學生視圖,視圖名:CSTVIEW,該視圖中應包括屬性列:學號、姓名、成績。
3、創建一個名為STSUMVIEW的視圖,包括所有學生的學號和總成績。
4、建立學生選課視圖SCVIEW,包括所有學生的學號、姓名、課程號、課程名和成績。
5、通過MAST視圖查詢學生基本信息。
6、通過SCVIEW查詢成績大于90分的學生的學號和成績。
7、查詢計算機系選修課程名為“數據庫原理”并且成績大于85分的學生的學號和成績。
8、通過MAST視圖將學號為“01008”學生的年齡修改為21歲。
9、通過MAST視圖將學號為“01009”學生所在系改為“經濟”,是否能成功執行?若不能成功請說明理由;若修改成功,請再次通過MAST視圖查詢學生基本信息,是否能查詢到該生?若不能查詢請說明理由。
10、通過SCVIEW視圖將學號為“01004”學生的總成績修改為380分,是否能成功執行?若不能成功請說明理由。
實驗5 數據庫的安全與保護
一、實驗目的
理解SQL Server的用戶與權限管理機制,掌握用對象資源管理器創建服務器登錄帳號,并同時建立用戶。掌握如何為給定的用戶分配權限。
二、實驗環境
Windows XP操作系統,SQL Server 2005軟件。
三、實驗課時
2課時。
四、實驗內容
用戶與權限管理
(1)打開“SQL Server Management Studio”窗口,使用對象資源管理器創建兩個服務器登錄帳號Test1和Test2,并在“sample_st”數據庫中創建兩個對應的同名用戶。設置Test1用戶和Test2用戶的默認架構為guest。
(2)使用Test1身份登錄,并為Test2分配創建數據表的權限;用Test2身份登錄來驗證權限分配成功。
(3)使用Test1身份登錄,收回剛剛分配給Test2的創建數據表的權限;用Test2身份登錄來驗證權限回收成功。
五、實驗步驟
1、使用對象資源管理器創建兩個服務器登錄帳號。以系統管理員身份登錄SQL Server。打開“SQL Server Management Studio”窗口,在對象資源管理器列表中,打開展開“安全性”文件夾,選擇“登錄名”圖標,單擊鼠標右鍵,在彈出的菜單中選擇“新建登錄名”。在打開的對話框中依次建立Test1和Test2,選擇“SQL Server身份驗證”,同時還要輸入密碼,默認數據庫為“sample_st”。
(2)在“用戶映射”中列出了當前登錄帳號可以選擇訪問的數據庫如“sample_st”,在其左側的復選框中打勾,表示當前登錄帳號可以訪問對應的數據庫,默認用戶名與登錄帳號相同。
(3)單擊“確定”按鈕完成創建。
2、創建新的數據庫用戶。
在對象資源管理器中選中要訪問操作的數據庫,展開“安全性”文件夾,在“用戶”文件夾中查找是否已建立與登錄名Test1和Test2同名的數據庫用戶,若已建立,則在屬性中修改其默認架構為guest;否則右擊鼠標在菜單中選擇“新建用戶”選項,出現“數據庫用戶-新建”對話框,建立相應的用戶。
3、用Grant、Revoke命令實現對用戶的授權和收權。
4、用Create命令創建數據表驗證授權和收權是否成功。
5、以系統管理員身份登錄SQL Server。使用:“GRANT SELECT ON SC TO Test1 WITH GRANT OPTION”命令,再分別以Test1和Test2身份登錄,進行授權及查詢數據表,驗證“WITH GRANT OPTION”能否成功執行。
6、以系統管理員身份使用“REVOKE”命令回收上述授權。
實驗6 數據庫的事務及并發控制
一、實驗目的
通過實驗加深學生對事務的基本概念理解語掌握;加深學生對并發控制的基本概念理解,認識不正確的并發控制所帶來的危害;加深學生對鎖的基本概念的掌握與理解,認識鎖帶來的問題;
二、實驗環境
Windows XP操作系統,SQL Server 2005軟件。
三、實驗課時
2課時。
四、實驗內容
1、事務的控制
數據準備:執行如下命令Select * into ##temp from student,將student的數據倒入到##temp表中。? 啟動事務,執行刪除后,回滾事務
? ? ? ? ? ? 選擇##temp的數據,察看記錄總數 顯式啟動事務 刪除##temp表的數據
選擇##temp數據,察看記錄總數 回滾事務
選擇##temp數據,察看記錄總數
? 啟動事務,執行刪除后,提交事務
?
選擇##temp數據,察看記錄總數 ? ? ? ? ? 顯式啟動事務 刪除##temp表的數據
選擇##temp的數據,察看記錄總數 回滾事務
選擇##temp數據,察看記錄總數
比較這兩次執行效果的差異,為什么會有這些差異?
2、事務的隔離級別試驗
數據準備:執行如下命令Select * into ##temp from student,將student的數據倒入到##temp表中。? 臟讀
? 啟動兩個分析器,分別叫(A,B)
? 在A中,選擇##temp表中數據,察看記錄總數 ? 在A中,顯式啟動事務 ? 在A中,刪除##temp表的數據
? 在B中,將事務隔離級別設為UNCOMMITTED ? 在該查詢分析器中選擇##temp表數據,察看記錄總數 ? 回到先前窗口,回滾事務 ? 選擇##temp數據,察看記錄總數 ? 再次切查詢分析器窗口
? 選擇##temp數據,察看記錄總數 觀察結果,為什么會有這些現象? ? 不可重復讀
? 啟動兩個分析器,分別叫(A,B)
? 在A中,顯式啟動事務,察看dept = 'math'的記錄(注意地址中的數據)
? 在B中,顯式啟動事務,察看dept = 'math'的記錄。在B中,將dept = 'math’地址更新為’AAAAAA’
? 在B中,再次察看dept = 'math'的記錄。在B中,提交事務 ? 在A中,再次察看dept = 'math'的記錄。? 在A中,提交事務
觀察結果,為什么會有這些現象? ? 丟失修改
? 啟動兩個查詢分析器,分別叫(A,B)
? 在A中,顯式啟動事務,察看dept = 'math'的記錄(注意地址中的數據)
? 在B中,顯式啟動事務,察看dept = 'math'的記錄。? 在B中,將dept = 'math’地址更新為’AAAAAA’ ? 在B中,再次察看dept = 'math'的記錄。? 在B中,提交事務
? 在A中,再次察看dept = 'math'的記錄。? 在A中,將dept = 'math’地址更新為’BBBBBB’ ? 在A中,提交事務
? 在A,B窗口分別察看dept = 'math’的記錄,結果如何? ? 鎖的模擬
? 啟動兩個分析器,分別叫(A,B)
? 在A中,顯式啟動事務,察看dept = 'math'的記錄 ? 在B中,顯式啟動事務,察看dept = 'math'的記錄 ? 在B中,將dept = 'math’地址更新為’AAAAAA’ ? 在A中,將dept = 'math’地址更新為’BBBBBB’ 觀察A窗口的結果,為什么?
事務隔離級別設置:set transaction isolation level {read committed, read uncommitted, repeatable read, serializable}
實驗7 數據庫設計實驗
一、實驗目的
通過實驗掌握數據庫設計的基本方法和步驟。
二、實驗環境
Windows XP操作系統,SQL Server 2005軟件。
三、實驗課時
2課時。
四、實驗內容
1、選定實驗題目,為某個單位或部門設計數據庫應用系統,比如:學生成績管理、機房上機管理、職工檔案管理、商品庫存管理、圖書管理、工資管理等。
2、根據選定的題目進行需求分析,重點分析數據需求和功能需求。
3、概念結構設計:畫出E-R圖。步驟如下:
(1)設計局部E-R圖。設計依據是需求分析階段的DFD/DD。主要內容是確定實體集合、聯系、屬性及主關鍵字
(2)集成局部E-R圖。集成時要解決沖突和冗余等問題。(3)合并局部E-R圖。合并局部E-R圖中相同部分,盡可能的保留特殊部分,刪除冗余部分,用累加的方式集成若干個局部E-R圖。
(4)優化全局E-R圖,得到最佳的全局E-R圖方案。
4、邏輯結構設計:設計數據庫和數據表的具體結構,指出各表的屬性名稱、數據類型;說明各表的主碼及表之間的關聯情況;說明本設計是否已達到3NF要求。
5、簡要評價系統設計的優點和不足。
五、實驗要求
1、提交設計報告,涵蓋實驗內容的全部信息,不低于1000字。
2、提交建立應用系統數據庫的代碼,所有數據表中的記錄總數不低于50條。
實驗8 存儲過程實驗
一、實驗目的
通過實驗熟悉使用存儲過程進行數據庫應用程序設計的方法
二、實驗環境
Windows XP操作系統,SQL Server 2005軟件。
三、實驗課時
2課時。
四、實驗內容
對sample_st數據庫,編寫存儲過程,完成下面功能
1、統計任意一門課程的平均成績
2、統計所有課程的平均成績
3、統計任意一門課程的成績分布情況,即按照分數段統計人數(即<60、60-69、70-79、80-89、90以上)
第五篇:數據庫編程總結(推薦)
數據庫編程總結
當前各種主流數據庫有很多,包括Oracle, MS SQL Server, Sybase, Informix, MySQL, DB2, Interbase / Firebird, PostgreSQL, SQLite, SAP/DB, TimesTen, MS ACCESS等等。數據庫編程是對數據庫的創建、讀寫等一列的操作。數據庫編程分為數據庫客戶端編程與數據庫服務器端編程。數據庫客戶端編程主要使用ODBC API、ADO、ADO.NET、OCI、OTL等方法;數據庫服務端編程主要使用OLE DB等方法。數據庫編程需要掌握一些訪問數據庫技術方法,還需要注意怎么設計高效的數據庫、數據庫管理與運行的優化、數據庫語句的優化。
一、訪問數據庫技術方法
數據庫編程分為數據庫客戶端編程與數據庫服務器端編程。數據庫客戶端編程主要使用ODBC API、ADO、ADO.NET、OCI、OTL等方法;數據庫服務端編程主要使用OLE DB等方法。
1、幾種是數據庫訪問方法比較
ODBC
API是一種適合數據庫底層開發的編程方法,ODBC
API提供大量對數據源的操作,ODBC
API能夠靈活地操作游標,支持各種幫定選項,在所有ODBC相關編程中,API編程具有最高的執行速度。DAO提供了很好的數據庫編程的對象模型.但是,對數據庫的所有調用以及輸出的數據都必須通過Access/Jet數據庫引擎,這對于使用數據庫應用程序,是嚴重的瓶頸。
OLE
DB提供了COM接口,與傳統的數據庫接口相比,有更好的健壯性和靈活性,具有很強的錯誤處理能力,能夠同非關系數據源進行通信。
ADO最主要的優點在于易于使用、速度快、內存支出少和磁盤遺跡小。
ADO.NET 是利用數據集的概念將數據庫數據讀入內存中,然后在內存中對數據進行操作,最后將數據集數據回寫到源數據庫中。
OTL 是 Oracle, Odbc and DB2-CLI Template Library 的縮寫,是一個C++編譯中操控關系數據庫的模板庫,OTL中直接操作Oracle主要是通過Oracle提供的OCI接口進行,進行操作DB2數據庫則是通過CLI接口來進行,至于MS的數據庫和其它一些數據庫,則OTL只提供了ODBC來操作的方式。當然Oracle和DB2也可以由OTL間接使用ODBC的方式來進行操縱。具有以下優點:跨平臺;運行效率高,與C語言直接調用API相當;開發效率高,起碼比ADO.net使用起來更簡單,更簡潔;部署容易,不需要ADO組件,不需要.net framework 等。
2、VC數據庫編程幾種方法
VC數據庫編程幾種方法,包括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的一部分,是一個標準數據庫接口。它提供對關系數據庫訪問的統一接口,實現對異構數據源的一致訪問。ODBC數據訪問由以下部分組成:
<1>句柄(Handles):ODBC使用句柄來標識ODBC環境、連接、語句和描述器.<2>緩存區(Buffers):
<3>數據類型(Data
types)
<4>一致性級別(Conformance
levels)
用ODBC設計客戶端的一般步驟:
<1>分配ODBC環境
<2>分配連接句柄
<3>連接數據源
<4>構造和執行SQL語句
<5>獲得查詢結果
<6>斷開數據源的連接
<7>釋放ODBC環境
ODBC
API是一種適合數據庫底層開發的編程方法,ODBC
API提供大量對數據源的操作,ODBC
API能夠靈活地操作游標,支持各種幫定選項,在所有ODBC相關編程中,API編程具有最高的執行速度.因此,ODBC
API編程屬于底層編程。
2.MFC
ODBC連接
MFC
ODBC是MFC對ODBC進行的封裝,以簡化對ODBC
API的 調用,從而實現面向對象的數據庫編程接口.MFC
ODBC的封裝主要開發了CDatabase類和CRecordSet類
(1)CDatabase類
CDatabase類用于應用程序建立同數據源的連接。CDatabase類中包含一個m_hdbc變量,它代表了數據源的連接句柄。如果要建立CDatabase類的實例,應先調用該類的構造函數,再調用Open函數,通過調用,初始化環境變量,并執行與數據源的連接。在通過Close函數關閉數據源。
CDatabase類提供了對數據庫進行操作的函數及事務操作。
(2)CRecordSet類
CRecordSet類定義了從數據庫接收或者發送數據到數據庫的成員變量,以實現對數據集的數據操作。
CRecordSet類的成員變量m_hstmt代表了定義該記錄集的SQL語句句柄,m_nFields為記錄集中字段的個數,m_nParams為記錄集所使用的參數個數。
CRecordSet的記錄集通過CDatabase實例的指針實現同數據源的連接,即CRecordSet的成員變量m_pDatabase.MFC
ODBC編程更適合于界面型數據庫應用程序的開發,但由于CDatabase類和CRecordSet類提供的數據庫操作函數有限,支持的游標類型也有限,限制了高效的數據庫開發。在編程層次上屬于高級編程。
應用實例: 1.打開數據庫
CDatabase database;
database.OpenEx(_T(“DSN=zhuxue”),CDatabase::noOdbcDialog);//zhuxue為數據源名稱
2.關聯記錄集
CRecordset recset(&database);
3.查詢記錄
CString sSql1=“";
sSql1 = ”SELECT * FROM tablename“;
recset.Open(CRecordset::forwardOnly, sSql1, CRecordset::readOnly);
int ti=0;
CDBVariant var;//var可以轉換為其他類型的值
while(!recset.IsEOF())
{
//讀取Excel內部數值
recset.GetFieldValue(”id“,var);
jiangxiang[ti].id=var.m_iVal;
recset.GetFieldValue(”name“, jiangxiang[ti].name);
ti++;
recset.MoveNext();
}
recset.Close();//關閉記錄集
4.執行sql語句
CString sSql=”“;
sSql+=”delete * from 院系審核“;//清空表
database.ExecuteSQL(sSql);
sSql也可以為Insert ,Update等語句
5.讀取字段名
sSql = ”SELECT * FROM Sheet1“;
//讀取的文件有Sheet1表的定義,或為本程序生成的表.// 執行查詢語句
recset.Open(CRecordset::forwardOnly, sSql, CRecordset::readOnly);
int excelColCount=recset.GetODBCFieldCount();//列數
CString excelfield[30];
//得到記錄集的字段集合中的字段的總個數
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安裝驅動 CString sSql,sExcelFile;//sExcelFile為excel的文件路徑 TRY { // 創建進行存取的字符串 sSql.Format(”DRIVER={%s};DSN='';FIRSTROWHASNAMES=1;READONLY=FALSE;CREATE_DB=/“%s/”;DBQ=%s“,sDriver, sExcelFile, sExcelFile); // 創建數據庫(既Excel表格文件) if(database.OpenEx(sSql,CDatabase::noOdbcDialog)) { //可以把excel作為一個數據庫操作 } } catch(e) { TRACE1(”Excel驅動沒有安裝: %s“,sDriver); AfxMessageBox(”讀取失敗,請檢查是否定義數據區Sheet1“); } 3.DAO連接 DAO(Data Access Object)是一組Microsoft Access/Jet數據庫引擎的COM自動化接口.DAO直接與Access/Jet數據庫通信.通過Jet數據庫引擎,DAO也可以同其他數據庫進行通信。DAO還封裝了Access數據庫的結構單元,通過DAO可以直接修改Access數據庫的結構,而不必使用SQL的數據定義語言(DDL)。 DAO的體系結構如下: DAO封裝的類: (1)CdaoWorkspace:對DAO工作區(數據庫處理事務管理器)的封裝 (2)CdaoDatabase:對DAO數據庫對象的封裝,負責數據庫連接.(3)CdaoRecordset:對DAO記錄集對象的封裝,代表所選的一組記錄.(4)CdaoTableDef:對表定義對象的封裝,代表基本表或附加表定義.(5)CdaoQueryDef:對查詢對象的封裝,包含所有查詢的定義.(6)CdaoException:DAO用于接收數據庫操作異常的類.(7)CDaoFieldExchange DAO提供了很好的數據庫編程的對象模型.但是,對數據庫的所有調用以及輸出的數據都必須通過Access/Jet數據庫引擎,這對于使用數據庫應用程序,是嚴重的瓶頸。 DAO相對于ODBC來說,屬于高層的數據庫接口.4.OLE DB連接 OLE DB對ODBC進行了兩方面的擴展:一是提供了數據庫編程的OLE接口即COM,二是提供了一個可用于關系型和非關系型數據源的接口。 OLE DB提供了COM接口,與傳統的數據庫接口相比,有更好的健壯性和靈活性,具有很強的錯誤處理能力,能夠同非關系數據源進行通信。 與ODBC API一樣,OLE DB也屬于底層的數據庫編程接口,OLE DB結合了ODBC對關系數據庫的操作功能,并進行擴展,可以訪問非關系數據庫。 OLE DB訪問數據庫的原理如下: OLE DB程序結構: OLE DB由客戶(Consumer)和服務器(Provider)。客戶是使用數據的應用程序,它通過OLE DB接口對數據提供者的數據進行訪問和控制。OLE DB服務器是提供OLE DB接口的軟件組件。根據提供的內容可以分為數據提供程序(Data Provider)和服務提供程序(Service Provider)。 程序結構原理圖如下: <1>數據提供程序 數據提供程序擁有自己的數據并把數據以表格的形式呈現給使用者使用.<2>服務提供程序 服務提供程序是數據提供程序和使用者的結合。它是OLE DB體系結構中的中間件,它是OLE DB數據源的使用者和數據使用程序的提供者 <3>數據使用程序 數據使用程序對存儲在數據提供程序中的數據進行使用和控制.OLE DB開發程序的一般步驟: <1>初始化COM環境 <2>連接數據源 <3>打開對話 <4>執行命令 <5>處理結果 <6>清除對象 應用實例: 使用OLEDB編寫數據庫應用程序 1 概述 OLE DB的存在為用戶提供了一種統一的方法來訪問所有不同種類的數據源。OLE DB可以在不同的數據源中進行轉換。利用OLE DB,客戶端的開發人員在進行數據訪問時只需把精力集中在很少的一些細節上,而不必弄懂大量不同數據庫的訪問協議。OLE DB是一套通過COM接口訪問數據的ActiveX接口。這個OLE DB接口相當通用,足以提供一種訪問數據的統一手段,而不管存儲數據所使用的方法如何。同時,OLE DB還允許開發人員繼續利用基礎數據庫技術的優點,而不必為了利用這些優點而把數據移出來。 使用ATL使用OLE DB數據使用程序 由于直接使用OLE DB的對象和接口設計數據庫應用程序需要書寫大量的代碼。為了簡化程序設計,Visual C++提供了ATL模板用于設計OLE DB數據應用程序和數據提供程序。利用ATL模板可以很容易地將OLE DB與MFC結合起來,使數據庫的參數查詢等復雜的編程得到簡化。MFC提供的數據庫類使OLE DB的編程更具有面向對象的特性。Viual C++所提供用于OLE DB的ATL模板可分為數據提供程序的模板和數據使用程序的模板。 使用ATL模板創建數據應用程序一般有以下幾步驟: 1)、創建應用框架 2)、加入ATL產生的模板類 3)、在應用中使用產生的數據訪問對象3 不用ATL使用OLE DB數據使用程序 利用ATL模板產生數據使用程序較為簡單,但適用性不廣,不能動態適應數據庫的變化。下面我們介紹直接使用MFC OLE DB類來生成數據使用程序。模板的使用 OLE DB數據使用者模板是由一些模板組成的,包括如下一些模板,下面對一些常用類作一些介紹。1)、會話類 CDataSource類 CDataSource類與OLE DB的數據源對象相對應。這個類代表了OLE DB數據提供程序和數據源之間的連接。只有當數據源的連接被建立之后,才能產生會話對象,可以調用Open來打開數據源的連接。CSession類 CSession所創建的對象代表了一個單獨的數據庫訪問的會話。一個用CDataSource類產生的數據源對象可以創建一個或者多個會話,要在數據源對象上產生一個會話對象,需要調用函數Open()來打開。同時,會話對象還可用于創建事務操作。 CEnumeratorAccessor類 CEnumeratorAccessor類是用來訪問枚舉器查詢后所產生的行集中可用數據提供程序的信息的訪問器,可提供當前可用的數據提供程序和可見的訪問器。2)、訪問器類 CAcessor類 CAccessor類代表與訪問器的類型。當用戶知道數據庫的類型和結構時,可以使用此類。它支持對一個行集采用多個訪問器,并且,存放數據的緩沖區是由用戶分配的。CDynamicAccessor類 CDynamicAccessor類用來在程序運行時動態的創建訪問器。當系統運行時,可以動態地從行集中獲得列的信息,可根據此信息動態地創建訪問器。CManualAccessor類 CManualAccessor類中以在程序運行時將列與變量綁定或者是將參數與變量捆定。3)、行集類 CRowSet類 CRowSet類封裝了行集對象和相應的接口,并且提供了一些方法用于查詢、設置數據等。可以用Move()等函數進行記錄移動,用GetData()函數讀取數據,用Insert()、Delete()、SetData()來更新數據。CBulkRowset類 CBulkRowset類用于在一次調用中取回多個行句柄或者對多個行進行操作。CArrayRowset類 CArrayRowset類提供用數組下標進行數據訪問。4)、命令類 CTable類 CTable類用于對數據庫的簡單訪問,用數據源的名稱得到行集,從而得到數據。CCommand類 CCommand類用于支持命令的數據源。可以用Open()函數來執行SQL命令,也可以Prepare()函數先對命令進行準備,對于支持命令的數據源,可以提高程序的靈活性和健壯性。 在stdafx.h頭文件里,加入如下代碼。#include 在打開數據源,會話,行集對象后就可以獲取數據了。所獲取的數據類型取決于所用的存取程序,可能需要綁定列。按以下步驟。 1、用正確的命令打開行集對象。 2、如果使用CManualAccessor,在使用之前與相應列進行綁定。要綁定列,可以用函數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循環來取數據。在循環中,調用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循環內,可以通過不同的存取程序獲取數據。1)如果使用的是CAccessor類,可以通過使用它們的數據成員進行直接訪問。如下所示: 2)如果使用的是CDynamicAccessor 或CDynamicParameterAccessor 類,可以通過GetValue或GetColumn函數來獲取數據。可以用GetType來獲取所用數據類型。如下所示: 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,可以指定自己的數據成員,綁定它們。就可以直接存取。如下所示: while(rs.MoveNext()== S_OK){ // Use the data members you specified in the calls to // AddBindEntry.wsprintf(”%s“, szFoo);} 決定行集的數據類型 在運行時決定數據類型,要用動態或手工的存取程序。如果用的是手工存取程序,可以用GetColumnInfo函數得到行集的列信息。從這里可以得到數據類型。4 總結 由于現在有多種數據源,想要對這些數據進行訪問管理的唯一途徑就是通過一些同類機制來實現,如OLE DB。高級OLE DB結構分成兩部分:客戶和提供者。客戶使用由提供者生成的數據。 就像其它基于COM的多數結構一樣,OLE DB的開發人員需要實現很多的接口,其中大部分是模板文件。 當生成一個客戶對象時,可以通過ATL對象向導指向一個數據源而創建一個簡單的客戶。ATL對象向導將會檢查數據源并創建數據庫的客戶端代理。從那里,可以通過OLE DB客戶模板使用標準的瀏覽函數。 當生成一個提供者時,向導提供了一個很好的開端,它們僅僅是生成了一個簡單的提供者來列舉某一目錄下的文件。然后,提供者模板包含了OLE DB支持的完全補充內容。在這種支持下,用戶可以創建OLE DB提供者,來實現行集定位策略、數據的讀寫以及建立書簽。應用案例: Visual C++中使用OLE DB讀寫SQL Server 在需要對數據庫進行操作時,OLE DB總是被認為是一種效率最高但最難的方法。但是以我最近使用OLE DB的經驗看來,OLE DB的效率高則高矣,但卻一點都不難。說它難恐怕主要是因為可參考的中文資料太少,為了幫助以后需要接觸OLE DB的同行,我撰寫了這篇文章。本文包含如下內容: 1.OLE DB寫數據庫; 2.OLE DB讀數據庫; 3.OLE DB對二進制數據(text、ntext、image等)的處理。 首先來看看對SQL Server進行寫操作的代碼,有一定VC基礎的讀者應該可以很順利地看懂。OLE DB寫數據庫,就是這么簡單! 注: 1.以下代碼中使用的模板類EAutoReleasePtr 2.以下代碼均在UNICODE環境下編譯,因為執行的SQL語句必須是UNICODE的。設置工程為UNICODE的方法是:首先在project->settings->C/C++的屬性頁中的Preprocessor中,刪除_MBCS寫入UNICODE,_UNICODE。然后在link屬性頁中Category中選擇output,在Entry-Point symbol 中添加wWinMainCRTStartup。 EAutoReleasePtr //失敗,可能是因為數據庫沒有啟動、用戶名密碼錯等等 return;}EAutoReleasePtr //出錯 return;}EAutoReleasePtr //出錯 return;}hResult = ExecuteSQL(pICommand, pICommandText, _T(”USE PBDATA“));if(FAILED(hResult)){ //如果這里失敗,那就是SQL語句執行失敗。在此處,就是PBDATA還未創建 return;} // 創建表 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)“));//...其中幾個函數的代碼如下: HRESULT ConnectDatabase(IDBInitialize** ppIDBInitialize, LPCTSTR pszDataSource, LPCTSTR pszUserID, LPCTSTR pszPassword){ ASSERT(ppIDBInitialize!= NULL && pszDataSource!= NULL && pszUserID!= NULL && pszPassword!= NULL); UINT uTimeout = 15U;// 連接數據庫超時(秒) 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;} 以上就是寫數據庫的全部代碼了,是不是很簡單呢?下面再來讀的。 // 先用與上面代碼中一樣的步驟獲取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;} // 一個根據表中各字段的數值類型而定義的結構,用于存儲返回的各字段的值 struct CLoadLastFromDB { DBSTATUS dwdsVolume; DWORD dwLenVolume; float fVolume;}; // 此處我們只查詢了一個字段。如果要查詢多個字段,CLoadLastFromDB中要添加相應的字段定義,下面的dbBinding也要相應擴充。dbBinding[].iOrdinal要分別指向各個字段,dbBinding[].wType要根據字段類型賦合適的值。 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;