代码之家  ›  专栏  ›  技术社区  ›  adinas

如何在即时窗口中轻松查看数据表或数据视图的内容

  •  75
  • adinas  · 技术社区  · 17 年前

    有时,我会在代码中的一个断点处,我想查看数据表变量(或数据集中的数据表)的内容。快速表不能让你清楚地看到里面的东西。我怎样才能轻松地查看它们?

    7 回复  |  直到 8 年前
        1
  •  150
  •   Leniel Maccaferri    8 年前

    Visual Studio调试器附带四个标准可视化工具。这些是文本、HTML和XML可视化工具,所有这些工具都用于字符串对象,而数据集可视化工具则用于数据集、数据视图和数据表对象。

    要使用它,请打断代码,将鼠标悬停在数据集上,展开“快速观察”,查看表,展开它,然后查看表[0](例如)。您将在快速观察中看到类似表1的内容,但请注意还有一个 放大镜图标 . 单击该图标,您的数据表将在网格视图中打开。

    enter image description here

        2
  •  14
  •   Luluha    13 年前

    为了美化Adinas的调试器输出,我做了一些简单的格式化:

        public void DebugTable(DataTable table)
        {
            Debug.WriteLine("--- DebugTable(" + table.TableName + ") ---");
            int zeilen = table.Rows.Count;
            int spalten = table.Columns.Count;
    
            // Header
            for (int i = 0; i < table.Columns.Count; i++)
            {
                string s = table.Columns[i].ToString();
                Debug.Write(String.Format("{0,-20} | ", s));
            }
            Debug.Write(Environment.NewLine);
            for (int i = 0; i < table.Columns.Count; i++)
            {
                Debug.Write("---------------------|-");
            }
            Debug.Write(Environment.NewLine);
    
            // Data
            for (int i = 0; i < zeilen; i++)
            {
                DataRow row = table.Rows[i];
                //Debug.WriteLine("{0} {1} ", row[0], row[1]);
                for (int j = 0; j < spalten; j++)
                {
                    string s = row[j].ToString();
                    if (s.Length > 20) s = s.Substring(0, 17) + "...";
                    Debug.Write(String.Format("{0,-20} | ", s));
                }
                Debug.Write(Environment.NewLine);
            }
            for (int i = 0; i < table.Columns.Count; i++)
            {
                Debug.Write("---------------------|-");
            }
            Debug.Write(Environment.NewLine);
        }
    

    最好的解决方案: 您不需要Visual Studio ! 这里是我的示例输出:

    SELECT PackKurz, PackName, PackGewicht FROM verpackungen
    
    PackKurz             | PackName             | PackGewicht          | 
    ---------------------|----------------------|----------------------|-
    BB205                | BigBag 205 kg        | 205                  | 
    BB300                | BigBag 300 kg        | 300                  | 
    BB365                | BigBag 365 kg        | 365                  | 
    CO                   | Container, Alteru... |                      | 
    EP                   | Palette              |                      | 
    IBC                  | Chemikaliengefäß ... |                      | 
    lose                 | nicht verpackungs... | 0                    | 
    ---------------------|----------------------|----------------------|-
    
        3
  •  1
  •   adinas    17 年前

    我要做的是在我的项目中有一个带有以下代码的静态类:

        #region Dataset -> Immediate Window
    public static void printTbl(DataSet myDataset)
    {
        printTbl(myDataset.Tables[0]);
    }
    public static void printTbl(DataTable mytable)
    {
        for (int i = 0; i < mytable.Columns.Count; i++)
        {
            Debug.Write(mytable.Columns[i].ToString() + " | ");
        }
        Debug.Write(Environment.NewLine + "=======" + Environment.NewLine);
        for (int rrr = 0; rrr < mytable.Rows.Count; rrr++)
        {
            for (int ccc = 0; ccc < mytable.Columns.Count; ccc++)
            {
                Debug.Write(mytable.Rows[rrr][ccc] + " | ");
            }
            Debug.Write(Environment.NewLine);
        }
    }
    public static void ResponsePrintTbl(DataTable mytable)
    {
        for (int i = 0; i < mytable.Columns.Count; i++)
        {
            HttpContext.Current.Response.Write(mytable.Columns[i].ToString() + " | ");
        }
        HttpContext.Current.Response.Write("<BR>" + "=======" + "<BR>");
        for (int rrr = 0; rrr < mytable.Rows.Count; rrr++)
        {
            for (int ccc = 0; ccc < mytable.Columns.Count; ccc++)
            {
                HttpContext.Current.Response.Write(mytable.Rows[rrr][ccc] + " | ");
            }
            HttpContext.Current.Response.Write("<BR>");
        }
    }
    
    public static void printTblRow(DataSet myDataset, int RowNum)
    {
        printTblRow(myDataset.Tables[0], RowNum);
    }
    public static void printTblRow(DataTable mytable, int RowNum)
    {
        for (int ccc = 0; ccc < mytable.Columns.Count; ccc++)
        {
            Debug.Write(mytable.Columns[ccc].ToString() + " : ");
            Debug.Write(mytable.Rows[RowNum][ccc]);
            Debug.Write(Environment.NewLine);
        }
    }
    #endregion
    

    然后我将在即时窗口中调用上述函数之一,结果也将显示在那里。 例如,如果我想查看变量“mydataset”的内容,我将调用printtbl(mydataset)。按Enter键后,结果将打印到即时窗口

        4
  •  1
  •   Rob    15 年前
    public static void DebugDataSet ( string msg, ref System.Data.DataSet ds )
    {
        WriteIf ( "===================================================" + msg + " START " );
        if (ds != null)
        {
            WriteIf ( msg );
            foreach (System.Data.DataTable dt in ds.Tables)
            {
                WriteIf ( "================= My TableName is  " +
                dt.TableName + " ========================= START" );
                int colNumberInRow = 0;
                foreach (System.Data.DataColumn dc in dt.Columns)
                {
                    System.Diagnostics.Debug.Write ( " | " );
                    System.Diagnostics.Debug.Write ( " |" + colNumberInRow + "| " );
                    System.Diagnostics.Debug.Write ( dc.ColumnName + " | " );
                    colNumberInRow++;
                } //eof foreach (DataColumn dc in dt.Columns)
                int rowNum = 0;
                foreach (System.Data.DataRow dr in dt.Rows)
                {
                    System.Diagnostics.Debug.Write ( "\n row " + rowNum + " --- " );
                    int colNumber = 0;
                    foreach (System.Data.DataColumn dc in dt.Columns)
                    {
                        System.Diagnostics.Debug.Write ( " |" + colNumber + "| " );
                        System.Diagnostics.Debug.Write ( dr[dc].ToString () + " " );
                        colNumber++;
                    } //eof foreach (DataColumn dc in dt.Columns)
                    rowNum++;
                }   //eof foreach (DataRow dr in dt.Rows)
                System.Diagnostics.Debug.Write ( " \n" );
                WriteIf ( "================= Table " + dt.TableName + " ========================= END" );
                WriteIf ( "===================================================" + msg + " END " );
            }   //eof foreach (DataTable dt in ds.Tables)
        } //eof if ds !=null 
        else
        {
            WriteIf ( "NULL DataSet object passed for debugging !!!" );
        }
    } //eof method 
    
    public static void WriteIf ( string msg )
    {
        //TODO: FIND OUT ABOUT e.Message + e.StackTrace from Bromberg eggcafe
    int output = System.Convert.ToInt16(System.Configuration.ConfigurationSettings.AppSettings["DebugOutput"] );
        //0 - do not debug anything just run the code 
    switch (output)
    {
        //do not debug anything 
        case 0:
            msg = String.Empty;
        break;
            //1 - output to debug window in Visual Studio       
            case 1:
                System.Diagnostics.Debug.WriteIf ( System.Convert.ToBoolean( System.Configuration.ConfigurationSettings.AppSettings["Debugging"] ), DateTime.Now.ToString ( "yyyy:MM:dd -- hh:mm:ss.fff --- " ) + msg + "\n" );
                break;
            //2 -- output to the error label in the master 
            case 2:
                string previousMsg = System.Convert.ToString (System.Web.HttpContext.Current.Session["global.DebugMsg"]);
                System.Web.HttpContext.Current.Session["global.DebugMsg"] = previousMsg +
                DateTime.Now.ToString ( "yyyy:MM:dd -- hh:mm:ss.fff --- " ) + msg + "\n </br>";
                break;
            //output both to debug window and error label 
            case 3:
                string previousMsg1 = System.Convert.ToString (System.Web.HttpContext.Current.Session["global.DebugMsg"] );
                System.Web.HttpContext.Current.Session["global.DebugMsg"] = previousMsg1 + DateTime.Now.ToString ( "yyyy:MM:dd -- hh:mm:ss.fff --- " ) + msg + "\n";
                System.Diagnostics.Debug.WriteIf ( System.Convert.ToBoolean( System.Configuration.ConfigurationSettings.AppSettings["Debugging"] ), DateTime.Now.ToString ( "yyyy:MM:dd -- hh:mm:ss.fff --- " ) + msg + "\n </br>" );
                break;
            //TODO: implement case when debugging goes to database 
        } //eof switch 
    
    } //eof method WriteIf
    
        5
  •  0
  •   gilles27    17 年前

    我自己没有尝试过,但Visual Studio 2005(及更高版本)支持调试器可视化工具的概念。这允许您自定义对象在IDE中的显示方式。查看本文了解更多详细信息。

    http://davidhayden.com/blog/dave/archive/2005/12/26/2645.aspx

        6
  •  0
  •   Gerrie Schenck    17 年前

    给予 Xml Visualizer 尝试一下。 尚未尝试最新版本,但在Visual Studio 2003中,如果没有上一个版本,我将无法工作。

    除了分层显示数据集之外,还有许多其他方便的功能,如筛选和选择要查看的行状态。

        7
  •  0
  •   Allen    8 年前

    如果你想在任何地方得到这个…成为数据表的助手 这假设您希望捕获输出到log4net,但我所处理的优秀的开始示例只是将数据转储到控制台… 这个也有可编辑的列宽变量 最大宽度 -最终,我将从任何上下文中传递…

    public static class Helpers
        {
            private static ILog Log = Global.Log ?? LogManager.GetLogger("MyLogger");
            /// <summary>
            /// Dump contents of a DataTable to the log
            /// </summary>
            /// <param name="table"></param>
            public static void DebugTable(this DataTable table)
            {
                Log?.Debug("--- DebugTable(" + table.TableName + ") ---");
                var nRows = table.Rows.Count;
                var nCols = table.Columns.Count;
                var nMaxColWidth = 32;
    
                // Column Headers
    
                var sColFormat = @"{0,-" + nMaxColWidth + @"} | ";
                var sLogMessage = string.Empty;
                for (var i = 0; i < table.Columns.Count; i++)
                {
                    sLogMessage = string.Concat(sLogMessage, string.Format(sColFormat, table.Columns[i].ToString()));
                }
                //Debug.Write(Environment.NewLine);
                Log?.Debug(sLogMessage);
    
                var sUnderScore = string.Empty;
                var sDashes = string.Empty;
                for (var j = 0; j <= nMaxColWidth; j++)
                {
                    sDashes = sDashes + "-";
                }
    
    
                for (var i = 0; i < table.Columns.Count; i++)
                {
                    sUnderScore = string.Concat(sUnderScore, sDashes + "|-");
                }
    
                sUnderScore = sUnderScore.TrimEnd('-');
    
                //Debug.Write(Environment.NewLine);
                Log?.Debug(sUnderScore);
    
                // Data
                for (var i = 0; i < nRows; i++)
                {
                    DataRow row = table.Rows[i];
                    //Debug.WriteLine("{0} {1} ", row[0], row[1]);
                    sLogMessage = string.Empty;
    
                    for (var j = 0; j < nCols; j++)
                    {
                        string s = row[j].ToString();
                        if (s.Length > nMaxColWidth) s = s.Substring(0, nMaxColWidth - 3) + "...";
                        sLogMessage = string.Concat(sLogMessage, string.Format(sColFormat, s));
                    }
    
                    Log?.Debug(sLogMessage);
                    //Debug.Write(Environment.NewLine);
                }           
                Log?.Debug(sUnderScore);
            }
    }