• 数据库游标使用


    游标实际上是一种能从包括多条数据记录的结果集中每次提取一条记录的机制。游标充当指针的作用。尽管游标能遍历结果中的所有行,但他一次只指向一行。

    概括来讲,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();
  • 相关阅读:
    Nacos-服务注册
    left join多表使用聚合函数count数据出错
    macos报 svn: error: The subversion command line tools are no longer provided by Xcode
    解决mac OSX下安装git出现的"git命令需要使用开发者工具。您要现在安装该工具吗"(19款Mac)
    JSP 页面 jstl 时间戳 long型转时间
    jdk生成证书,网站请求变成https
    java从数据库读取菜单,递归生成菜单树
    mysql PacketTooBigException 的处理方式
    用注解方式写定时任务
    eclipse快捷键
  • 原文地址:https://www.cnblogs.com/sumuncle/p/5198459.html
Copyright © 2020-2023  润新知