EDIT
Вот пример использования DataReader. Вы могли бы быть еще более конкретным, глядя на столбцы NumericPrecision и тому подобное в таблице схемы, но я думаю, что это поможет вам начать.
using (SqlConnection conn = new SqlConnection("Data Source=server;Initial Catalog=db;User Id=user;Password=pass;"))
{
using (SqlCommand cmd = new SqlCommand("select * from table", conn))
{
conn.Open();
StreamWriter sw = new StreamWriter(File.Open("test.txt", FileMode.Append));
DataTable schema = null;
using (SqlDataReader rdr = cmd.ExecuteReader())
{
schema = rdr.GetSchemaTable();
for (int i = 0; i < rdr.FieldCount; i++)
{
string name = schema.Rows[i]["ColumnName"].ToString();
sw.Write(name.PadRight(name.Length + Convert.ToInt32(schema.Rows[i]["ColumnSize"])) + " ");
}
sw.WriteLine();
for (int i = 0; i < rdr.FieldCount; i++)
{
string name = schema.Rows[i]["ColumnName"].ToString();
sw.Write(new string('-', name.Length + Convert.ToInt32(schema.Rows[i]["ColumnSize"])) + " ");
}
rdr.Close();//can't have two open datareaders on the same connection
rdr.Dispose();
sw.WriteLine();
while (dataReader.Read())
{
for (int i = 0; i < dataReader.FieldCount; i++)
{
string name = schema.Rows[i]["ColumnName"].ToString();
sw.Write(dataReader[i].ToString().PadRight(name.Length + Convert.ToInt32(schema.Rows[i]["ColumnSize"])) + " ");
}
sw.WriteLine();
}
}
sw.Close();
sw.Dispose();
}
}
Я не мог потратить достаточно времени, чтобы узнать, как это сделать с помощью DataReader, но если вы вместо этого используете DataAdapter, вы можете сделать это:
using (SqlConnection conn = new SqlConnection("Data Source=someserver;Initial Catalog=somedb;User Id=user;Password=password;"))
{
using (SqlCommand cmd = new SqlCommand("select * from sometable", conn))
{
conn.Open();
using (SqlDataAdapter adapter = new SqlDataAdapter(cmd))
{
DataSet set = new DataSet();
set.Tables.Add("Schema");
set.Tables.Add("Data");
adapter.Fill(set, "Data");
adapter.FillSchema(set, SchemaType.Source, "Schema");
StreamWriter sw = new StreamWriter(File.Open("test.txt", FileMode.Append));
for(int i = 0; i < set.Tables["Schema"].Columns.Count; i++)
{
sw.Write(set.Tables["Schema"].Columns[i].ColumnName.PadRight(set.Tables["Schema"].Columns[i].MaxLength + set.Tables["Schema"].Columns[i].ColumnName.Length, ' ') + " ");
}
sw.WriteLine();
for(int i = 0; i < set.Tables["Schema"].Columns.Count; i++)
{
sw.Write(new string('-', set.Tables["Schema"].Columns[i].MaxLength + set.Tables["Schema"].Columns[i].ColumnName.Length) + " ");
}
sw.WriteLine();
foreach(DataRow row in set.Tables["Data"].Rows)
{
foreach(DataColumn col in set.Tables["Data"].Columns)
{
sw.Write(row[col].ToString().PadRight(set.Tables["Schema"].Columns[col.ColumnName].MaxLength + col.ColumnName.Length) + " ");
}
sw.WriteLine();
}
sw.Close();
sw.Dispose();
}
}
}