【VB.Net機房重構】儲存過程的使用

00潤物無聲00發表於2015-04-26

        重構機房的時候,聽到了很多新的名詞,其實也不是,在學習SQL的時候都接觸過,但那個時候緊緊是停留在了理論上,現在通過機房進行實踐。觸發器,檢視,儲存過程等等

        儲存過程:將一系列相關聯的SQL語句集合到一起。在程式的程式碼中直接執行儲存過程的名字,不用每次都寫這麼多語句;

        重構的充值表,需要同時對三張表新增資料,如果用程式碼編寫的話,實現是沒有問題的,但是如果同時操作的表更多了,怎麼辦。怎麼提高程式碼的效率,提高系統的效能?這個時候用上儲存過程,就初步解決了這個問題,提高了程式碼重用性。


優點:

1.安全性。        --保護表名和欄位名。
2.提高SQL Server執行速度    --一次編譯,多次執行。
3.提高重用性        --相同的功能需求
4.減少伺服器負擔。    --降低伺服器的使用率,提高訪問速度。
5.將複雜操作,用儲存過程封裝起來與資料庫提供的事務處理結合一起使用。

分類:

1.自定義的
2.擴充套件的:程式設計語句建立的外部過程,載入動態連結庫。
3.系統的。用來進行系統的各項設定.取得資訊.相關管理工作。例如:sp_help,sp_rename等等。
是否有引數

1.帶引數

2.不帶引數


對儲存過程的各種操作:

1.建立(可以用程式碼或者企業管理器)

自定義儲存過程與系統儲存過程進行區分,不要使用sp_開頭。

CREATE PROCEDURE pro_name    --儲存過程名字;
    [ @parameter data_type]    [ output ]    --引數和引數型別   --引數是輸出引數
    [ with encryption ]    --加密,將建立儲存過程本身的語句加密。保護儲存過程用到的表資訊。提高資料庫的安全性。
    AS
    Begin

        <sql_statement>

    End


2.執行
EXEC 或者 EXECUTE pro_name

3.修改
將CREATE修改為ALTER   --ALTER不能修改儲存過程的名字。

4.修改儲存過程(,表,檢視等)的名字。使用系統儲存過程
SP_RENAME 'pro_old','pro_new'

5.檢視儲存過程
用系統的儲存過程 sp_helptext pro_name;如果儲存過程加密的話,就不能看到了,加密提高了資料的安全性。

6.刪除儲存過程
刪除前,要確保沒有物件在使用儲存過程。

DROP PROC pro_name.


實踐:

機房充值表的儲存過程,帶有引數

CREATE PROCEDURE pro_Register
	-- Add the parameters for the stored procedure here
@cardNo char(11),@cash numeric(10,3),@IsCheck char(10),@status char(10) ,        --定義所有的變數,型別要和資料庫表中的型別一致;
@cardDate char(10),@cardTime char(10),
@addMoney numeric(19,4),@rechargeDate date,@rechargeTime time,
@userID char(10),@studentNo char(11),@studentName char(10),@sex char(6),
@department char(10),@grade char(10),@studentClass char(10),@note varchar(50)
AS
BEGIN                                                                           --Begin ...End   塊語句
	-- SET NOCOUNT ON added to prevent extra result sets from
	-- interfering with SELECT statements.
	SET NOCOUNT ON;
    -- Insert statements for procedure here                                     --向表中插入內容;
insert into T_Student_Info (cardNo ,studentNO ,studentName ,sex ,department ,grade ,studentClass ,note ) values (@cardNo ,@studentNo ,@studentName ,@sex ,@department ,@grade ,@studentClass ,@note )
insert into T_card_Info (cardNo ,cash ,IsCheck ,status,cardDate ,cardTime,userID )values  (@cardNo ,@cash ,@IsCheck ,@status ,@cardDate ,@cardTime ,@userID )
insert into T_ReCharge_Info (cardNo ,addMoney ,rechargeDate ,rechargeTime ,userID ,status ) values(@cardNo ,@addMoney ,@rechargeDate ,@rechargeTime ,@userID ,@status )
END
GO

在D層程式碼:

     Public Function insertStudent(student As StudentEntity, card As CardEntity, recharge As RechargeEntity) As Integer Implements IDAL.IStudent.insertStudent
        Dim helper As New SqlHelper.SqlHelper                                  '例項化SQLHelper類
        Dim params As SqlParameter() = {New SqlParameter("@StudentNo", student.StudentNo),            '儲存過程中出現的引數
                                        New SqlParameter("@cardNo", card.CardNo),
                                        New SqlParameter("@studentName", student.StudentName),
                                        New SqlParameter("@sex", student.Sex),
                                        New SqlParameter("@department", student.Department),
                                        New SqlParameter("@grade", student.Grade),
                                        New SqlParameter("@StudentClass", student.StudentClass),
                                        New SqlParameter("@note", student.Note),
                                        New SqlParameter("@cash", card.Cash),
                                        New SqlParameter("@Ischeck", card.IsCheck),
                                        New SqlParameter("@status", card.Status),
                                        New SqlParameter("@cardDate", card.CardDate),
                                        New SqlParameter("@cardTime", card.CardTime),
                                        New SqlParameter("@addMoney", recharge.AddMoney),
                                        New SqlParameter("@rechargedate", recharge.RechargeDate),
                                        New SqlParameter("@rechargeTime", recharge.RechargeTime),
                                        New SqlParameter("@userID", Entity.UserEntity.UserHead)
                                       }
        Dim result As Integer                    '定義一個整形變數,存放返回值;
        '執行helper物件的ExecuteNonQuery帶引數的方法,引數是儲存過程名,儲存過程型別,還有引數;
        result = helper.ExecuteNonQuery("pro_register", CommandType.StoredProcedure, params)        
        Return result
    End Function

        儲存過程的使用,不單單減少了程式碼,而且提高了系統的效能和效率,機房重構,更多的還是在於接觸很多以前沒有接觸的東西,在實踐中發現它們的優點,善於使用,善於發現更加的解決方案。



相關文章