mySQL Limit 語法 ,搭配 DataGrid的自訂分頁

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

image

PS:至於mySQL要如何跟.NET連結,上網Google一下應該很多資源,我再這裏就不多做解釋了。

分享