儲存結構和事務,儲存結構事務

來源:互聯網
上載者:User

儲存結構和事務,儲存結構事務

      重構的機房收費系統是用三層實現的,開始簡單的增刪改的時候還好說,可是當我做到充值退卡的的時候就發現我必須要學點新東西了,因為如果要進行退卡的畫,首先我要把查到的資訊插入到退卡表中,還要把卡的狀態改成退卡狀態,這就需要兩條SQL語句,但是如果我寫在一個函數中的話,第一,他們執行的順序我就不能保證,第二,如果執行完插入,可是沒有執行修改,那麼這個卡還在,這就不是意見輕鬆的事了,所以這時候就發現好東西了,那就是儲存結構和事務。

儲存結構和事務

那麼先大概介紹一下儲存結構吧。複雜的介紹就不寫了,我就把他理解成一個帶有多條SQL語句的結構,結構是死的,只有語句是活的,那麼我們就在死結構中加活語句就可以了。因為一個功能有很多時候不是一條語句可以解決的,所以大家就可以把這些語句多寫進去,方法和在程式中寫是一樣的。

事務呢,他是保證儲存結構中的SQL語句按順序執行,且都執行完,負責都不知行,即使執行了前邊的,也會讓時間倒流。我們把他理解成一條衣服語句,if   語句1,語句2... else 全不執行 end if,這樣是不是理解簡單一下,而且用起來,更簡單。

如果建立預存程序呢?

右鍵預存程序,點擊建立預存程序,然後照著模版敲就可以了

下面我就把機房收費系統的退卡代碼和儲存結構,事務給大家展示出來,讓大家看看他有多簡單。但是因為這個程式我還沒有完善,所以這隻是準系統的實現,在我完成系統後,會把完善好的代碼為大家呈現上來。

預存程序加事務

<span style="font-size:14px;"><span style="font-size:14px;"><span style="font-size:18px;">USE [jf_Charge]GO/****** Object:  StoredProcedure [dbo].[Pro_CancelCard]    Script Date: 07/28/2014 19:41:05 ******/SET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGO-- =============================================-- Author:孟海濱-- Create date: 2014-7-27-- Description:退卡預存程序-- =============================================ALTER PROCEDURE [dbo].[Pro_CancelCard]@Card_ID char(11),@head char(11)    --定義參數ASBEGIN tran--執行事務SET NOCOUNT ON;DECLARE @SumRowCount INT --申明一個變數,用來判斷語句成功了幾天。declare @cancelMoney numeric(18,1)--申明變數declare @Student_Name char(11)SET @SumRowCount=@@ROWCOUNTSelect * from StudentView  Where Card_ID=@Card_ID--從視圖中擷取學生資訊SET @SumRowCount=@SumRowCount+@@ROWCOUNTset  @CancelMoney= (Select charge from StudentView Where Card_ID=@Card_ID)--將查到的金額資訊複製給@CancelMOneyinsert into CancelCard_info (Card_ID,CancelMoney,head ) values(@Card_ID,@cancelMoney ,@head ) --向退卡表中插入資訊SET @SumRowCount=@SumRowCount+@@ROWCOUNTupdate Card_Info set IsExist='YES' where Card_ID=@Card_ID and IsExist='No'--修改Card_info中的狀態資訊SET @SumRowCount=@SumRowCount+@@ROWCOUNTIF @SumRowCount=4BEGIN COMMIT TRAN--如果都執行成功,那麼開始執行事務ENDELSEBEGIN ROLLBACK TRANSACTION  --如果不成功,會滾到以前,讓時間倒流END</span></span></span>


DAL層


<span style="font-size:14px;"><span style="font-size:14px;"><span style="font-size:18px;">Imports EntityImports System.Data.SqlClientPublic Class SQLServerCancelCard : Implements IDAL.ICancelCard    Public Function QueryCancelCard(cancel As CancelCardEntity) As CancelCardEntity Implements IDAL.ICancelCard.QueryCancelCard        Return Nothing    End Function    ''' <summary>    ''' 該方法用來退卡並利用預存程序,把退卡資訊顯示出來,其中需要執行多條語句,包括插入退卡資訊    ''' 修改卡資訊的是否存在,並對視圖的資訊進行查詢,並顯示出來    ''' </summary>    ''' <param name="cancel"></param>    ''' <returns>傳回型別是StudentInfoEntity,因為退卡後顯示的資訊是需要從Student的資訊中調用</returns>    ''' <remarks></remarks>    Public Function CancelCard(cancel As CancelCardEntity) As StudentInfoEntity Implements IDAL.ICancelCard.CancelCard        Dim table As DataTable      '定義一個DataTable        Dim cancelcardinfo As New Entity.StudentInfoEntity  '定義一個實體,用來返回資料        Dim sqlhelper As New SqlHelper        Dim User_ID As New PublicUserEnity  '公用實體,用來將登入者的姓名賦值給實體的屬性        Dim strSQL As String = "Pro_CancelCard"        '定義參數,防止SQL注入        Dim paras As SqlParameter() = {New SqlParameter("@Card_ID", cancel.Card_ID),                                        New SqlParameter("@head", cancel.head)}        '執行SQL語句,返回Datatable        table = sqlhelper.ExecSelect(strSQL, CommandType.StoredProcedure, paras)        '如果查詢到的table不為空白,那麼就把他的部分值返回給實體屬性,最後在返回實體        If table.Rows.Count <> 0 Then            cancelcardinfo.Student_Name = table.Rows(0).Item("Student_Name")            cancelcardinfo.Charge = table.Rows(0).Item("Charge")        End If        '返回實體        Return cancelcardinfo    End FunctionEnd Class</span></span></span>

SQLHelper

<span style="font-size:14px;"><span style="font-size:14px;"><span style="font-size:18px;"> ''' <summary>        ''' 執行查詢的操作,(有參),參數不限        ''' </summary>        ''' <param name="cmdText">需要執行語句,一般是Sql語句,也有預存程序</param>        ''' <param name="cmdType">判斷Sql語句的類型,一般都不是預存程序</param>        ''' <param name="paras">傳入的參數</param>        ''' <returns></returns>        ''' <remarks></remarks>        Public Function ExecSelect(ByVal cmdText As String, ByVal cmdType As CommandType, ByVal paras As SqlParameter()) As DataTable        Dim sqlAdapter As SqlDataAdapter        Dim dt As New DataTable        Dim ds As New DataSet        '還是給cmd賦值            cmd.CommandText = cmdText        cmd.CommandType = cmdType        cmd.Connection = conn        cmd.Parameters.AddRange(paras)  '參數添加            sqlAdapter = New SqlDataAdapter(cmd)  '執行個體化adapter            Try            sqlAdapter.Fill(ds)           '用adapter將dataSet填充                 dt = ds.Tables(0)             'datatable為dataSet的第一個表                cmd.Parameters.Clear()        '清除參數            Catch ex As Exception            MsgBox("查詢失敗", CType(vbOKOnly + MsgBoxStyle.Exclamation, MsgBoxStyle), "警告")        Finally                            '最後一定要銷毀cmd                Call CloseCmd(cmd)        End Try        Return dt    End Function</span></span></span>

抽象工廠+介面+設定檔Factory層
<span style="font-size:14px;"><span style="font-size:14px;"><span style="font-size:18px;">Imports System.ConfigurationImports System.Reflection   '添加設定檔引用Imports IDALPublic Class DataAccess    '設定檔,抽象工廠    Private ReadOnly assemblyName As String = "DAL"    Private ReadOnly db As String = ConfigurationManager.AppSettings("DB")    Dim ClassName As String    '建立退卡的抽象工廠      Public Function CreateOnline() As IDAL.IOnline        ClassName = assemblyName + "." + db + "CancelCardDAL"        Return CType(Assembly.Load(assemblyName).CreateInstance(ClassName), ICancelCard)    End FunctionEnd Class</span></span></span>
設定檔
<span style="font-size:14px;"><span style="font-size:14px;"><span style="font-size:18px;"><?xml version="1.0" encoding="utf-8" ?><configuration>    <startup>        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />    </startup>      <appSettings>        <add key="strCnn" value="server=***.***.**.***;database=jf_Charge;uid=sa;pwd=123456" />       <add key="DB" value="SQLServer"/>     </appSettings>              </configuration></span></span></span>

因為這裡介紹的是儲存結構和事務,所以只是把相關的代碼給大家,因為B層和U層和沒有預存程序一樣,這裡就不再浪費大家的時間,其時大家也可以發現,他在程式中就是當成了一條SQL語句來執行的,具體的效果確不是在程式裡邊加幾條SQL語句就能比的了的。1.首先他的結構固定,學習也方便,我們需要改動的沒有很2.事務的作用儘管和If語句很想,但是我們在D層加太多的If難免就會覺得冗雜,但是事務不會。3.運行效果他會更快,至於為什麼,預存程序只在創造時進行編譯,以後每次執行預存程序都不需要重新編譯,而一般SQL語句每執行一次就編譯一次,所以使用儲存提高資料庫的執行速度。

邏輯結構與儲存結構的不同與相同點

複製的有意思伐。。。解釋你自己看上面那個複製的,不多說了。
資料的邏輯結構也稱為資料結構,分兩大類:線性結構和非線性結構。
儲存結構分四類:順序儲存、連結儲存、索引儲存和散列儲存。
線性結構中,包括了順序演算法,和鏈表。也就是說,儲存結構的前兩種用的是線性結構的演算法,非線性結構至少存在一個資料元素,它具有兩個或者兩個以上的前驅或後繼.典型的就是樹和二叉樹。而索引演算法用的就是樹的結構,也即是說他屬於非線性結構演算法。最好是散列儲存,典型例子就是hash(雜湊)用的是隨即散列函數,當然是非線性結構演算法。
由此可見,儲存結構用的是不同的邏輯結構,也就是用了兩種不同的演算法。這個就是他們兩者的關係。
 
線性結構有哪幾種儲存結構

資料元素之間的關係有兩種不同的表示方法:順序映象和非順序映象,並由此得到兩種不同的儲存結構:順序儲存結構和鏈式儲存結構。  順序儲存方法:它是把邏輯上相鄰的結點儲存在物理位置相鄰的儲存單元裡,結點間的邏輯關係由儲存單元的鄰接關係來體現,由此得到的儲存表示稱為順序儲存結構。順序儲存結構是一種最基本的儲存表示方法,通常藉助於程式設計語言中的數組來實現。  連結儲存方法:它不要求邏輯上相鄰的結點在物理位置上亦相鄰,結點間的邏輯關係是由附加的指標欄位表示的。由此得到的儲存表示稱為鏈式儲存結構,鏈式儲存結構通常藉助於程式設計語言中的指標類型來實現。  順序儲存和連結儲存是資料的兩種最基本的儲存結構。  在順序儲存中,每個存侗含有所存元素本身的資訊,元素之間的邏輯關係是通過數組下標位置簡單計算出來彭線性表的順序儲存中,若一個元素儲存在對應數組中的下標位置為i,則它的前驅元著數組中的下標位置為i一1,它的後繼元素在對應數組中的下標位置為i+1。在連結存個儲存結點不僅含有所存元素本身的資訊,而且含有元素之間邏輯關係的資訊。  其中data表示範圍,用來儲存.一個元素。Pl,p2,…,Pill(1n≥1)均為指標域,每個韋值為其對應的後繼元素或前驅元素所在結點(以後簡稱為後繼結點或前驅結點)的存通過結點的指標域(又稱為鏈域)可以訪問到對應的後繼結點或前驅結點,該後繼結一《結點稱為指標域(鏈域)所指向(連結)的結點。若一一個結點中的某個指標域不需要指f點,則令它的值為空白,用常量N-LILL表示,NIJ】上在iostream.h中被定義為數值0。  資料的連結儲存表示又被稱為連結資料表。當連結資料表中的每個結點只含有一個指標稱為單鏈表。
 

相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.