我正在运行一个非常密集的数据查询(因此超时时间很长),但我想知道如何正确地对DataTable
进行排序。
我的代码是这样开始的:
SqlDataAdapter da = new SqlDataAdapter();
SqlCommand command = new SqlCommand(sql, conn);
command.CommandTimeout = 36000;
da.SelectCommand = command;
DataTable dt = new DataTable();
da.Fill(dt);
DataView dv = new DataView(dt);
// Sorting
dv.Sort = "theId DESC";
int i = 0;
while (dt.Rows.Count > 0 && i < 5)
{
DataRow row = dt.Rows[i];
string theId = row["theId"].ToString();
i++;
}
theId
有大约2,000条记录,这些记录从1到2,000按数字顺序排列。
警告或不在SQL中使用ORDER BY
是由于以下异常:
错误:发生异常
查询处理器无法生成查询计划,原因是需要工作表,并且工作表的最小行大小超过了允许的最大值8060字节,等等。
由于最大列大小为1,024,我也无法动态创建#TempTable
。
以某种方式编写查询的原因是由于系统和网络的限制,不能进行调整,也不能在本地运行查询。
我如何让排序后的DataTable
工作,因为它需要传递给下一个函数,而由于它是对另一个系统的API调用,所以也不在我的控制范围内?
1条答案
按热度按时间rpppsulh1#
你不能真正对
DataTable
进行排序。你可以通过DataView
来排序,就像你已经做过的那样,但是这只对视图排序,而不是对表排序。如果你随后通过Rows
集合访问数据,你将看不到排序。你必须通过DataView
访问数据。实际上没有必要显式地创建
DataView
。每个DataTable
在其DefaultView
属性中都已经有了DataView
。当你在WinForms中绑定一个DataTable
时,显示的数据就来自那里。这就是你如何在DataGridView
中或通过BindingSource
对数据进行排序的方法。当你使用
Rows
集合时,你会得到DataRow
对象。当你使用DefaultView
时,你会得到DataRowView
对象。它们在很多方面都很相似,但也有一些区别。如果你只是想要数据,你可以使用列名索引并得到值。如果您通过DefaultView
访问数据,但出于某种原因需要DataRow
,则可以通过DataRowView
的Row
属性访问它。请尝试以下代码,了解它的工作原理:您可以从中看到,
Rows
集合中的数据在排序前后是相同的,而DefaultView
以指定的顺序显示数据。最后一个循环显示了如何从DataRowViews
访问DataRows
,然后在DataRowViews
不能使用的地方使用它们,例如,在LINQ to DataSet方法中。请注意,如果确实需要对
DataTable
本身进行排序,则可以在DataView
上调用ToTable
以生成新的DataTable
。新表将包含基于DataView
的Sort
和RowFilter
属性的数据,如果需要,还可以省略某些列。您还可以指定只包括非重复记录。