2012-11-20 74 views
1

在c#控制器上編寫選擇語句以進行分頁的正確方法是什麼?這是我想出了最好的,但我知道這是行不通的,因爲它顯示我對電網的第一頁上的所有數據......請幫助Sql選擇語句與尋呼c#

public JsonResult getData(int start, int limit) 
{ 
    List<MyItem> items = new List<MyItem>(); 
    using (SqlConnection con = new  SqlConnection(ConfigurationManager.ConnectionStrings["ApplicationServices1"].ConnectionString)) 
{ 
SqlCommand cmd = con.CreateCommand(); 
cmd.CommandText = "SELECT State, Capital FROM MYDBTABLE"; 
con.Open(); 
SqlDataReader reader = cmd.ExecuteReader(); 
while (reader.Read()) 
{ 
    MyItem item = new MyItem(); 
    item.State = reader[0].ToString(); 
    item.Capital = reader[1].ToString(); 
    items.Add(item); 
} 
con.Close(); 

if ((start + limit) > Myitem.Count) 
{ 
    limit = Myitem.Count - start; 
} 
return Json(new { myTable = items }, JsonRequestBehavior.AllowGet); 
} 
} 
+0

爲什麼不查詢中使用限制關鍵字? – gipinani

+0

對不起mserioli ..我對此是全新的...請給我看一個例子... – EagleFox

+1

請參閱[本文](http://www.sqlservercentral.com/articles/T-SQL/ 66030 /)並通讀[所有評論](http://www.sqlservercentral.com/Forums/Topic672980-329-1.aspx)。 –

回答

4

下面是我喜歡存儲的特效模板用於分頁。

CREATE PROCEDURE [dbo].[StoredProcName] 
    @page_size INT 
    , @page_num INT 
AS 
BEGIN 

    SET NOCOUNT ON; 

    ; WITH RESULTS AS 
    (
     SELECT * 
      , ROW_NUMBER() OVER (ORDER BY <order_col> DESC) AS rn 
      , ROW_NUMBER() OVER (ORDER BY <order_col> ASC) AS rn_reversed 
     FROM <table> 
    ) 
    SELECT * 
     , CAST(rn + rn_reversed - 1 AS INT) AS total_rows 
     , CAST(CASE (rn + rn_reversed - 1) % @page_size 
      WHEN 0 THEN (rn + rn_reversed - 1)/@page_size 
      ELSE ((rn + rn_reversed - 1)/@page_size) + 1 
      END AS INT) AS total_pages 
    FROM RESULTS a 
    WHERE a.rn BETWEEN 1 + ((@page_num - 1) * @page_size) AND @page_num * @page_size 
    ORDER BY rn ASC 

END 

你只需要在page_sizepage_num傳遞到存儲過程,你是好去。

+0

謝謝諾拉... M試圖實現這個......但是page_size與「開始」一樣...我從extjs上的商店傳遞這些參數,它被設置爲start: 0 and limit:20 ... – EagleFox

+1

@EagleFox page_size是limit(20),page_num應該從1開始並且增加1. –

+0

我看到了...這不應該是個問題,因爲extjs params會自動發送...但我總是看到在幾乎所有的extjs例子中,start都設置爲0 ...讓我試試這兩種方法,然後看看它是如何發展的。謝謝Norla – EagleFox

0

我使用的基本模板是:

SELECT ROW_NUMBER(), <Rest of your columns> 
FROM <Your Tables/Joins> 
WHERE ROW_NUMBER() >= (@PageNum * @RowsPerPage) 
AND ROW_NUMBER() < (@PageNum+1 * @RowsPerPage) 
+0

感謝KeithS ...是直接在控制器上還是在存儲過程 – EagleFox

+0

您可以使用這樣的查詢創建存儲過程,然後執行它傳遞參數,或者您可以使用SqlCommand將其直接發送到服務器。如果你使用「vanilla」ADO.NET,就像你看起來那樣,我推薦存儲特效。如果我這樣做,我會建立一個Linq提供者,比如Entity Framework;那麼查詢會進入編譯器檢查的代碼,並變成類似於MyDbContext.Query ()的類型。 – KeithS

+0

我很抱歉基思..我沒有使用實體框架...我使用extjs 4.1 ..基本上與網格分頁工具欄。我很難從db – EagleFox

3

你可以使用LINQ和使用Skip()Take()這樣的:

public JsonResult getData(int page, int limit) 
{ 
    DataTable dt = new DataTable(); 
    using (SqlConnection cnn = new SqlConnection(ConfigurationManager.ConnectionStrings["ApplicationServices1"].ConnectionString)) 
    { 
     using (SqlCommand cmd = cnn.CreateCommand()) 
     { 
      cmd.CommandType = CommandType.Text; 
      cmd.CommandText = "SELECT State, Capital FROM MYDBTABLE"; 
      using (SqlDataAdapter da = new SqlDataAdapter(cmd)) 
      { 
       da.Fill(dt); 
      } 
     } 
    } 
    int start = (page * limit) - limit; 
    List<MyItem> items = (from DataRow row in dt.Rows 
          select new MyItem 
          { 
           State = row["State"].ToString(), 
           Capital = row["Capital"].ToString() 
          }).Skip(start - 1).Take(limit).ToList(); 
    return Json(new { myTable = items }, JsonRequestBehavior.AllowGet); 
} 
+0

Dang ...謝謝Jack Hughes ...我不知道它可以完成沒有存儲過程 – EagleFox

+0

這種方式也存在同樣的問題..我可以得到20個記錄的第一頁,但它不顯示第二頁的數據,即使工具欄說第2頁...任何想法爲什麼它會那樣做傑克? – EagleFox

+1

奇怪,不知道爲什麼沒有奏效。我對代碼做了一些小修改,而不是開始將行改爲使用頁碼。 –