我创建了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
个字段。但是现在我已经实现了分页,这不起作用,因为数据表只填充了页面数值。
修改我的函数以获得整个表(不仅仅是页面)中的记录总数而不影响其余分页功能的最有效实现是什么。
谢谢!
答案 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(*) ...
使用相同的from
和where
进行查询,但没有分页部分。它是一个单独的查询并降低了性能,但是您不能使用其他查询,返回由于分页而感兴趣的记录子集以返回总计数。
如果这对你来说太慢了,那么你需要优化它,可能将计数存储在某个地方的缓存中,并在创建或删除新记录时刷新该缓存。
我应该提一下,你编写查询的方式是非常不安全的,因为它允许{* 3}}不愿意的人可能会对你的网站造成严重破坏。