如何在ASP.Net中添加分页和存储计数值之前计算SQL的总记录

时间:2017-03-19 11:43:51

标签: c# sql asp.net sql-server pagination

我创建了GetData函数,如下所示:

public string GetData(string current, string rowCount, string orderBy, string orderFrom, string searchPhrase)
{
    var result = string.Empty;
    var con = new SqlConnection();
    var cmd = new SqlCommand();
    var dt = new DataTable();
    string sSQL = @"SELECT LogID, Severity, Title
                    FROM dbo.Log
                    WHERE UPPER(LogID) LIKE '%" + searchPhrase.ToUpper() + @"%'                        OR UPPER(Severity) LIKE '%" + searchPhrase.ToUpper() + @"%'                      OR UPPER(Title) LIKE '%" + searchPhrase.ToUpper() + @"%'                    ORDER BY " + orderBy + " " + orderFrom + @"
                    OFFSET ((" + (Convert.ToInt32(current) - 1).ToString() + ") * " + rowCount + @") ROWS
                    FETCH NEXT " + rowCount + " ROWS ONLY;";

    try
    {
        using (var connection = THF.Models.SQLConnectionManager.GetConnection())
        {
            using (var command = new SqlCommand(sSQL, connection))
            {
                connection.Open();
                command.CommandTimeout = 0;
                var da = new SqlDataAdapter(command);
                da.Fill(dt);
            }
        }

        var total = dt.Rows.Count.ToString();
        var rows = JsonConvert.SerializeObject(dt);
        result = "{ \"current\": " + current + ", \"rowCount\": " + rowCount + ", \"rows\": " + rows + ", \"total\": " + total + " }";
    }
    catch (Exception ex)
    {
    }

    return result;
}

正如您所看到的,SQL字符串将根据预期的rowCount返回值的数量。

在实现分页功能之前,我使用var total = dt.Rows.Count.ToString();来获取表中total个字段。但是现在我已经实现了分页,这不起作用,因为数据表只填充了页面数值。

修改我的函数以获得整个表(不仅仅是页面)中的记录总数而不影响其余分页功能的最有效实现是什么。

谢谢!

2 个答案:

答案 0 :(得分:0)

一种方法是进行另一个这样的数据库调用,不确定这是否是最有效的方式

public int rowCount(string tableName)
{
    string ssQL = string.Format("SELECT count(*) from {0}", tableName);
    int rowCount;
    using (var connection = THF.Models.SQLConnectionManager.GetConnection())
    {
        using (var command = new SqlCommand(sSQL, connection))
        {
            connection.Open();
            command.CommandTimeout = 0;
            rowCount = command.ExecuteScalar();
            connection.Close();
        }
    }

    return rowCount;
}

答案 1 :(得分:0)

你只需要运行一个

select count(*) ...

使用相同的fromwhere进行查询,但没有分页部分。它是一个单独的查询并降低了性能,但是您不能使用其他查询,返回由于分页而感兴趣的记录子集以返回总计数。

如果这对你来说太慢了,那么你需要优化它,可能将计数存储在某个地方的缓存中,并在创建或删除新记录时刷新该缓存。

我应该提一下,你编写查询的方式是非常不安全的,因为它允许{* 3}}不愿意的人可能会对你的网站造成严重破坏。