0

ADOを使用していた当時は、GetRows()を使用して配列をプルバックし、ループスルーしました。これは、rs.MoveNextを使用してレコードをウォークスルーするよりも高速だったためです。私は50万行をプルバックし、それらをファイルに書き出すアプリケーションを書いています。SQLからのデータのプルには約3分かかりますが、CSVへの書き込みにはさらに12分かかります。見た目からすると、これはSqlDataReaderをループしているためです。より速い代替手段は何ですか?

SQL構造がどのように表示されるかはわかりません。これは、アプリケーションにどのクエリを呼び出す必要があるかを通知するレポートテーブルを呼び出しているためです。linqを使用して配列を返すことを検討しましたが、構造を知っている必要があるため、機能しません。

以下のコードに注意してください。caseステートメントには多くのケースがありますが、スペースを削減するために、1つを除いてすべて削除しました。

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();
4

1 に答える 1

2

ここでの問題は、ほぼ確実にFile.AppendAllText()、すべての行を呼び出していることです。AppendAllTextファイルが呼び出されるたびにファイルを開いて書き込み、閉じてしまうため、ファイルの速度が大幅に低下する可能性があります 。

より良い方法は、AppendText()メソッドを使用するか、明示的なを使用することですStreamWriter

于 2013-03-04T22:46:28.903 に答える