關于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; } }
新聞熱點
疑難解答