Как просмотреть DataTable во время отладки - PullRequest
77 голосов
/ 26 августа 2009

Я только начинаю использовать ADO.NET, DataSets и DataTables. Одна из проблем, с которыми я сталкиваюсь, - это довольно сложно определить, какие значения находятся в таблице данных при попытке отладки.

Каковы некоторые из самых простых способов быстрого просмотра значений, которые были сохранены в DataTable? Есть ли какой-нибудь способ просмотреть содержимое в Visual Studio во время отладки или это единственный вариант записи данных в файл?

Я создал небольшую служебную функцию, которая записывает DataTable в файл CSV. И все же созданный в результате файл CSV был обрезан. Около 3 строк из того, что должно было быть последней строкой в ​​середине написания System.Guid, файл просто останавливается. Я не могу сказать, является ли это проблемой с моим методом преобразования CSV или исходной совокупностью DataTable.

Обновление

Забудьте последнюю часть, которую я просто забыл очистить мой потоковый писатель.

Ответы [ 4 ]

184 голосов
/ 26 августа 2009

Если задана точка останова, после заполнения DataTable или DataSet вы можете увидеть увеличительное стекло, если навести курсор на переменную. Если вы щелкнете по нему, он вызовет DataTable Visualizer, который вы можете прочитать о здесь .

На этом изображении, которое вы видите ниже, dt - моя переменная DataTable, и точка останова была достигнута несколькими строками ниже, что позволяет мне наводить курсор на это значение. Использование Visual Studio 2008.

alt text

Визуализатор DataTable ( кредит изображения ):
alt text

1 голос
/ 27 августа 2009

установите точку останова на наборе данных / datatable (комбинация клавиш f9 для точки останова) и запустите ваше приложение (f5 - это клавиша быстрого доступа). Когда точка останова приходит, когда мышь наводит курсор, набор данных / набор данных можно щелкнуть по стеклу, показанному на изображении при наведении в визуальной студии.

Примечание: check compilation debug = "true" в веб-конфигурации имеет значение true. Иначе Visual Studio не пойдет для отладки.

1 голос
/ 27 августа 2009

Я добавил две строки в мое приложение внутри класса, названного в честь самого внешнего класса:

public MyClass()
    {
      // The following (2) lines are used for testing only.  Remove comments to debug.
      System.Diagnostics.Debugger.Launch();
      System.Diagnostics.Debugger.Break();
    }

Это должно остановить приложение и запустить его в режиме отладки. Затем вы можете пройтись по нему и посмотреть на значения в ваших объектах, когда вы наводите на них курсор.

0 голосов
/ 03 мая 2010
    /// <summary>
    /// Dumps the passed DataSet obj for debugging as list of html tables
    /// </summary>
    /// <param name="msg"> the msg attached </param>
    /// <param name="ds"> the DataSet object passed for Dumping </param>
    /// <returns> the nice looking dump of the DataSet obj in html format</returns>
    public static string DumpHtmlDs(string msg, ref System.Data.DataSet ds)
    {
        StringBuilder objStringBuilder = new StringBuilder();
        objStringBuilder.AppendLine("<html><body>");

        if (ds == null)
        {
            objStringBuilder.AppendLine("Null dataset passed ");
            objStringBuilder.AppendLine("</html></body>");
            WriteIf(objStringBuilder.ToString());
            return objStringBuilder.ToString();
        }

        objStringBuilder.AppendLine("<p>" + msg + " START </p>");
        if (ds != null)
        {
            if (ds.Tables == null)
            {
                objStringBuilder.AppendLine("ds.Tables == null ");
                return objStringBuilder.ToString();
            }


            foreach (System.Data.DataTable dt in ds.Tables)
            {

                if (dt == null)
                {
                    objStringBuilder.AppendLine("ds.Tables == null ");
                    continue;
                }
                objStringBuilder.AppendLine("<table>");

                //objStringBuilder.AppendLine("================= My TableName is  " +
                //dt.TableName + " ========================= START");
                int colNumberInRow = 0;
                objStringBuilder.Append("<tr><th>row number</th>");
                foreach (System.Data.DataColumn dc in dt.Columns)
                {
                    if (dc == null)
                    {
                        objStringBuilder.AppendLine("DataColumn is null ");
                        continue;
                    }


                    objStringBuilder.Append(" <th> |" + colNumberInRow.ToString() + " | ");
                    objStringBuilder.Append(  dc.ColumnName.ToString() + " </th> ");
                    colNumberInRow++;
                } //eof foreach (DataColumn dc in dt.Columns)
                objStringBuilder.Append("</tr>");

                int rowNum = 0;
                foreach (System.Data.DataRow dr in dt.Rows)
                {
                    objStringBuilder.Append("<tr><td> row - | " + rowNum.ToString() + " | </td>");
                    int colNumber = 0;
                    foreach (System.Data.DataColumn dc in dt.Columns)
                    {
                        objStringBuilder.Append(" <td> |" + colNumber + "|" );
                        objStringBuilder.Append(dr[dc].ToString() + "  </td>");
                        colNumber++;
                    } //eof foreach (DataColumn dc in dt.Columns)
                    rowNum++;
                    objStringBuilder.AppendLine(" </tr>");
                }   //eof foreach (DataRow dr in dt.Rows)

                objStringBuilder.AppendLine("</table>");
                objStringBuilder.AppendLine("<p>" + msg + " END </p>");
            }   //eof foreach (DataTable dt in ds.Tables)

        } //eof if ds !=null 
        else
        {

            objStringBuilder.AppendLine("NULL DataSet object passed for debugging !!!");
        }
        return objStringBuilder.ToString();

    } 
...