一、預存程序 (StoredProcedure)是在大型資料庫中,一組為了完成特定功能的SQL語句集,經編譯後儲存在資料庫,使用者通過指定預存程序的名字並給出參數(如果該過程帶有參數)來執
行它。
1、預存程序的優點:
1)預存程序只在創造時進行編譯,以後每次執行預存程序都不需要重新編譯,而一般SQL語句每執行一次就編譯一次,所以使用儲存提高資料庫的執行速度。
2)當對資料庫進行複雜操作時(如對多個表進行Update,Insert,Quey,Delete時),可將此複雜操作用於預存程序封裝起來與資料提供的資料結合起來一起使用。
3)預存程序可以重複使用,可減少資料庫開發人員的工作量。
4)安全性高,可設定只有某此使用者才具有對指定預存程序的使用權。
二、資料庫事務(DatabaseTransaction),是指作為單個邏輯工作單元執行的一系列操作。通過將一組相關操作組合為一個要麼全部成功,要麼全部失敗的單元。
1、事務的屬性:
1)原子性:要麼都執行,要麼都不執行;不可分割。
2)一致性:事務完成後,必須使所有的資料保持一致的狀態。維護資料庫資料的完整性!
3)隔離性:由並發事務所作的修改必須與任何其它並發事務所作的修改隔離。事務查看資料時資料所處的狀態,要麼是另一併發事務修改它之前的狀態,要麼是另一事務修改它之後的狀態,事務不會查看中間狀態的資料。
4)持久性:事務完成之後,它對於系統的影響是永久性的。該修改即使出現致命的系統故障也將一直保持。
2、事務的優點:
1)使用事務:可以簡化錯誤恢複並使應用程式更加可靠。
2)特別是涉及到銀行交易時,利用事務保證了交易的平穩性和可預測性的技術。
理論知識先簡單介紹到這裡,下面介紹一下:預存程序與事務在機房收費系統個人版中的應用。還請大家多多指導:
以儲值為例,當我給某學生儲值的時候,需要做這些工作,1)它需把充的值與T_Student表中的餘額進行累加;2)還需要把充的值的卡號,儲值金額,日期和時間插入到T_AndMoney當中。
此例子的程式設計思路:從UI層傳遞參數------->Facade----->BLL------>Factory+IDAL------>DAL(調用預存程序來實現多表操作,如果成功返回為True,否則捕獲異常)------->逐層返回Boolean類型,直到UI根據傳回值給出是否成功提示。
DAL代碼:
Public Class SqlserverStudent : Implements IDAL.StudetInfo'用設定檔設定連接字串 Dim strConnStr As String = ConfigurationManager.AppSettings("connStr") Dim conn As SqlConnection = New SqlConnection(strConnStr) '儲值金額 Public Function FindStu2(ByVal enStudent As Entity.StudentEntity) As Boolean Implements IDAL.StudetInfo.FindStu2'把預存程序名稱賦值給字串 Dim strSql As String = "PRO_AndMoney" '執行個體化一個cmd的命令 Dim cmd As New SqlCommand(strSql, conn) '給參數賦值 cmd.CommandType = CommandType.StoredProcedure cmd.Parameters.Add(New SqlParameter("@cardNo", enStudent.CardNo)) cmd.Parameters.Add(New SqlParameter("@addMoney", enStudent.Money)) cmd.Parameters.Add(New SqlParameter("@describe", enStudent.describe)) cmd.Parameters.Add(New SqlParameter("@date", enStudent.AddDate)) cmd.Parameters.Add(New SqlParameter("time", enStudent.AddTime)) Try conn.Open()'通過該句判斷是否執行成功。 cmd.ExecuteNonQuery() Catch ex As Exception’如果預存程序發生交易回復,則會捕獲異常。 MsgBox(ex.Message) End Try Return True End Function
資料庫中預存程序+事務:
USE [Charge3]GOCreate PROCEDURE [dbo].[PRO_AndMoney](@cardNo varchar(8),@addMoney varchar(10),@describe varchar(50),@date varchar(10),@time varchar(8))as Begin --事物set Nocount on; --開啟時set xact_abort on;--當xac_abort的參數為on時,可以檢測是否錯誤,如果錯誤,不會提交,反而會復原所有的操作。begin Tran --開始一個事物--更新學生表中的欄位update T_Student set money= cast((cast(@addMoney as int )+cast(money as int)) as varchar) where cardNo =@cardNo --向儲值表中插入一條記錄 (資料類型轉化,cast(變數,轉換的類型))insert into T_AddMoney (cardNo ,addMoney ,addDate ,addTime ) VALUES(@cardNo,@addMoney,@date ,@time )--如果資料操作無錯誤if @@ERROR =0commit Tran --提交事務elserollback Tran --復原事務end
通過D層傳回值,最終反饋成UI層,即可完成操作。
知識補充:事務內設定儲存點
使用者可以在事務內設定儲存點或標記。儲存點定義如果有條件地取消事務的一部分,事務可以返回的
位置。如果將交易回復到儲存點,則必須(如果需要,使用更多的Transact-SQL 陳述式和 COMMIT
TRANSACTION語句)繼續完成事務,或者必須(通過將交易回復到其起始點)完全取消事務。若要
取消整個事務,請使用 ROLLBACK TRANSACTIONtransaction_name 格式。這將撤消事務的所有語句和
過程。
代碼:
Create Procedure MyProcedureASBeginSet NOCOUNT ON;Set XACT_ABORT ON;begin tran ok --開始一個事務OK delete from rxqz where qz= 'rx015 ' --刪除資料 save tran bcd --儲存一個事務點命名為bcdupdate sz set name='李麗s' where name= '李麗'--修改資料if @@error<>0 --判斷修改資料有沒有出錯 begin --如果出錯 rollback tran bcd -- 復原事務到BCD 的還原點commit tran ok --提交事務end else --沒有出錯commit tran ok --提交事務 End
說明:1、@@error判斷是否有錯誤,為0表示沒有錯誤,但是對那種重大錯誤無法捕捉,而且@@error只能前一句sql語句生效。
注意:資料庫中類型轉化,cast(變數,轉換的類型)
一點小心得給大家分享一下:
1、只空想,不實現,只是徒勞!
2、我們所想要的答案幾乎都在網上,戰勝恐懼,真的沒有什麼大不了!
3、學習要定要心靜!浮躁只能削弱你的積極性,浪費時間,降低效率!