我想用一个来自SqlDataReader的数据输出一个格式很好的表格。
我在这里找到了this回答了一个很好的类来完成所有的工作,但是,我需要一些帮助来实现SqlDataReader部分。
我打印表格的代码如下:
SqlDataReader data = getCommentsFromDB();
int value = 997;
string[,] arrValues = new string[5, 5];
for (int i = 0; i < arrValues.GetLength(0); i++)
{
for (int j = 0; j < arrValues.GetLength(1); j++)
{
value++;
arrValues[i, j] = value.ToString();
}
}
ArrayPrinter.PrintToConsole(arrValues);
Console.ReadLine();
getCommentsFromDB 如下所示:
SqlConnection conn = dal.connectDatabase();
conn.Open();
cmd = new SqlCommand(@"SELECT * FROM GuestBook", conn);
rdr = cmd.ExecuteReader();
return rdr;
如果您还有其他需要,请告知。
更新
我得到了更多。但是,现在我收到了这个令人讨厌的错误:
Error: {0}System.NullReferenceException: Object reference not set to an instance of an object.
at GuestBook.ArrayPrinter.GetMaxCellWidth(String[,] arrValues) in \GuestBook\GuestBook\ArrayPrinter.cs:line 39
at GuestBook.ArrayPrinter.GetDataInTableFormat(String[,] arrValues) in \GuestBook\GuestBook\ArrayPrinter.cs:line 60
at GuestBook.ArrayPrinter.PrintToConsole(String[,] arrValues) in \GuestBook\GuestBook\ArrayPrinter.cs:line 117
at GuestBook.StudentManager.showAllComments() in \GuestBook\GuestBook\StudentManager.cs:line 49
at GuestBook.ConsoleGUI.start(String[] args) in \GuestBook\GuestBook\ConsoleGUI.cs:line 28
at GuestBook.Program.Main(String[] args) in \GuestBook\GuestBook\Program.cs:line 20
根据我的经验,我会说我正在使用的课程有问题。也许它需要更新?
我在VS2012和C#.NET 4.0中运行
更新2
我的数据打印出来像这样:
-------------------------------------------------------------------------
| Column 1 | Column 2 | Column 3 | Column 4 |
-------------------------------------------------------------------------
| X | | | |
| | X | | |
| | | X | |
| | | | X |
-------------------------------------------------------------------------
而不是一行。
到目前为止我的代码:
public void showAllComments()
{
SqlDataReader reader = getCommentsFromDB();
string[,] arrValues = new string[5, 3];
for (int i = 0; i < 5; i++)
{
for (int j = 0; j < 3; j++)
{
if (!reader.Read()) break; //no more rows
{
arrValues[i, j] = reader[j].ToString();
}
}
}
ArrayPrinter.PrintToConsole(arrValues);
}
另外,我希望它能够垂直扩展以包含数据库中的所有数据。
答案 0 :(得分:1)
要让数组打印机类与您一起使用 SqlDataReader ,您必须将DataReader中包含的数据移动到字符串数组中。
您可以使用while循环访问 SqlDataReader ,并使用 Read()函数将Reader移动到下一行;可以使用 [] 运算符访问值,并将列位置或字段名称作为索引。
while (reader.Read())
{
string myVal = reader["COLUMN_NAME"].ToString();
}
假设您想阅读阅读器前五行中的前5列,您可以使用for循环执行此类操作(显然,您可能需要使代码更灵活)
编辑:修改后的代码
SqlDataReader reader = command.ExecuteReader();
string[,] arrValues = new string[5, 5];
for (int i = 0; i < 5; i++)
{
if (!reader.Read()) break; //no more rows
for (int j = 0; j < 5; j++)
{
arrValues[i,j] = reader[j].ToString();
}
}
编辑2:
这应该修复行问题的随机数。不是最佳解决方案,但应该有效。 警告我刚刚在文本编辑器中编写它,无法使用编译器进行测试
public void showAllComments()
{
SqlDataReader reader = getCommentsFromDB();
List<List<string>> myData; //create list of list
int fieldN = reader.FieladCount; //i assume every row in the reader has the same number of field of the first row
//Cannot get number of rows in a DataReader so i fill a list
while (reader.Read())
{
//create list for the row
List<string> myRow = new List<string>();
myData.Add(myRow);//add the row to the list of rows
for (int i =0; i < fieldN; i++)
{
myRow.Add(reader[i].ToString();//fill the row with field data
}
}
string[,] arrValues = new string[myData.Count, fieldN]; //create the array for the print class
//go through the list and convert to an array
//this could probably be improved
for (int i = 0; i < myData.Count; i++)
{
List<string> myRow = myData[i];//get the list for the row
for (int j = 0; j < nField; j++)
{
arrValues[i, j] = myRow[j]; //read the field
}
}
ArrayPrinter.PrintToConsole(arrValues);
}