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;
            }
        }
  • 相关阅读:
    《ASP.NET Core跨平台开发从入门到实战》Web API自定义格式化protobuf
    .NET Core中文分词组件jieba.NET Core
    .NET Core 2.0及.NET Standard 2.0
    Visual Studio 2017 通过SSH 调试Linux 上.NET Core
    Visual Studio 2017 ASP.NET Core开发
    Visual Studio 2017正式版离线安装及介绍
    在.NET Core 上运行的 WordPress
    IT人员如何开好站立会议
    puppeteer(二)操作实例——新Web自动化工具更轻巧更简单
    puppeteer(一)环境搭建——新Web自动化工具(同selenium)
  • 原文地址:https://www.cnblogs.com/keithmoring/p/4140091.html
Copyright © 2011-2022 走看看