【发布时间】:2020-01-28 02:52:59
【问题描述】:
我有一个类似下面的函数,用于根据最终用户的角色将gridview (id: dgmenu) 返回给最终用户。请注意,我不允许对 gridView 应用分页,所有项目都必须在一页中看到。
protected DataTable MenuForUserRole(string userRole) {
DataTable dtMenus = new DataTable();
string connectionString = constr;
try {
using(SqlConnection cnn = new SqlConnection(connectionString)) {
cnn.Open();
string query = @"Select mycolumn1, mycolumn2, mycolumn3, mycolumn4m mycolumn5
From mytable
Where mykey = (select thekey from anothertable where role = @role)
order by myOrderColumn;
";
SqlCommand oCmd = new SqlCommand(query, cnn);
oCmd.Parameters.AddWithValue("@role", userRole);
using(SqlDataAdapter a = new SqlDataAdapter(oCmd)) {
a.Fill(dtMenus);
}
cnn.Close();
}
} catch (Exception ex) {
throw;
}
return dtMenus;
}
用法:
dgMenu.DataSource = MenuForUserRole(ddlUserRoles.SelectedItem.Value.ToString());
dgMenu.DataBind();
我的问题与性能有关:返回的一些 GridView 有超过 1000 个项目,因此为这些用户加载完整的 gridView 需要 5-6 秒,这是不可接受的。当我在线搜索时,我找不到更有效的代码来从 SQL Server 数据库加载 gridView。当网格视图有大量数据时,任何可能提高加载速度的帮助或建议都将不胜感激。
已使用 -> Visual Studio 2017 和 SQL Server 2017
【问题讨论】:
-
将在 SQL 中返回的行数限制为 200 或 300 或任何足够高性能的行,然后对其进行分页,以便他们可以单击“下一步”查看下一个 300?
-
GridViews 对于超过 100 条记录计数并不是非常有效的控件。如果不可能使用分页,只需使用普通的 HTML 表格。
-
和往常一样 - 不要使用addwithvalue
-
附注:查询本身,不需要做子查询;这已经是一个性能问题了。另外,我认为问题在于设置实际的
DataSource本身,原因是BaseDataListclass 是DataView/DataGridView等数据列表控件的抽象基类。对于每个列表,它都会创建一个独特的视图,因为每个列表都可以不同;仅此一项就很耗费资源。 -
对于单个页面中包含 1000 多行数据的网格有什么可能的业务案例?
标签: c# asp.net .net sql-server datatable