如何在调试时查看DataTable

90

我刚开始使用 ADO.NET、DataSets 和 DataTables。遇到的一个问题是在调试时很难知道数据表中有什么值。

有什么简单的方法可以快速查看 DataTable 中保存的值吗?是否有办法在 Visual Studio 调试时查看内容,或者唯一的选项是将数据写入文件?

我创建了一个小型实用程序函数,可以将 DataTable 写入 CSV 文件。但是生成的 CSV 文件被截断了。在写入 System.Guid 时,文件停顿在应该是最后一行之前的约3行。我无法确定这是我的 CSV 转换方法出了问题,还是原始 DataTable 的填充出了问题。

更新

忘记上面提到的问题,我只是忘了刷新流写入器。

4个回答

216

在设置了断点后,当DataTable或DataSet被填充后,如果你将鼠标悬停在变量上,你会看到一个放大镜。如果你点击它,它会打开DataTable Visualizer,你可以在这里阅读相关信息。

在下面的图片中,dt是我的DataTable变量,断点命中后我可以悬停在这个值上。使用Visual Studio 2008。

alt text

DataTable Visualizer (图片来源):
alt text


7
我不知道我为什么这么长时间都没有查找这个!你会认为他们会让那个微小的放大镜图标更加明显! - Jason Rae
4
我同意。我怎么会错过这个功能呢?自从它第一次发布以来,我一直在使用VS。这个功能是什么时候添加的? - Zath
很好的答案!唯一的问题是 Visualizer 不显示行号。如果我需要检查特定行的值,我该怎么办? - AllSolutions
这真的很棒,但如果你不知道它,那就真的很令人沮丧! - JosephDoggie

2

在数据集/数据表上设置断点(使用F9快捷键),然后运行您的应用程序(使用F5快捷键)。当断点出现时,将鼠标悬停在数据集/数据表上,在Visual Studio中显示的悬停图像中单击玻璃图标。

注意:检查Web.config文件中的compilation debug="true"是否为true。否则,Visual Studio将无法进行调试。


1

我在最外层类的名称之后的一个类中添加了两行代码:

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

这应该会停止应用程序并将其带到调试模式。然后,您可以逐步执行它并在悬停在对象上时查看对象中的值。


0
    /// <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();

    } 

什么是 WriteIf??WriteIf(objStringBuilder.ToString()); - Kiquenet

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接