2012-11-20 44 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

奇怪,不知道为什么没有奏效。我对代码做了一些小修改,而不是开始将行改为使用页码。 –