0

我想向我的控制台输出一个格式良好的表格,其中包含来自 SqlDataReader 的数据。

我在 SO 上找到了这个答案,它有一个很好的类来完成所有工作,但是,我需要一些帮助来实现 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);
    }

另外,我希望它垂直扩展以包含数据库中的所有数据。

4

1 回答 1

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);
    }
于 2012-10-24T13:02:40.967 回答