mySQL搭配 DataGrid的自訂分頁
最近小弟接了一個專案,是用mySQL的資料庫,該專案預期的資料也不會很多,就用GridView預設的分頁機制來顯示資料,不過這讓我回想到2、3年前使用 VS2003 DataGrid的自訂分頁寫法(痛苦的回憶),由於SQL SERVER 沒有語法可以支援查詢後的資料要取回第幾筆到第幾筆的資料,而且資料庫的資料太多了,所以小弟用了很多的方法,第一種是搭配 TOP 跟 NOT IN(SELECT TOP ... FROM )的寫法,之後覺得這樣寫很『拉滴撤』,又改了另外一個版本,先把要查詢的資料寫到暫存表,開一個欄位為自動編號,這樣就有編號,然後透過 DataGrid的 PageIndexChanged傳入頁面索引,取回我要的筆數。當時上網找資料只有 mySQL、跟 Oracle有類似的語法,現在有mySQL資料庫可以玩,小弟就從 VS2005的工具箱把 DataGrid挖出來自爽一下,先說好這個是 『DataGrid』不是『GridView』哦!!
顯示資料的程式
''' <summary>
''' 查詢資料Sub
''' </summary>
''' <param name="pageIndex">傳入目前的頁數的索引</param>
''' <param name="bolNewSearch">是否為重新查詢</param>
''' <remarks></remarks>
Private Sub getDataGridData(ByVal pageIndex As Integer, ByVal bolNewSearch As Boolean)
Dim connectionString As String = "User Id=xxx;Password=xxx;Host=xxx;Database=xxx;Persist Security Info=True;"
Dim ds As New Data.DataSet
Dim dt As Data.DataTable
Dim con As New MySql.Data.MySqlClient.MySqlConnection(connectionString)
Dim sql = ""
Dim cmd As New MySql.Data.MySqlClient.MySqlCommand()
Dim da As New MySql.Data.MySqlClient.MySqlDataAdapter(cmd)
Try
cmd.Parameters.Clear()
'先判斷是否為重新查詢
If bolNewSearch Then
cmd.Parameters.AddWithValue("?UserID", "%" & Me.txtKey.Text & "%")
'將查詢的條件記錄到ViewState
Me.ViewState("keys") = Me.txtKey.Text
sql = "select count(*) mCount from tr_001 "
sql += " Where TR_001_USERID Like ?UserID ;"
sql += "select * from tr_001 "
sql += " Where TR_001_USERID Like ?UserID "
sql += " Order By TR_001_UserID "
'重點利用mySQL的Limit 只傳回所需要筆數
sql += " Limit 1,{0} "
'取得GridView每頁所要顯示的筆數
sql = String.Format(sql, Me.DataGrid1.PageSize)
Else
cmd.Parameters.AddWithValue("?UserID", "%" & Me.ViewState("keys") & "%")
sql = "select count(*) mCount from tr_001 "
sql += " Where TR_001_USERID Like ?UserID ;"
sql += "select * from tr_001 "
sql += " Where TR_001_USERID Like ?UserID "
sql += " Order By TR_001_UserID "
'重點利用mySQL的Limit 只傳回所需要筆數
sql += " Limit {0},{1} "
'取得DataGrid1要取得哪一個區間的資料
sql = String.Format(sql, (pageIndex * Me.DataGrid1.PageSize) + 1, (pageIndex * Me.DataGrid1.PageSize) + Me.DataGrid1.PageSize)
End If
da.SelectCommand.Connection = con
da.SelectCommand.CommandText = sql
da.Fill(ds, "GetData")
dt = ds.Tables(1)
'設定DataGrid虛擬筆數
Me.DataGrid1.VirtualItemCount = ds.Tables(0).Rows(0)("mCount")
Me.DataGrid1.DataSource = dt
Me.DataGrid1.DataBind()
'設定顯示的內容
Me.Label1.Text = String.Format("資料共 {0} 筆,目前停在第 {1} 頁 ", Me.DataGrid1.VirtualItemCount, (pageIndex + 1).ToString())
Catch ex As Exception
End Try
End Sub
查詢的程式:
Protected Sub btnSearch_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnSearch.Click
'重新查詢把DataGrid1的頁面索引指向第 0 頁
Me.getDataGridData(0, True)
End Sub
分頁的程式:
Protected Sub DataGrid1_PageIndexChanged(ByVal source As Object, ByVal e As System.Web.UI.WebControls.DataGridPageChangedEventArgs) Handles DataGrid1.PageIndexChanged
Me.DataGrid1.CurrentPageIndex = e.NewPageIndex
'傳入目前分頁的索引
Me.getDataGridData(e.NewPageIndex, False)
End Sub
網頁的配置:放一個查詢按鈕、查詢的TextBox 、DataGrid、顯示筆數的Lable
PS:至於mySQL要如何跟.NET連結,上網Google一下應該很多資源,我再這裏就不多做解釋了。