最近做项目遇到一个效率的问题,是因为数据库设计的时候和需要显示在界面的格式是不同的,看图就知道问题所在了。
这是数据库的数据表:
而要显示在界面上的数据表如图所示:
一开始的想法是在U层不断地循环获取每一个点的坐标,根据两个ID确定数据库中Data,然后循环将data数据赋值给DataGridView中的相应点。但是,问题也就显示出来,随着数据表的增加,每执行一次显示数据表的操作,都需要10几秒的时间才能将数据显示出来。这显然是不能满足软件的运行要求的。那么,如何解决这个问题呢。
经过分析,速度慢的原因就是每显示一张表,需要大概几百次的Select查询数据,也就是要访问数据库几百次,时间都浪费在访问数据库上了。所以,我就想能不能先根据listId,先确定这张表的数据,然后在U层进行数据的赋值,这样就执行一次访问数据库。效率肯定会提高。所以,DataTable.Select 方法也就起了作用。
获取 DataRow 对象的数组。
名称 说明
Select() 获取所有 DataRow 对象的数组。
Select(String) 按照主键顺序(如果没有主键,则按照添加顺序)获取与筛选条件相匹配的所有 DataRow 对象的数组。
Select(String, String) 获取按照指定的排序顺序且与筛选条件相匹配的所有 DataRow 对象的数组。
Select(String, String, DataViewRowState) 获取与排序顺序中的筛选器以及指定的状态相匹配的所有 DataRow 对象的数组。
具体的使用方法,请看这几条语句:
1 DataRow[] drArr = dt.Select("C1='abc'");//查询 2 DataRow[] drArr = dt.Select("C1 LIKE 'abc%'");//模糊查询 3 DataRow[] drArr = dt.Select("'abc' LIKE C1 + '%'", "C2 DESC");//另一种模糊查询的方法 4 DataRow[] drArr = dt.Select("C1='abc'", "C2 DESC");//排序
If table.Rows.Count > 0 Then '首先要获得已经查询出来的DataTable数据表 For s = 1 To rowNumber '18 '循环获得行和列的ID For h = 0 To lineNumber '9 '获得行列名称 row = dgvData.Columns(s).HeaderText.ToString '获得行标题 line = dgvData.Rows(h).Cells(0).Value '获得列标题 Dim rows As DataRow() '定义<span style="font-size:14px;">DataRow 对象的数组</span> rows = table.Select("T_rowTable.name = '" + row + "' and T_lineTable.name= '" + line + "'") '执行DataTable数据表的查询 '数据填充 If rows.Length = 0 Then dgvData.Rows(h).Cells(s).Value = "" Else If rows(0)(2).ToString = 0 Then dgvData.Rows(h).Cells(s).Value = "" Else dgvData.Rows(h).Cells(s).Value = rows(0)(2).ToString End If End If Next Next End If