数据库游标使用
游标实际上是一种能从包括多条数据记录的结果集中每次提取一条记录的机制。游标充当指针的作用。尽管游标能遍历结果中的所有行,但他一次只指向一行。
概括来讲,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();