zoukankan      html  css  js  c++  java
  • C#处理MySql多个返回集

    关于Mysql返回多个集java和Php的较多,但是C#的完整代码好像没见过,研究了一下做个封装以后用

    做一个Mysql的简单分页查询,有两个返回集

    Sql语句如下

    SELECT COUNT(*) from  poster;
    select 
        t.PosterID,
        t.PostTime,
        t.Title
     from app_us_poster t ORDER BY t.PostTime desc LIMIT startPageNum,endPageNum;

    这里MySql中返回是两个集,如何通过C#获取这两个值呢,需要用到MySqlDataAdapter和MySqlDataReader这两个类

    查看MySqlDataAdapter类

    image

    现在多了很多FillAsync的方法,用的Task异步写入。关于Task的实例可以参看这篇博客,各种例子是很好的

    可以看到里面有我们需要的方法哈,那就是

    public Task<int> FillAsync(DataTable dataTable, IDataReader dataReader);

    如果想添加取消操作的可以用

    public Task<int> FillAsync(DataTable dataTable, IDataReader dataReader, CancellationToken cancellationToken)

    MySqlDataReader是有一个NextResult的方法可以用来循环读取返回集,并返回bool类型

    思路就出来了,通过判断NextResult的结果是否为false,来结束返回集的查询,通过MySqlDataAdapter类的FillAsync的方法对每个结果进行填充

            /// <summary>
            /// 读取多个返回集,返回List<DataTable>
            /// </summary>
            /// <param name="StoredName"></param>
            /// <param name="Parameters"></param>
            /// <returns></returns>
            public List<DataTable> StroedGetTableList(string StoredName, List<sqlparameters> Parameters)
            {
    
                MySqlDataAdapter mysqldata = new MySqlDataAdapter();
                MySqlCommand sqlCommand = new MySqlCommand();
                sqlCommand.CommandText = StoredName;//存储过程名称
                sqlCommand.CommandType = CommandType.StoredProcedure;
                sqlCommand.Connection = conn;
    
                for (int i = 0; i < Parameters.Count; i++)
                {
                    sqlCommand.Parameters.AddWithValue(Parameters[i].name, Parameters[i].pvalue);
                }
                conn.Open();
                List<DataTable> dts = new List<DataTable>();
                MySqlDataReader mysqlreser = sqlCommand.ExecuteReader();//mysqlreader无构造函数
                bool re = true;
                System.Threading.CancellationToken _cts;//用于Cancel用的
                while (re)
                {
                    DataTable dt = new DataTable();
                    mysqldata.FillAsync(dt, mysqlreser).Wait(_cts);//等待线程完成
                      dts.Add(dt);
                    re = mysqlreser.NextResult();//取下一个结果集
                  //  Trace.WriteLine(dt.Rows.Count);        
    
                }
                conn.Close();
                return dts;
    
            }
    这里我用的阻塞主线程等待dt完成填充,不知道是否合适
    mysqldata.FillAsync(dt, mysqlreser).Wait(_cts);//等待线程完成

    补充一下

    conn是连接数据库用的连接实例MySqlConnection

    sqlparameters是我声明的一个结构体,用来保存mysql的存储过程的输入参数

    public struct sqlparameters
        {
            public string name;//存储过程的输入字符名称
            public object pvalue;//存储过程的输入变量
            public sqlparameters(string names, object pvalues)
            {
                name = names;
                pvalue = pvalues;
            }
        }
  • 相关阅读:
    git小乌龟的使用
    C语言笔记(二):数据类型(基本数据类型)、类型转换(自动转换、强制转换)
    Edge Chromium 中如何始终允许运行 Flash 内容
    【DTOJ】2704:数字互换
    【DTOJ】2703:两个数的余数和商
    【DTOJ】1001:长方形周长和面积
    Linux_simpl shell-利用Shell脚本for循环输出系统中的用户及其Shell
    Linux_Centos7安装VNC实现远程桌面
    Linux_crontab参数表示的意思
    Docke部署nginx并配置nginx
  • 原文地址:https://www.cnblogs.com/keithmoring/p/4140091.html
Copyright © 2011-2022 走看看