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