在当天使用ADO,我们使用GetRows()来拉回一个数组并循环遍历它,因为它比使用rs.MoveNext遍历记录更快。我正在编写一个可以回退50万行并将它们写入文件的应用程序。从SQL中提取数据大约需要3分钟,但将其写入CSV还需要12分钟。从它的外观来看,这是因为我正在循环一个SqlDataReader。什么是更快的替代方案?
请记住,我不知道SQL结构会是什么样子,因为这会调用一个报告表来告诉我的应用程序应该调用哪个查询。我查看了使用linq并返回一个数组,但这需要知道结构,因此不起作用。
请注意下面的代码,case语句有很多种情况,但为了减少空间,除了一个,我删除了它们。
StringBuilder rowValue = new StringBuilder();
SqlDataReader reader = queryData.Execute(System.Data.CommandType.Text, sql, null);
//this is to handle multiple record sets
while (reader.HasRows)
{
for (int i = 0; i < reader.FieldCount; i++)
{
if (rowValue.Length > 0)
rowValue.Append("\",\"");
else
rowValue.Append("\"");
rowValue.Append(reader.GetName(i).Replace("\"", "'").Trim());
}
rowValue.Append("\"" + Environment.NewLine);
File.AppendAllText(soureFile, rowValue.ToString());
while (reader.Read())
{
rowValue = new StringBuilder();
for (int i = 0; i < reader.FieldCount; i++)
{
String value = "";
switch (reader.GetFieldType(i).Name.ToLower())
{
case "int16":
value = reader.IsDBNull(i) ? "NULL" : reader.GetInt16(i).ToString();
break;
}
if (rowValue.Length > 0)
rowValue.Append("\",=\""); //seperate items
else
rowValue.Append("\""); //first item of the row.
rowValue.Append(value.Replace("\"", "'").Trim());
}
rowValue.Append("\"" + Environment.NewLine); //last item of the row.
File.AppendAllText(soureFile, rowValue.ToString());
}
//next record set
reader.NextResult();
if (reader.HasRows)
File.AppendAllText(soureFile, Environment.NewLine);
}
reader.Close();
答案 0 :(得分:2)
这里的问题几乎肯定是你为每一行调用File.AppendAllText()
。由于AppendAllText
打开,写入,然后每次调用时关闭文件,它可能会变得非常慢。
更好的方法是使用AppendText()
方法或显式StreamWriter
。