單元09 編號與樹形數據_第1頁
單元09 編號與樹形數據_第2頁
單元09 編號與樹形數據_第3頁
單元09 編號與樹形數據_第4頁
單元09 編號與樹形數據_第5頁
已閱讀5頁,還剩37頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、編號與樹形1回顧 創建索引可以明顯提高系統性能。創建索引的語法是:Create UNIQUE CLUSTERED | NONCLUSTERED Index 索引名存貯過程可加快查詢速度、提高安全性、減少網絡流量和模塊化編程。CREATE PROC語句用于創建存貯過程。EXECUTE語句用于調用存貯過程。sp_recompile用于重新編譯存儲過程。ADO.NET添加參數常使用:SqlCommand.Parameters.Add(參數名,類型)使用SqlCommand調用存貯過程,應設置屬性CommandType = CommandType.StoredProcedure; CommandTex

2、t = 存貯過程名2本單元任務 任務一 實現成績信息表中“編號”生成任務二 實現手工生成“學號”任務三 實現“學院、專業、班級”的機構樹的生成新增管理員新增教師新增學生3本單元目標創建標識列實現數據自動增長使用SCOPE_IDENTITY()獲取最后插入的標識列值理解鎖的概念根據編號規則進行編號設計,并產生編號能夠進行樹形數據的設計使用TreeView控件創建樹形4任務一實現成績信息表中“編號”自動生成 任務描述:任務分析:周麗走查張力的學生成績錄入模塊時,發現系統并未顯示指定添加成績的編號,周麗希望實現成績表編號的自動生成。 SQL Server中,使用Identity標識列(又稱為自增列)

3、,可以實現列數據的自動增長。該序號值能夠唯一標識表中的每一行。例如,當在表中插入數據行時,標識符列可自動為應用程序生成唯一的客戶回執編號。該種列具有以下三種特點:列的數據類型為不帶小數的數值類型。在進行插入(Insert)操作時,該列的值是由系統按規律生成。列值不重復,具有標識表中每一行的作用,每個表只能有一個標識列。5創建標識列IDENTITY 使用Management Studio和T-SQL創建表T-SQL創建表時指定標識列 6T-SQL創建表時指定標識列標識列可用IDENTITY屬性建立 【例9-1】創建測試表TEST,該表包含名為ID、類型為int、種子為1、遞增量為1的標識列。CR

4、EATE TABLE TEST(ID int IDENTITY(1,1), Name varchar(50)7為標識列插入數據 為包含標識列的數據表插入數據時,在通常情況下,不能顯示對標識列指定值,系統會根據標識列的定義自動填充值。【例9-2】為例9-1創建的測試表TEST中,添加兩行數據。 INSERTTEST (Name)VALUES(張三)INSERTTEST (Name)VALUES(李四)8獲取插入到IDENTITY列的標識值 獲取生成的最后一個標識值,可以使用三種方法:IDENTITYSCOPE_IDENTITY()iDENT_CURRENT()【例9-3】新注冊一個用戶王五,要求

5、告知用戶其用戶號是多少。INSERT TEST (Name) VALUES(王五)select SCOPE_IDENTITY ()假如用戶表中的用戶號為標識列,新注冊一個用戶,如何去獲取剛添加的用戶的用戶號呢?9任務實施在成績信息表中,因為(學號,課程號)才能唯一確定某行數據,因此,應設置復合主鍵(學號,課程號)。但是,建議復合主鍵應盡量少使用,所以,我們可以另設置一列“編號”,作為 主鍵。為了唯一區別每行數據,所以我們將其設置為標識列。 教師實現:為成績表添加標識列10任務二 實現手工生成 “學號”任務描述:任務分析:周麗測試新增學生模塊時,發現每次都要重新錄入學號,很容易出錯且效率很低。周

6、麗在測試記錄中指出:“新增學生時,能否像成績編號一樣,系統手工生成一個學號,并給錄入界面賦初值”。大寶經理將“新增學生”模塊返回給曾偉進行整改。 學生學號編碼規則如下:學號均由13位阿拉伯數字組成。年號(4位)+學院代碼(2位)+專業代碼(2位)+班級代碼(2位)+學生序號(3位)。如2006級計算機學院軟件開發1班的一號學生,其學號編碼:21。11創建函數采用查表法,生成學號,序號規則:年號(4位)+學院代碼(2位)+專業代碼(2位)+班級代碼(2位)+學生序號(3位)。CREATE FUNCTION f_StudentNo(Head char(10) RETURNS char(13)ASB

7、EGIN RETURN(SELECT Head+RIGHT(1001+ISNULL(RIGHT(MAX(studentNo),3),0),3) FROM student WHERE studentNo LIKE Head+%)ENDGO驗證: Select dbo.f_StudentNo(2009010305)12查表法 手工生成編號,最簡單的方法就是查詢表中的編號最大值,然后+1即得到最新的編號。 【例9-6】手工生成用戶號,用戶號規則為U+5位順序號。CREATE TABLE user_ByNum(UIDchar(6)PRIMARY KEY,UNamevarchar(20)13查表法范例

8、(1)從當前表中的查詢編號最大值,取后5位 。(2)當前最大編號+1,并且不足5位前面補零。 (3)因為該編號規則,每次插入數據都需要使用,創建函數。 SELECT ISNULL(RIGHT(MAX(UID), 5), 0)FROM user_ByNumSELECT RIGHT(100001+1中取得的最大值, 5)FROM user_ByNumCREATE FUNCTION f_NextID()RETURNS char(6)ASBEGINRETURN(SELECT U+RIGHT(100001+ISNULL(RIGHT(MAX(UID),5),0),5) FROM user_ByNum)EN

9、DGO驗證: insert into user_ByNumvalues(dbo.f_NextID(), name1)insert into user_ByNumvalues(dbo.f_NextID(), name2)14多用戶并發操作的問題(1)對用戶表插入10000行數據的腳本(2)編寫執行腳本的批處理文件 (3) 雙擊執行這4個批處理文件(每個批文件模擬一個用戶的操作)。(4)可以觀察到輸出文件的信息,很多數據行沒有插入。declare i int set i=0 while (i10000) begin insert into user_ByNum values(dbo.f_NextI

10、D(), name+convert(varchar(5), i) set i=i+1 endsqlcmd -d MySchool -i 9-6.sql -o 1.txt15鎖鎖是數據庫用來控制共享資源并發訪問的機制。鎖用于保護正在被修改的數據直到提交或回滾了事務之后,其他用戶才可以更新數據16鎖的分類 從數據庫系統的角度來看 :排他鎖(X鎖)共享鎖更新鎖從程序員的角度看:分為樂觀鎖和悲觀鎖: 樂觀鎖:完全依靠數據庫來管理鎖的工作。 悲觀鎖:程序員自己管理數據或對象上的鎖處理 17排他鎖范例 新建兩個連接,在第一個連接中對學生作學籍變更,執行: 在第二個連接,查詢學生信息,執行以下語句: 觀察到

11、,第二個連接的select查詢必須等待。 在第一個連接中再執行以下語句:commit tranbegin tran update student set studentStateID=2 where studentNo=5108000089begin tran select * from student commit tran 18觀察鎖的情況 打開活動監視器,可觀察到表student的鎖情況。19鎖提示 鎖 提 示說 明HOLDLOCK共享鎖NOLOCK語句執行時不發出共享鎖,允許臟讀,等于 READ UNCOMMITTED事務隔離級別 PAGLOCK通常采用單個表鎖的地方,采用頁鎖。REA

12、DPAST跳過任何鎖定行,執行事務,適用于READ UNCOMMITTED事務隔離級別只跳過RID鎖,不跳過頁,區域和表鎖ROWLOCK強制使用行鎖READPAST等同于NOLOCKTABLOCK表共享鎖,一直保持到語句結束TABLOCKX表排他鎖UPDLOCK更新鎖并保持到事務完成XLOCK排他鎖并保持到事務完成20解決多用戶并發問題【例9-8】多用戶并發操作時,生成用戶號 修改插入測試數據的腳本 觀察到無錯誤信息出現 alter FUNCTION f_NextID()RETURNS char(6)ASBEGIN RETURN(SELECT U+RIGHT(100001+ISNULL(RIG

13、HT(MAX(UID), 5), 0),5) FROM user_ByNum WITH(XLOCK,PAGLOCK)ENDGOdeclare i int set i=0 while (i10000) begin begin traninsert into user_ByNum values(dbo.f_NextID(), name+convert(varchar(5), i) commit transet i=i+1 end21任務實施采用查表法,生成學號,序號規則:年號(4位)+學院代碼(2位)+專業代碼(2位)+班級代碼(2位)+學生序號(3位)。CREATE FUNCTION f_Stu

14、dentNo(Head char(10) RETURNS char(13)ASBEGIN RETURN(SELECT Head+RIGHT(1001+ISNULL(RIGHT(MAX(studentNo),3),0),3) FROM student WHERE studentNo LIKE Head+%) WITH(XLOCK,PAGLOCK)ENDGO驗證: Select dbo.f_StudentNo(2009010305)22按日期生成編號 按日期生成編號需要按照當天的日期查最大編號。 【例9-9】手工生成訂單號,訂單號規則為:6位日期+6位順序號。如1表示2009年6月1日的第一張訂單

15、。CREATE TABLE tOrder(ID char(12) PRIMARY KEY,oDate DateTime DEFAULT getdate()CREATE FUNCTION f_NextID_Date()RETURNS char(12)ASBEGIN DECLARE dt CHAR(6) set dt=CONVERT(CHAR(6),GETDATE(),12) RETURN(SELECT dt+RIGHT(1000001+ISNULL(RIGHT(MAX(ID),6),0),6) FROM tOrder WITH(XLOCK,PAGLOCK) WHERE ID like dt+%)

16、ENDGO驗證: INSERT tOrder(ID) VALUES(dbo.f_NextID_Date()INSERT tOrder(ID) VALUES(dbo.f_NextID_Date()23獨立編號表法 建立一個單獨的編號表,用來保存每種編號的最新編號,獲取新編號時,只需要查詢編號表就可以了。由于編號表數據行不多,所以造成進程阻塞的可能性就非常小。【例9-10】手工生成用戶號,用戶號規則為U+5位順序號,采用獨立編號表法。 創建編號表 生成兩種編號類別 CREATE TABLE t_ID( IDName char(2) PRIMARY KEY, -編號種類的名稱 Head nvarch

17、ar(10) NOT NULL DEFAULT , -編號的前綴 CurrentNo int NOT NULL DEFAULT 0,-當前編號 IDLen int NOT NULL DEFAULT 5,-編號數字部分長度 DESCRIPTION NVARCHAR(50) INSERT t_ID SELECT YH,U,0,5,用戶號UNION ALL SELECT GB,V,0,5,VIP號24獨立編號表法 創建獲取編號的存貯過程:CREATE PROC p_NextID_TabName char(2), -編號種類ID nvarchar(20) OUTPUT -新編號ASBEGIN TRAN

18、 UPDATE t_ID WITH(ROWLOCK) SET ID=Head+RIGHT(POWER(10,IDLen)+CurrentNo+1,IDLen), CurrentNo=CurrentNo+1 WHERE IDName=NameCOMMIT TRANGO25按日期生成編號 創建獲取編號的存貯過程:CREATE PROC p_NextID_Date_TabName char(2), -編號種類BH nvarchar(20) OUTPUT -新編號ASdeclare Head char(6)BEGIN TRAN set head=CONVERT(char(6),Getdate(),11

19、2) -從編號表中獲取新編號 UPDATE tb_ID_date SET BH=Head+RIGHT(POWER(10,BHLen)+ CASE WHEN head = head THEN CurrentNo+1ELSE 1 END , BHLen),CurrentNo = CASE WHEN head = head THEN CurrentNo+1ELSE 1 END, Head= headWHERE IDName=Name COMMIT TRANGO驗證: DECLARE bh char(12)EXEC p_NextID_Date_Tab DD,bh OUTSELECT bh26任務三 實

20、現“學院、專業、班級”的機構樹的生成 任務描述:任務分析:周麗在檢測“學生查詢”模塊時,發現不能按照班級查詢,周麗提交了測試記錄,大寶經理將該模塊的整改返回給張力,并提出了整改意見:需要按照班級查詢,并要生成學院、專業、班級樹。 生成機構樹,并按照班級查詢,需要:1實現樹形的數據庫設計。2創建機構樹。3在機構樹中選擇某班級時,要得到選擇班級的班級號。27樹形數據數據庫設計 樹形數據具備以下特點:有一個或多個根結點;每個根結點有大于或等于0個子結點;每個結點最多有一個父結點,有大于或等于0個子結點; 結點的層數可以是無限的;28樹形單編號設計 單編號處理,是指采用一個字段來處理結點的編碼。例如:

21、編號名稱編號名稱01北京市0501廣州市02上海市0502深圳市03天津市0503珠海市04重慶市0504汕頭市05廣東省050301香洲區06廣西省050302吉大區07湖南省050303拱北區08湖北省050304金灣區29雙編號設計 雙編號設計就是使用兩個編號來表示一個結點,一個編號代表結點自身的編號ID(在所有結點中唯一),另一個編號代表其父結點的編號(表達結點間的關系)。例如:編號 父編號名稱編號父編號名稱1 null北京市95廣州市2 null 上海市105深圳市3 null 天津市115珠海市4 null 重慶市125汕頭市5 null 廣東省1311香洲區6 null 廣西省1

22、411吉大區7 null 湖南省1511拱北區8 null 湖北省1611金灣區30樹形主從表設計 通過設計主從表外鍵關系來表達數據之間的隸屬關系。 31TreeView控件 TreeView 控件的主要屬性: 屬性說明Nodes包含樹視圖中的頂級結點列表SelectedNode設置當前選中的結點ImageList設置樹視圖中結點的默認圖像ImageIndex樹結點顯示的默認圖像的圖像列表索引值SelectedImageIndex樹結點選定時,所顯示的圖像的圖像列表索引值CheckBoxs設置樹視圖中結點的默認圖像32TreeNodeCollection類和TreeNode類 TreeNode

23、Collection的方法說 明Add將指定的 TreeNode 對象追加到結尾Clear清空對象TreeNode的屬性說 明Text結點顯示的文本Expanded指示是否展開結點Checked指示結點的復選框是否被選中ChildNodes獲取包含當前結點的第一級子結點Nodes獲取分配給當前樹結點的 TreeNode 對象的集合33創建樹 通過設計器創建樹 通過代碼創建樹 教師演示通過設計器創建樹 34在樹中顯示圖像 在窗體中添加一個ImageList控件,設置其Images屬性。 在TreeView 控件的屬性窗口中單擊ImageList下拉菜單,然后選擇“imageList1”選項。 設

24、置顯示圖標ImageIndex,然后可再設置結點被選定時所顯示的圖標SelectedImageIndex。35通過代碼創建樹 添加根結點:添加子級結點 : TreeNode newNode = new TreeNode(根結點1);treeView1.Nodes.Add(newNode);TreeNode newNode = new TreeNode(子結點1);treeView1.Nodes0.Nodes.Add(newNode);36確定選中的樹結點 確定單擊了哪個結點 確定當前選擇結點 protected void treeView1_AfterSelect (object sender, System.Windows.Forms.TreeViewEventArgs e) / 顯示被單擊結點的文本 MessageBox.Show(e.Node.Text);private void button1_Click(object sender, EventArgs e) MessageBox.Show(treeView1.SelectedNode.Text);37任務實施1設計模塊運行界面 2創建機構

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論