代码之家  ›  专栏  ›  技术社区  ›  Chizl

记录集循环的替代方案

  •  0
  • Chizl  · 技术社区  · 11 年前

    在使用ADO的那一天,我们使用GetRows()回调一个数组并在其中循环,因为它比使用rs.MoveNext遍历记录更快。我正在编写一个应用程序,它可以收回50万行并将它们写入一个文件。从SQL中提取数据大约需要3分钟,但将数据写入CSV需要12分钟。从外观上看,这是因为我正在循环使用SqlDataReader。什么是更快的替代方案?

    请记住,我不知道SQL Structure会是什么样子,因为这是在调用一个报告表,它告诉我的应用程序应该调用什么查询。我考虑过使用linq并返回一个数组,但这需要知道结构,所以这是行不通的。

    注意下面的代码,case语句有很多case,但为了节省空间,我删除了除一个以外的所有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();
    
    1 回复  |  直到 11 年前
        1
  •  2
  •   RBarryYoung    11 年前

    这里的问题几乎可以肯定是你在打电话 File.AppendAllText() 对于每一行。自从 AppendAllText 每次调用文件时,打开、写入然后关闭文件,速度可能会很慢。

    更好的方法是使用 AppendText() 方法或显式 StreamWriter .