zoukankan      html  css  js  c++  java
  • mysql 返回查询结果,返回out返回值,多表联合查询的分页存储过程

    先谈谈又想返回out返回值,又想返回sql查询结果记录集的问题,这个在mssql里面是OK的,但是在mysql里面是不行的,原因请看

    那么解决方法是什么呢?就是Mysql支持多个结果集的返回

    用 read 先读取第一个记录集,然后再用 nextResult来读取第二个即可

    具体请看http://www.cnblogs.com/joeylee/archive/2013/02/02/2889806.html

    例如sql语句是
    SELECT me.*, GROUP_CONCAT(re.RId) AS rids FROM tb_sc_smessage me INNER JOIN tb_sc_smrecive re
    ON me.MId=re.MId
    WHERE me.TId='6d73f2fd-92fb-4f5c-a00a-e5f926543a0fAND me.FunctionId=5

    AND SendTime>=p_BeginTime AND SendTime<=p_EndTime
    GROUP BY re.MId
    ORDER BY sendtime DESC;

    那么我们修改成存储过程为


    DELIMITER $$
    USE `date`$$ DROP PROCEDURE IF EXISTS `XiaoWuHistory`$$ CREATE DEFINER=`root`@`%` PROCEDURE `XiaoWuHistory`(p_Tid VARCHAR(64),p_Functionid INT,p_BeginTime VARCHAR(64),p_EndTime VARCHAR(64),IN p_pageIndex INT, IN p_pageSize INT ) BEGIN -- 定义key字段临时表 DROP TABLE IF EXISTS _temptable_keyid; -- 删除临时表,如果存在 CREATE TEMPORARY TABLE _temptable_keyid ( `mid` INT, `content` VARCHAR(2048), functionid INT, tid VARCHAR(64), tname VARCHAR(64), sendtime DATETIME, rids VARCHAR(50000) ); -- 构建动态的sql,输出关键字key的id集合 -- 查找条件 SET @SQL ='SELECT me.*, GROUP_CONCAT(re.RId) AS rids FROM smessage me INNER JOIN smrecive re ON me.MId=re.MId'; SET @SQL=CONCAT(@SQL, ' where me.TId=''',p_Tid,''' '); IF (p_BeginTime!='' OR p_BeginTime!= NULL)THEN SET @SQL=CONCAT(@SQL, ' and SendTime>=''',p_BeginTime,''' '); SET @SQL=CONCAT(@SQL, ' and SendTime<=''',p_EndTime,''' '); END IF; SET @SQL=CONCAT(@SQL, ' and me.FunctionId=''',p_Functionid,''' GROUP BY re.MId ORDER BY sendtime DESC '); -- 准备id记录插入到临时表 SET @SQL=CONCAT('insert into _temptable_keyid(`mid`,`content`,`functionid`,`tid`,`tname`,`sendtime`,`rids`) ', @SQL); PREPARE stmt FROM @SQL; EXECUTE stmt ; DEALLOCATE PREPARE stmt; -- 下面是输出 SELECT COUNT(*) AS RecordCount FROM _temptable_keyid; -- 计算记录的起点位置 SET @STARTPOINT = IFNULL((p_pageIndex-1)*p_pageSize,0); SET @SQL='select * from _temptable_keyid '; SET @SQL=CONCAT(@SQL, ' limit ',@STARTPOINT,' , ',p_pageSize); PREPARE stmt FROM @SQL; EXECUTE stmt ; DEALLOCATE PREPARE stmt; DROP TABLE _temptable_keyid; END$$ DELIMITER ;

    在mysql里面调用试试

    CALL fn_TWeb_XiaoWuHistory('6d73f2fd-92fb-4f5c-a00a-e5f926543a0f',5,'1900-01-01','2013-03-25 10:49:06',1,3)

    结果如下

    image

    image
     

    这样就返回了2个结果集,一个表示有多少条数据,一个就是通过分页查询到的结果,那么前台如何调用呢?

    1:  repContent.DataSource = jkController.GetXiaoWuHistoryByPage(Convert.ToInt32(ddlType.SelectedValue), User.Identity.Name, null, null, pg, pagesize, ref recordcount);
    2: repContent.DataBind();
    3:   

    这里就是获取2个结果集,用 read 先读取第一个记录集,然后再用 nextResult来读取第二个即可

     1:  public List<MGetXiaoWuHistory> GetXiaoWuHistoryByPage(int functionId, string tId, string beginTime, string endTime, int pg, int pagesize, ref int recordcount)
     2:          {
     3:              IDataReader rdr = DataProvider.Instance().GetXiaoWuHistoryByPage(functionId, tId, beginTime, endTime, pg, pagesize);
     4:              List<MGetXiaoWuHistory> objArray = null;
     5:              if (rdr.Read())
     6:              {
     7:                  recordcount = Convert.ToInt32(rdr["RecordCount"]);
     8:              }
     9:   
    10:              if (rdr.NextResult())
    11:              {
    12:                  objArray = CBO.FillCollection<MGetXiaoWuHistory>(rdr);
    13:              }
    14:              return objArray;
    15:   
    16:          }
    17:   

    最后是存储过程

     1:  public override IDataReader GetXiaoWuHistoryByPage(int functionId, string tId, string beginTime, string endTime, int pg, int pagesize)
     2:          {
     3:              MySqlParameter[] parameters = {
     4:                      new MySqlParameter("@p_Tid", MySqlDbType.VarChar,64),
     5:                      new MySqlParameter("@p_Functionid", MySqlDbType.Int32),
     6:                      new MySqlParameter("@p_BeginTime", MySqlDbType.VarChar,64),
     7:                      new MySqlParameter("@p_EndTime", MySqlDbType.VarChar,64),
     8:                      new MySqlParameter("@p_pageIndex", MySqlDbType.Int32),
     9:                      new MySqlParameter("@p_pageSize", MySqlDbType.Int32)
    10:                                            };
    11:              parameters[0].Value = tId;
    12:              parameters[1].Value = functionId;
    13:              parameters[2].Value = beginTime;
    14:              parameters[3].Value = endTime;
    15:              parameters[4].Value = pg;
    16:              parameters[5].Value = pagesize;
    17:   
    18:              MySqlConnection sqlConn = MySqlHelper.OpenConnection(FenXiaoConnStr);
    19:              return MySqlHelper.ExecuteReader(sqlConn, CommandType.StoredProcedure, "fn_TWeb_XiaoWuHistory", parameters);
    20:          }
    21:   
  • 相关阅读:
    解决在Pycharm中无法显示代码提示的问题
    解决在使用pip list时出现DEPRECATION
    Pycharm 有些库(函数)没有代码提示
    Oracle 11.2.0.4 For Windows 64bit+32bit 数据库
    Windows系统下oracle数据库每天定时备份
    PowerDesigner表创建脚本双引号问题
    Oracle11g 创建数据库中问题处理(必须运行Netca以配置监听程序)
    名人名言
    项目管理
    项目管理心得:一个项目经理的个人体会、经验总结(zz)
  • 原文地址:https://www.cnblogs.com/joeylee/p/2981150.html
Copyright © 2011-2022 走看看