때때로 나는 내 코드의 중단 점에있을 것이고 DataTable
변수 (또는 DataTable
a DataSet
) 의 내용을보고 싶습니다 . 퀵 워치는 내용에 대한 명확한보기를 제공하지 않습니다. 어떻게 쉽게 볼 수 있습니까?
때때로 나는 내 코드의 중단 점에있을 것이고 DataTable
변수 (또는 DataTable
a DataSet
) 의 내용을보고 싶습니다 . 퀵 워치는 내용에 대한 명확한보기를 제공하지 않습니다. 어떻게 쉽게 볼 수 있습니까?
답변:
Visual Studio 디버거에는 4 개의 표준 시각화 도우미가 함께 제공됩니다. 이들은 모두 문자열 개체에서 작동하는 텍스트, HTML 및 XML 시각화 도우미와 DataSet, DataView 및 DataTable 개체에 대해 작동하는 데이터 집합 시각화 도우미입니다.
이를 사용하려면 코드를 분할하고 DataSet 위에 마우스를 올려 놓고 퀵 워치를 확장하고 테이블을보고 확장 한 다음 Table [0]을 봅니다 (예 :). 퀵 워치에 {Table1}과 같은 내용이 표시되지만 돋보기 아이콘도 있습니다. 해당 아이콘을 클릭하면 DataTable이 그리드보기로 열립니다.
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가 필요하지 않습니다 ! 여기 내 예제 출력 :
verpackungen에서 PackKurz, PackName, PackGewicht 선택 PackKurz | PackName | PackGewicht | --------------------- | ---------------------- | ----- ----------------- |- BB205 | BigBag 205 kg | 205 | BB300 | BigBag 300kg | 300 | BB365 | BigBag 365 kg | 365 | CO | 컨테이너, Alteru ... | | EP | 팔레트 | | IBC | Chemikaliengefäß ... | | 잃다 | nicht verpackungs ... | 0 | --------------------- | ---------------------- | ----- ----------------- |-
내 프로젝트에 다음 코드가 포함 된 정적 클래스가 있습니다.
#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 키를 누르면 결과가 즉시 창에 인쇄됩니다.
부여 XML을 시각화를 시도. 아직 최신 버전을 시도하지 않았지만 Visual Studio 2003에서 이전 버전 없이는 작업 할 수 없습니다.
DataSet을 계층 적으로 표시하는 것 외에도 보려는 RowState를 필터링하고 선택하는 것과 같은 기타 편리한 기능이 많이 있습니다.
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
그리고 만약 당신이 이것을 어디서든 ... 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);
}
}
나는 그것을위한 작은 방법을 프로그램했다 .. 그것의 일반화 기능 ..
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) ;
}
직접 시도하지는 않았지만 Visual Studio 2005 (및 이후 버전)는 Debugger Visualizers 개념을 지원합니다. 이를 통해 IDE에서 개체가 표시되는 방식을 사용자 지정할 수 있습니다. 자세한 내용은이 기사를 확인하십시오.
http://davidhayden.com/blog/dave/archive/2005/12/26/2645.aspx