Я написал этот метод, который я хотел бы отображать как результат как обычную таблицу (например, имена столбцов, за которыми следуют данные). Мне не удалось найти какой-либо метод для этого. Я также не могу манипулировать WriteLine, чтобы выполнить это. Есть идеи?
Я новичок в программировании и С#.
public void ShowQuery() //to be used with showing data
{
try
{
SqlDataReader reader = _mySqlCommand.ExecuteReader();
int columnCount = reader.FieldCount;
while(reader.Read()) //How can I use display results as a normal table like in access?
{
for (int i = 0; i < columnCount; i++)
{
Console.WriteLine( reader[i]);
}//end for
}//end while
reader.Close();
Console.Beep();
}
catch (Exception e)
{
Console.WriteLine(e);
}
}
Возможно, что-то вроде этого работает:
private static void OutputTable(string query, bool showHeader)
{
MySqlConnection conn = GetConn();
MySqlCommand cmd = conn.CreateCommand();
cmd.CommandText = query;
MySqlDataReader reader = cmd.ExecuteReader();
int columnCount = reader.FieldCount;
List<List<string>> output = new List<List<string>>();
if (showHeader)
{
List<string> values = new List<string>();
for (int count = 0; count < columnCount; ++count)
{
values.Add(string.Format("{0}", reader.GetName(count)));
}
output.Add(values);
}
while (reader.Read())
{
List<string> values = new List<string>();
for (int count = 0; count < columnCount; ++count)
{
values.Add(string.Format("{0}", reader[count]));
}
output.Add(values);
}
reader.Close();
List<int> widths = new List<int>();
for (int count = 0; count < columnCount; ++count)
{
widths.Add(0);
}
foreach (List<string> row in output)
{
for (int count = 0; count < columnCount; ++count)
{
widths[count] = Math.Max(widths[count], row[count].Length);
}
}
//int totalWidth = widths.Sum() + (widths.Count * 1) * 3;
//Console.SetWindowSize(Math.Max(Console.WindowWidth, totalWidth), Console.WindowHeight);
foreach (List<string> row in output)
{
StringBuilder outputLine = new StringBuilder();
for (int count = 0; count < columnCount; ++count)
{
if (count > 0)
{
outputLine.Append(" ");
}
else
{
outputLine.Append("| ");
}
string value = row[count];
outputLine.Append(value.PadLeft(widths[count]));
outputLine.Append(" |");
}
Console.WriteLine("{0}", outputLine.ToString());
}
}
Если вы хотите прочитать из базы данных SQL и показать данные в виде сетки, я бы рекомендовал использовать ORM, например, Entity Framework или Linq to SQL. Это облегчает вам всю процедуру. Но если вы не можете, возможно, из-за требования, вам нужно создать модель для вашей таблицы:
public class MyTableModel{
public int Id {get; set;}
public String value {get; set;}
}
Теперь, используя обычные запросы:
con.Open();
List<MyTableModel> DataBind = new List<MyTableModel>();
cmd.CommandText = "SELECT Id, value FROM MyTable";
_DataReader = cmd.ExecuteReader();
if(_DataReader.HasRows) {
while(_DataReader.Read()){
DataBind.Add(new MyTableModel() {Id = _DataReader.GetInt(0), value =_DataReader.GetString(1) });
}
}
con.Close();
Теперь с помощью GridView (для GUI):
DatGrid DG = new DataGrid();
DG.Columns.Add("Id");
DG.Columns.Add("value");
DG.ItemSource = DataBind;
Или для консольного приложения, используя:
foreach(var i in DataBind){
Console.WriteLine("{0}\t{1}", i.Id, i.value);
}
Несколько вещей, которые вы должны изучить:
String.PadRight, String.PadLeft, позволяют добавлять пробелы, пока ваша строка не будет иметь определенную длину.
форматирование строк, позволяют вам легче форматировать строки. обратите внимание, что вы можете использовать Console.WriteLine
же, как и String.Format
здесь образец
var s1 = "1983bi".PadLeft(10);
var s2 = "23".PadLeft(10);
Console.WriteLine("{0} | {1}", s1, s2);
Console.WriteLine("{0} | {1}", s2, s1);
Console.ReadKey(false);
{0}
будет заменен первым передаваемым параметром, {1}
будет заменен следующим, {2}
будет заменен следующим, и так далее.