1. 程式人生 > >個人機房重構——儲存過程

個人機房重構——儲存過程

         SQL server中的儲存過程在剛剛接觸資料庫知識的時候,僅限於聽說,通過這次機房重構,對SQL server的強大有了更加深刻的理解。儲存過程的使用也極大地方便了我們在機房重構過程中對資料庫中資料的操作。那麼讓我們來看看儲存過程的神奇之處吧!

概述

        儲存過程(Stored Procedure)是使用Transact-SQL語言編寫的一段能實現指定功能的程式。其次,這種程式被SQL Server編譯好後,存放在SQL Server資料庫中。使用者可以通過儲存過程的名稱和引數傳遞呼叫這些具有指定功能的儲存過程。儲存過程也是資料庫物件。人們通常使用儲存過程提高資料庫的安全性和減少網路通訊資料量。

優點

使用儲存過程有以下幾個優點: 1)執行速度快,效率高:因為SQL Server會事先將儲存編譯成二進位制可執行程式碼,所以在執行儲存過程時,SQL Server不需要在對儲存過程進行編譯,可以加快執行的速度。 2)模組式程式設計:儲存過程在建立完畢之後,可以在程式中對此被呼叫,而不必重新編寫改T-SQL語句。在儲存過程建立之後,也可以 對儲存過程進行修改,而且一次修改之後,所有呼叫改儲存過程的程式所得到的程式結果都會被修改,提高了程式的可移植性。 3)減少網路流量:由於儲存過程是儲存在資料庫中,所以使用的時候只需要傳一個指定那個儲存過程的引數就可以了,所以減少了網路流量,提高執行速度。
4)安全性:儲存過程可以作為一種安全機制來使用,對於不同的使用者許可權呼叫不同的儲存過程。

建立方法

建立方法可以有兩種,一種是通過SQL語句來進行建立,一種是通過SQL Server Management Studio。方法不同,但使用起來都很方便,可以根據自己需要選擇。

SQL語句

--建立儲存過程PROC_GetStudent

CREATE PROC PROC_GetStudent
AS 
SELECT *
FROM Student_Info

GO 

--呼叫儲存過程
EXEC PROC_GetStudent


SQL Server Management Studio

1)建立過程如圖所示:
                   

儲存過程編寫

本文以機房收費系統退卡為例,介紹一下如何實現儲存過程功能。
------------------------
--應用:註冊功能
--操作:新增退卡資訊到CancelCard_Info和修改卡號狀態
--製作:王洪玉
--時間:2016/2/19
------------------------

CREATE PROCEDURE PROC_CancelCard
   @CardNo varchar(15),             --定義傳遞的引數型別
   @UserID varchar(10),
   @Date date,
   @Time time(7)


   AS

   Declare
   @cancelMoney decimal(18,0)      --宣告變數

  begin

  --執行查詢語句將查詢到的金額傳給引數
  Select @cancelMoney=Cash From Card_Info Where [email protected]          

--向Cancel_Info表中新增退卡資料
   INSERT INTO CancelCard_Info(CardNo,CancelCash,Date,Time,UserID) values
  (@CardNo,@cancelMoney,@Date,@Time,@UserID)

--修改card狀態
   Update Card_Info Set Status='未使用', Cash='0' WHERE [email protected]
  
 END


D層的呼叫

既然已經編寫好儲存過程,那麼我們來看看D層是如何使用儲存過程的。
    Public Function ICancelCard(ByVal Rcard As Entity.EN_StudentInfo) As Integer Implements ICancelCardDAL.ICancelCard
        Dim sqlhelper As New SQLHelper.SqlHelper
        Dim cmdText As String
        Dim intCard As Integer

        cmdText = "PROC_CancelCard"       '將儲存過程名稱賦值給定義的字串
        Dim paras As SqlParameter() = {New SqlParameter("@CardNo", Rcard.CardNo),              '傳遞D層的引數
                                       New SqlParameter("@UserID", AllUse.AllUserID),
                                       New SqlParameter("@Date", Rcard.DateNow),
                                       New SqlParameter("@Time", Rcard.Time)
                                      }
        intCard = sqlhelper.ExecAddDelUpdate(cmdText, CommandType.StoredProcedure, paras)      '呼叫SQLHelper,查詢資料,需要注意的                                                                                                '是使用CommandType.StoredProcedure,                                                                                                '不然無法識別該儲存過程。
        Return intCard     '返回查詢結果
    End Function


總結:對於新知識和沒有接觸過的知識,要敢於嘗試,接受加理解才是學習的王道。所以,在我們接觸到新的知識的時候,將他應用於實踐,會讓我們學習起來起到事半功倍的效果。多實踐,多總結這也許是最好的學習方法了吧!