程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> SqlServer數據庫 >> 關於SqlServer >> 游標與事物與錯誤消息機制

游標與事物與錯誤消息機制

編輯:關於SqlServer


  一、游標概念: 將某一結果集作為一個集合處理,且每次處理數據集的一行或一行的某些字段。

  建立游標結構如下:

  1. 定義游標,將游標與Transact-SQL語句的結果集相關聯。

      Declare @bookid int, @bname varchar(50),@bindex int
      Declare book_cursor  cursor for
            Select bookid,bookname,bookIndex from Bas_bookList

  2.  執行Transact-SQL語句數據集填充游標即打開游標

  Open book_cursor

  3.  從游標中檢索到第一行,並提取第一行或第一行的某些字段。

  Fetch  next  from book_cursor  into @bookid,@bname,@bindex

  4.  根據需要對當前行進行操作

  @@Fetch_status包括三種狀態 0,-1,-2。以此來判斷游標執行是否正確。

  0則游標執行正確,-1 游標中出現錯誤,-2 找到空行

        While @@fetch_status=0
        Begin
           Delete update insert 等等
Fetch next  from book_cursor  into @bookid,@bname,@bindex  選取下一行數據
        End

  4.  關閉游標

  Close book_cursor

  Deallocate book_cursor

  說明: 客戶端游標,被odbc所支持,在使用時會有一些限制,只能使用只進和靜態游標,它是把結果緩存到客戶端,所有游標的操作都由客戶端高速緩存下來。並不在服務器端執行,一般情況下都不這樣使用, 只是對一些服務端不支持的Transact-sql和批處理才使用。

  這小段只是我對客戶端游標的理解,僅作參考。

  二、事務,用起來很簡單這裡就不在詳細介紹了。

  1. 在存儲過程中使用事務

  語句結構:

  事務起始點: Begin transaction

  提交事務,完成自事務起始點開始的數據操作變化,釋放事務所占用的資源:Commit TranSaction

  如果事務出現錯誤,回滾:Rollback

  在事務起始點,begin transaction  tran1 使@@TRANCOUNT 按 1 遞增

  執行事務,commit ttansaction tran1    使@@TRANCOUNT 按1 遞減,直到減少到0

  回滾是到事務的起點或事務的某個保存點也就是定義點。



  2. 在C#程序中也可以使用事務

   Using(System.Data.SqlClient.SqlConnection conn=new System.Data.SqlClIEnt.SqlConnection(“數據庫連接字符串”))
{
conn.open();
using (System.Data.SqlClIEnt.SqlTransaction trans=conn.BeginTransaction())
{
    Try
{
 sql語句 ;
   Trans.Commit();
}
Catch
{
   Trans.Rollback();
}
}
}

  三、Transact-SQL實現類似於C#語言中的異常處理。Transact-SQL語句組可以包含在TRY塊中,如果TRY塊內部發生錯誤,則會將事件處理轉到Catch塊中。

  語句結構

      BEGIN TRY
          Transact-SQL語句
      END TRY
      BEGIN CATCH
          錯誤處理機制
      END CATCH

  其實以上講述的基礎知識。剛開始從事開發工作就知道明白,會用了。

  此文只是系統地總結一下。供大家參考。算不上精辟。

  我在實際的應用中發現一個問題,對於一個復雜的存儲過程,把上面三種用法綜合到一起,會提高不少的執行效率。一是為了找到錯誤點,回滾事務,把 try和 transaction組合到一起,如果大量數據要處理,可能會用到游標,有時候在想,事務當執行commit的時候才會永久地處理數據,是不是在用游標的時候也這樣,把游標寫到事務裡,把所有的游標都執行完畢,再進行事務處理,如果異常則回滾。試了一下,果然快很多。而且在Transact-Sql裡同一存儲過程定義的變量,在整個運行周期都是有效的,這就很好將整個構想實現了。例如:

   SET NOCOUNT ON;
          BEGIN TRY
          
           BEGIN TRANSACTION    tran1
          
                  DECLARE @proarageid BIGINT,@procomid BIGINT,@proagentid BIGINT,@progropid BIGINT
                
                 ---語句
           
 DECLARE acursor CURSOR
FOR SELECT id,provicename,cityname FROM Ass_ArrearageTemporary
                 OPEN acursor
                 FETCH NEXT FROM acursor INTO @proarageid,@procomid,@proagentid                 WHILE @@FETCH_STATUS = 0
                 BEGIN
                    ---語句
                         
                   FETCH NEXT FROM acursor INTO @proarageid,@procomid,@proagentid
                 END
                
                 COMMIT TRANSACTION tran1
                 CLOSE acursor
                 DEALLOCATE acursor
     END TRY
    begin CATCH
           IF @@TRANCOUNT > 0
        BEGIN
          CLOSE acursor
          DEALLOCATE acursor
          ROLLBACK  TRANSACTION tran1
          return
       END
    END CATCH


  雖不是含量很高,但也是筆者的心血。

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved