1. 程式人生 > >再看數據庫——(1)存儲過程

再看數據庫——(1)存儲過程

靈活 技術分享 ted pop 能夠 數據庫對象 順序 記錄 爸爸

當我們運行一個比較簡單的操作時,一般都是用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)存儲過程