SQL Server 2008和C#从外部分页存储过程

SQL Server 2008和C#从外部分页存储过程,c#,sql-server-2008,stored-procedures,pagination,C#,Sql Server 2008,Stored Procedures,Pagination,我有+100个存储过程(很多报告),没有任何分页技术,我读了很多关于如何做的文章,但你们所有人都建议添加@Page-@PageSize参数和CTE ROW_NUMBER()方法 比如: 但是是否存在一种全局分页所有存储过程的方法?为了避免逐个修改,可能在我的C#数据访问代码上: public static DataTable getData(string sql) { string dbconnstr = System.Web.Configuration.WebC

我有+100个存储过程(很多报告),没有任何分页技术,我读了很多关于如何做的文章,但你们所有人都建议添加
@Page-@PageSize
参数和
CTE ROW_NUMBER()
方法

比如:

但是是否存在一种全局分页所有存储过程的方法?为了避免逐个修改,可能在我的C#数据访问代码上:

    public static DataTable getData(string sql)
    {
        string dbconnstr = System.Web.Configuration.WebConfigurationManager.ConnectionStrings["ApplicationServices"].ConnectionString;

        DataTable t = new DataTable();
        using (SqlConnection c = new SqlConnection(dbconnstr))
        {
            c.Open();
            using (SqlDataAdapter a = new SqlDataAdapter(sql, c))
            {
                try
                {
                    a.Fill(t);
                }
                catch (SqlException e)
                {
                    Console.WriteLine(e.Message);
                }
                finally
                {
                    c.Close();
                }
            }
        }
        return t;
    }

   //Calling example
   DataTable info = dbAccess.getData(String.Format("EXEC reportExample {0}, '{1}'", IdExample, anotherData));

谢谢大家!

当您将业务层逻辑放入数据层时,这个问题很典型。您是否建议不要使用存储过程?因为您希望在服务器上进行分页,所以为了获得好处,这意味着您必须在存储过程中进行分页,因此,在需要使用分页的地方,实际上没有办法修改每个存储过程。唯一的替代方法是使用不同的方法,例如使用实体框架和LINQ,而不是“原始”ADO.NET和存储过程。谢谢,我对所有业务逻辑使用LINQ,但对报表不使用,因为报表(联接、子查询、分组方式等)的SQL复杂性导致我很难处理和维护LINQ。也许使用一个对真实SP的结果集进行分页的SP?如果我使用表值函数而不是SP,也许可以实现这种方法?对不起,另一方面,如果可能的话,我更喜欢将分页代码分离以使其更干净。当然,如果不可能,就不可能:)
    public static DataTable getData(string sql)
    {
        string dbconnstr = System.Web.Configuration.WebConfigurationManager.ConnectionStrings["ApplicationServices"].ConnectionString;

        DataTable t = new DataTable();
        using (SqlConnection c = new SqlConnection(dbconnstr))
        {
            c.Open();
            using (SqlDataAdapter a = new SqlDataAdapter(sql, c))
            {
                try
                {
                    a.Fill(t);
                }
                catch (SqlException e)
                {
                    Console.WriteLine(e.Message);
                }
                finally
                {
                    c.Close();
                }
            }
        }
        return t;
    }

   //Calling example
   DataTable info = dbAccess.getData(String.Format("EXEC reportExample {0}, '{1}'", IdExample, anotherData));