关于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类
现在多了很多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; } }