數據庫游標使用


游標實際上是一種能從包括多條數據記錄的結果集中每次提取一條記錄的機制。游標充當指針的作用。盡管游標能遍歷結果中的所有行,但他一次只指向一行。

概括來講,SQL的游標是一種臨時的數據庫對象,即可以用來存放在數據庫表中的數據行副本,也可以指向存儲在數據庫中的數據行的指針。游標提供了在逐行的基礎上操作表中數據的方法。

游標的一個常見用途就是保存查詢結果,以便以后使用。游標的結果集是由SELECT語句產生,如果處理過程需要重復使用一個記錄集,那么創建一次游標而重復使用若干次,比重復查詢數據庫要快的多。

大部分程序數據設計語言都能使用游標來檢索SQL數據庫中的數據,在程序中嵌入游標和在程序中嵌入SQL語句相同

 

 

 

使用實例:

IF EXISTS(SELECT *FROM sysobjects WHERE name='sp_ContestSubmit')  
    DROP PROC sp_ContestSubmit
GO
-- =============================================
-- Author:        zqt
-- Create date: 2011-11-25
-- Desc:        系統管理員批量給未交卷的考生交卷-競賽
-- =============================================
Create proc sp_ContestSubmit
@GroupID int            --考核ID
as
--申明一個游標
DECLARE MyCursor CURSOR    
    FOR select PK_UserExamID,FK_UserID,FK_ExamOrContestID from Score_UserExam where IsComplete=0 AND  FK_ExamOrContestID in(select PK_ContestInfoID from Contest_Info where FK_ContestGroupID=@GroupID)

--打開一個游標    
OPEN MyCursor

--循環一個游標
DECLARE @UserExamID int ,@UserID int ,@ExamManageID int
    FETCH NEXT FROM  MyCursor INTO @UserExamID, @UserID,@ExamManageID
WHILE @@FETCH_STATUS =0
    BEGIN
        --獲取考試考試分數
        DECLARE @UserExamScore int
        select @UserExamScore=sum(Score) from Score_UserAnswer where FK_UserID=@UserID AND FK_UserExamID=@UserExamID
        
        --修改考生交卷信息
        UPDATE [Score_UserExam] SET [Score] =@UserExamScore,[IsComplete] = 1,[EndTime] = getdate(),[DurationSecs] = datediff(ss,BeginTime,getdate()) where PK_UserExamID=@UserExamID 
        FETCH NEXT FROM  MyCursor INTO @UserExamID, @UserID,@ExamManageID
    END    

--關閉游標
CLOSE MyCursor
--釋放資源
DEALLOCATE MyCursor

/* 測試
    exec sp_ContestSubmit 1
*/ 
GO

C#調用:

 

SqlConnection sqlconn=new SqlConnection("server=.;uid=sa;pwd=;database=Test");
            sqlconn.Open();
            SqlCommand sqlcmd=new SqlCommand();
            sqlcmd.Connection=sqlconn;
            sqlcmd.CommandText="dt_Inf";//指定存儲過程名
            sqlcmd.CommandType=CommandType.StoredProcedure;
            SqlDataReader reader=sqlcmd.ExecuteReader();
            while(reader.Read())
            {
                listBox1.Items.Add( reader[0].ToString()+"|"+reader[1].ToString());
            }
            
            sqlconn.Close();

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM