Reputation: 6610
Currently I have code which looks up a database table through a SQL connection and inserts the top five rows into a Datatable (Table).
using(SqlCommand _cmd = new SqlCommand(queryStatement, _con))
{
DataTable Table = new DataTable("TestTable");
SqlDataAdapter _dap = new SqlDataAdapter(_cmd);
_con.Open();
_dap.Fill(Table);
_con.Close();
}
How do I then print the contents of this table to the console for the user to see?
After digging around, is it possible that I should bind the contents to a list view, or is there a way to print them directly? I'm not concerned with design at this stage, just the data.
Upvotes: 50
Views: 148785
Reputation: 583
Print Datatable contents rows with column
DataTable datatableinfo= new DataTable();
//Fill data table
//datatableinfo=fill by function or get data from database
//Print data table with rows and column
for (int j = 0; j < datatableinfo.Rows.Count; j++)
{
for (int i = 0; i < datatableinfo.Columns.Count; i++)
{
Console.Write(datatableinfo.Columns[i].ColumnName + " ");
Console.WriteLine(datatableinfo.Rows[j].ItemArray[i]);
}
}
Ouput :
ColumnName - row Value
ColumnName - row Value
ColumnName - row Value
ColumnName - row Value
Upvotes: 1
Reputation: 442
Use the following extension method (C# 9.0):
/// <summary>
/// Provides extension methods for the <see cref="DataTable"/> type.
/// </summary>
public static class DataTableExtensions
{
/// <summary>
/// Generates a textual representation of the data of <paramref name="table"/>.
/// </summary>
/// <param name="table">The table to print.</param>
/// <returns>A textual representation of the data of <paramref name="table"/>.</returns>
public static String Print(this DataTable table)
{
String GetCellValueAsString(DataRow row, DataColumn column)
{
var cellValue = row[column];
var cellValueAsString = cellValue is null or DBNull ? "{{null}}" : cellValue.ToString();
return cellValueAsString;
}
var columnWidths = new Dictionary<DataColumn, Int32>();
foreach (DataColumn column in table.Columns)
{
columnWidths.Add(column, column.ColumnName.Length);
}
foreach (DataRow row in table.Rows)
{
foreach (DataColumn column in table.Columns)
{
columnWidths[column] = Math.Max(columnWidths[column], GetCellValueAsString(row, column).Length);
}
}
var resultBuilder = new StringBuilder();
resultBuilder.Append("| ");
foreach (DataColumn column in table.Columns)
{
resultBuilder.Append(column.ColumnName.PadRight(columnWidths[column]));
resultBuilder.Append(" | ");
}
resultBuilder.AppendLine();
foreach (DataRow row in table.Rows)
{
resultBuilder.Append("| ");
foreach (DataColumn column in table.Columns)
{
resultBuilder.Append(GetCellValueAsString(row, column).PadRight(columnWidths[column]));
resultBuilder.Append(" | ");
}
resultBuilder.AppendLine();
}
return resultBuilder.ToString();
}
}
Upvotes: 6
Reputation: 3757
Function to both print DataTable and DataRow.
private void printDataTable(DataTable Table)
{
foreach (DataRow dataRow in Table.Rows)
{
printDataRow(dataRow);
}
}
private void printDataRow(DataRow drow)
{
StringBuilder sb = new StringBuilder();
sb.AppendLine(string.Join(",", drow.ItemArray));
Console.WriteLine(sb);
}
Upvotes: 0
Reputation: 2225
foreach (DataRow dr in myDataTable.Rows)
{
foreach (var item in dr.ItemArray)
{
Console.Write(item + " ");
}
Console.WriteLine();
}
1 A previous answer was similar to this, but didnt cleanly format the separation between line entries and cells
Upvotes: 7
Reputation: 111
Proper Tabular display
static void print_results(DataTable data)
{
Console.WriteLine();
Dictionary<string, int> colWidths = new Dictionary<string, int>();
foreach (DataColumn col in data.Columns)
{
Console.Write(col.ColumnName);
var maxLabelSize = data.Rows.OfType<DataRow>()
.Select(m => (m.Field<object>(col.ColumnName)?.ToString() ?? "").Length)
.OrderByDescending(m => m).FirstOrDefault();
colWidths.Add(col.ColumnName, maxLabelSize);
for (int i = 0; i < maxLabelSize - col.ColumnName.Length + 10; i++) Console.Write(" ");
}
Console.WriteLine();
foreach (DataRow dataRow in data.Rows)
{
for (int j = 0; j < dataRow.ItemArray.Length; j++)
{
Console.Write(dataRow.ItemArray[j]);
for (int i = 0; i < colWidths[data.Columns[j].ColumnName] - dataRow.ItemArray[j].ToString().Length + 10; i++) Console.Write(" ");
}
Console.WriteLine();
}
}
Upvotes: 11
Reputation: 83
Use the following extension method.
public static string ToCSV(this DataTable t, bool header)
{
StringBuilder sb = new StringBuilder();
int i = 0;
int maxColIdx = 0;
if (t?.Columns?.Count > 0)
{
maxColIdx = t.Columns.Count - 1;
if (header)
{
foreach (DataColumn c in t.Columns)
{
sb.Append(c.ColumnName);
if (i < maxColIdx) sb.Append(", ");
i++;
}
sb.AppendLine();
}
if (t?.Rows?.Count > 0)
{
foreach (DataRow r in t.Rows)
{
i = 0;
foreach (var item in r.ItemArray)
{
sb.Append(item);
if( i < maxColIdx) sb.Append(',');
i++;
}
sb.AppendLine();
}
}
}
return sb.ToString();
}
Upvotes: 0
Reputation: 9862
you can try this code :
foreach(DataRow dataRow in Table.Rows)
{
foreach(var item in dataRow.ItemArray)
{
Console.WriteLine(item);
}
}
Update 1
DataTable Table = new DataTable("TestTable");
using(SqlCommand _cmd = new SqlCommand(queryStatement, _con))
{
SqlDataAdapter _dap = new SqlDataAdapter(_cmd);
_con.Open();
_dap.Fill(Table);
_con.Close();
}
Console.WriteLine(Table.Rows.Count);
foreach(DataRow dataRow in Table.Rows)
{
foreach(var item in dataRow.ItemArray)
{
Console.WriteLine(item);
}
}
Upvotes: 64
Reputation: 2313
Building on another answer here, here's a method that converts a DataTable to CSV output and adds the column names as the first row in the output:
public static string DataTableToCsv(DataTable table)
{
string result = string.Empty;
StringBuilder resultBuilder = new StringBuilder();
if (table != null && table.Rows != null && table.Columns != null && table.Columns.Count > 0)
{
int lastItemIndex = table.Columns.Count - 1;
int index = 0;
foreach (DataColumn column in table.Columns)
{
resultBuilder.Append(column.ColumnName);
if (index < lastItemIndex) // if not the last element in the row
resultBuilder.Append(", "); // add the separator
index++;
}
resultBuilder.AppendLine(); // add a CRLF after column names row
foreach (DataRow dataRow in table.Rows)
{
lastItemIndex = dataRow.ItemArray.Length - 1;
index = 0;
foreach (object item in dataRow.ItemArray)
{
resultBuilder.Append(item);
if (index < lastItemIndex) // if not the last element in the row
resultBuilder.Append(", "); // add the separator
index++;
}
resultBuilder.AppendLine(); // add a CRLF after each data row
}
result = resultBuilder.ToString();
}
return result;
}
Usage example:
DataTable table = new DataTable();
....
Console.WriteLine(DataTableToCsv(table));
Note that this method does not properly handle (i.e., escape) data that contains quotes or commas. But it should be sufficient as a quick and dirty way to dump a data table to the console or anywhere else for viewing.
Upvotes: 0
Reputation: 376
This is done by data table that holds single table
SqlConnection con = new SqlConnection(constr);
con.Open();
SqlCommand cmd = new SqlCommand("select * from info", con);
SqlDataAdapter ad = new SqlDataAdapter(cmd);
DataTable dt = new DataTable();
ad.Fill(dt);
Console.WriteLine(dt.Columns[0].ColumnName.ToString());
Console.WriteLine(dt.Rows[1].ItemArray[0].ToString());
This is done by data set that holds set of table
SqlConnection con = new SqlConnection(constr);
con.Open();
SqlCommand cmd = new SqlCommand("select * from info", con);
SqlDataAdapter ad = new SqlDataAdapter(cmd);
DataSet dt = new DataSet();
ad.Fill(dt);
Console.WriteLine(dt.Tables[0].Columns[0].ColumnName.ToString());
Console.WriteLine(dt.Tables[0].Rows[0].ItemArray[0].ToString());
both will give same result. only data set contains number of index of table.
Upvotes: 3
Reputation: 309
Here is another solution which dumps the table to a comma separated string:
using System.Data;
public static string DumpDataTable(DataTable table)
{
string data = string.Empty;
StringBuilder sb = new StringBuilder();
if (null != table && null != table.Rows)
{
foreach (DataRow dataRow in table.Rows)
{
foreach (var item in dataRow.ItemArray)
{
sb.Append(item);
sb.Append(',');
}
sb.AppendLine();
}
data = sb.ToString();
}
return data;
}
Upvotes: 11