c# SqlDataReader to XElement Efficiently
本文关键字:Efficiently XElement to SqlDataReader | 更新日期: 2023-09-27 18:08:53
我有一个Sql SP,运行大约需要1分钟,返回25000行数据。(可以返回多个数据集)。
目前试图将其转换为XElement/XDocument以生成几个报告,结果在c#方法中转换它需要超过30分钟,这需要30分钟的Sql Connection'Command Timeout,这实在太长了。
谁能帮助排除故障/找到我可以改进以下转换代码的地方,因为在这里的某个地方一定存在巨大的效率低下。
调用
public void xyzCall()
{
....
XElement result = SqlDataReadertoXML(sqlcommand.ExecuteReader());
....
}
转换函数
private XElement SqlDataReadertoXML(SqlDataReader datareader)
{
XElement results = new XElement("ResultSets");
// Read Next RecordSet
do
{
XElement result = new XElement("ResultSet");
//Read Next Row in this RecordSet
while (datareader.Read())
{
XElement datanode = new XElement("Item");
// Read Each Column in this RecordSet
for (int i = 0; i < datareader.FieldCount; i++)
{
// Node.Attr("Name") = Column Name, Node.Value = Field
if (datareader.GetName(i) != "") datanode.Add(new XElement(datareader.GetName(i), datareader[i].ToString()));
}
result.Add(datanode);
}
results.Add(new XElement(result));
} while (datareader.NextResult());
datareader.Close();
return results;
}
如果您可以访问数据库,我建议您修改SP或编写新的SP以更快的首选XML格式返回数据。对于大型数据集,在内存中构建XML不是一个好主意。
- FOR XML AUTO - XML的简单嵌套树,每一列表示为单个元素
- FOR XML RAW -结果集中的每一行都转换为通用元素标签
- FOR XML EXPLICIT—为结果集 创建预定义的XML格式
- FOR XML PATH—与EXPLICIT模式的大部分功能相同,但是元素和属性可以像语法 一样使用XPATH构建。
我没有看到任何明显的问题,但是我并不惊讶将250K行转换为内存中的xml会消耗您的CPU。
您可以做的一件事是//调整进程(例如每个resultSet一个线程)
我将使用SQL Server的for xml
子句代替!