有时我会在代码的断点处查看数据表变量(或数据集中的数据表)的内容。快速手表不能让您清楚地看到内容。我怎样才能轻松查看它们?
答案 0 :(得分:152)
Visual Studio调试器附带四个标准可视化工具。这些是文本,HTML和XML可视化工具,它们都可以处理字符串对象,以及数据集可视化工具,适用于DataSet,DataView和DataTable对象。
要使用它,请进入代码,将鼠标悬停在DataSet上,展开快速监视,查看表格,展开表格,然后查看表格[0](例如)。您会在快速监视中看到类似{Table1}的内容,但请注意还有放大镜图标。单击该图标,您的DataTable将在网格视图中打开。
答案 1 :(得分:14)
为了美化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 | ---------------------|----------------------|----------------------|-
答案 2 :(得分:1)
我所做的是在我的项目中使用以下代码的静态类:
#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)。点击进入后,结果将打印到即时窗口
答案 3 :(得分:1)
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
答案 4 :(得分:1)
我为此编写了一个小方法。 它具有泛化功能。
public static void printDataTable(DataTable tbl)
{
string line = "";
foreach (DataColumn item in tbl.Columns)
{
line += item.ColumnName +" ";
}
line += "\n";
foreach (DataRow row in tbl.Rows)
{
for (int i = 0; i < tbl.Columns.Count; i++)
{
line += row[i].ToString() + " ";
}
line += "\n";
}
Console.WriteLine(line) ;
}
答案 5 :(得分:0)
我自己没有尝试过,但Visual Studio 2005(及更高版本)支持Debugger Visualizers的概念。这允许您自定义对象在IDE中的显示方式。有关更多详细信息,请查看此文章。
http://davidhayden.com/blog/dave/archive/2005/12/26/2645.aspx
答案 6 :(得分:0)
尝试Xml Visualizer。 还没有尝试过最新版本,但如果没有Visual Studio 2003中的前一版本,我就无法工作。
除了分层显示DataSet之外,还有许多其他方便的功能,例如过滤和选择要查看的RowState。
答案 7 :(得分:0)
如果你想在任何地方......想成为DataTable的帮手 这假设您想要将输出捕获到Log4Net,但是出色的起始示例我只是反对转储到控制台...... 这个也有可编辑的列宽变量 nMaxColWidth - 最终我将从任何上下文传递它...
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);
}
}