C#处理MySql多个返回集_.NET_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > .NET > C#处理MySql多个返回集

C#处理MySql多个返回集

 2014/12/3 16:11:13  KeithMorning  程序员俱乐部  我要评论(0)
  • 摘要:关于Mysql返回多个集java和Php的较多,但是C#的完整代码好像没见过,研究了一下做个封装以后用做一个Mysql的简单分页查询,有两个返回集Sql语句如下SELECTCOUNT(*)fromposter;selectt.PosterID,t.PostTime,t.Titlefromapp_us_postertORDERBYt.PostTimedescLIMITstartPageNum,endPageNum;这里MySql中返回是两个集,如何通过C#获取这两个值呢
  • 标签:C# SQL 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;
        }
    }
发表评论
用户名: 匿名