游標實際上是一種能從包括多條數據記錄的結果集中每次提取一條記錄的機制。游標充當指針的作用。盡管游標能遍歷結果中的所有行,但他一次只指向一行。
概括來講,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();