再看數據庫——(1)存儲過程
當我們運行一個比較簡單的操作時,一般都是用SQL語句。可是當邏輯越來越復雜時,只使用順序運行的SQL語句序列表現出非常大的局限性。這時,就能夠考慮用還有一種方法了。那就是存儲過程。
如今數據庫系統往往採用客戶機/server計算模式,非常多工作能夠在client完畢,也能夠在server端完畢。
客戶機/server系統與傳統的數據庫系統的一個非常重要的差別是,在傳統的數據庫系統中僅僅存放數據,全部的應用程序都在用戶端,都與用戶實際執行的應用程序捆綁在一起;而客戶機/server系統中,在數據庫中還存放程序。因為這樣的程序以數據庫對象的形式存儲在數據庫中。因此稱為存儲過程。
建立存儲過程:
存儲過程的一般結構:
應用樣例:
向NiuNan數據庫的news表中添加一條記錄。
news表中的字段有:
編寫對應的存儲過程:
SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO -- ============================================= -- Author: 牛腩 -- Create date: 二〇一四年四月三日 15:06:13 -- Description: 添加新聞 -- ============================================= CREATE PROCEDURE [dbo].[news_Insert] --定義變量 @title varchar(100),@content text,@caid int AS BEGIN --插入語句 INSERT INTO news(title, [content], categoryId) VALUES (@title,@content,@caid) END
運行存儲過程之後,能夠驗證一下.
exec news_Insert "娛樂新聞","《爸爸去哪兒2》楊陽洋多多貝兒 帥爸萌娃大比拼 ",4
在C#中調用存儲過程:
#region 添加新聞 /// <summary> /// 添加新聞 /// </summary> /// <param name="n">新聞實體類</param> /// <returns></returns> public bool Insert(News n) { //TODO:添加新聞 bool flag = false; //存儲過程名為"news_Insert" string cmdText = "news_Insert"; //給變量賦值 SqlParameter[] paras = new SqlParameter[]{ new SqlParameter ("@content",n.content), new SqlParameter ("@title",n.title ), new SqlParameter ("@categoryId",n.categoryId )}; //運行sqlHelper。CommandType為存儲過程類型 int res = sqlhelper.ExecuteNonQuery(cmdText, paras, CommandType.StoredProcedure); if (res > 0) { return true; } return flag; } #endregion
使用存儲過程有非常多長處:
1、提高運行速度。
在運行之前,存儲過程的語法和語義分析工作已經完畢。當調用時,其運行的SQL語句的大部分準備工作已經完畢。
對照之下。交互運行的SQL語句時解釋運行的,它的速度就比較慢了。
2、增強了SQL的功能和靈活性。存儲過程能夠用流程控制語句編寫。有非常強的靈活性。能完畢復雜的邏輯推斷和復雜的運算。
3、能夠減少網絡的通信量。在前面已經提到。存儲過程存儲在server端,運行所有邏輯流程僅須要向server發送一次過程請求就可以。
4、減輕了程序編寫的工作量,這個事顯而易見的。
5、間接實現安全控制功能。能夠授權某些用戶運行某個存儲過程來完畢同意範圍內的信息查詢。而不直接在表和視圖上進行查詢。
當然,它也會有一些缺點:
SQL本身是一種結構化查詢語言,加上了一些控制(賦值、循環和異常處理等),但不是OO的,本質上還是過程化的,面對復雜的業務邏輯。過程化的處理會非常吃力。
還存在不便於調試。沒辦法應用緩存和無法適應數據庫的分割(水平或垂直分割)等問題。數據庫分割之後,存儲過程並不清楚數據存儲在哪個數據庫中。
系列博客推薦:
再看數據庫——(1)存儲過程
再看數據庫——(2)視圖
再看數據庫——(3)觸發器
再看數據庫——(1)存儲過程