以前、このクエストで StackOverflow に参加したことがあります: MS SQL2005 Query/Stored Proc Results To Text using SqlCommand or any other method
SQL Managment Studio の Results To Text (Cntrl + T) と同じ結果が得られるように、自分で文字列を作成するように言われました。
問題が発生しました。列の幅を動的に決定するにはどうすればよいですか? また、VARCHAR(MAX) の列はどうですか? 事前に SqlDataReader に何が入るかはまったくわかりません。
これまでのコードは次のとおりです。基本的に PADDING_LENGTH を排除し、その値を動的に置き換える必要があります。
どこかのネットから基本的なコードを持ってきました。(最初に書いた人、ありがとう)
StringBuilder sb = new StringBuilder();
private void GenerateResultsText(SqlDataReader reader)
{
const int PADDING_LENGTH = 40;
do
{
// Create new data table
DataTable schemaTable = reader.GetSchemaTable();
if (schemaTable != null)
{
// A query returning records was executed
for (int i = 0; i < schemaTable.Rows.Count; i++)
{
DataRow dataRow = schemaTable.Rows[i];
// Create a column name that is unique in the data table
string columnName = (string)dataRow["ColumnName"];
//Add to Results String.
sb.Append(String.Format("{0, " + -1 * PADDING_LENGTH + "}", columnName));
}
sb.Append(Environment.NewLine);
//Add markers to seperate Row entries from Column names.
const string columnRowSeperator = "-----"; //Keep it to a multiple of 5.
for (int i = 0; i < schemaTable.Rows.Count; i++)
{
for (int j = 0; j < PADDING_LENGTH / columnRowSeperator.Length; j++)
sb.Append(columnRowSeperator);
}
sb.Append(Environment.NewLine);
// Fill the data table we just created
while (reader.Read())
{
Object temp;
for (int i = 0; i < reader.FieldCount; i++)
{
temp = reader.GetValue(i);
sb.Append(String.Format("{0, " + -1 * PADDING_LENGTH + "}", temp.ToString()));
}
sb.Append(Environment.NewLine);
}
//Add newlines to seperate tables.
sb.Append(Environment.NewLine + Environment.NewLine);
}
}
while (reader.NextResult());
reader.Close();
reader.Dispose();
}
乾杯、カイ。