바로 옆 창에서 데이터 테이블 또는 데이터 보기의 내용을 쉽게 볼 수 있는 방법
때때로 코드의 중단점에 있을 때가 있으며 다음의 내용을 보고 싶습니다.DataTable
변수(또는 a)DataTable
순식간에DataSet
). 퀵 워치는 내용을 잘 볼 수 없습니다.어떻게 하면 쉽게 볼 수 있을까요?
Visual Studio 디버거는 4개의 표준 시각화 프로그램과 함께 제공됩니다.문자열 개체에서 작동하는 텍스트, HTML 및 XML 시각화 도구와 DataSet, DataView 및 DataTable 개체에서 작동하는 데이터셋 시각화 도구입니다.
이 기능을 사용하려면 코드를 입력하고 데이터 세트 위에 마우스를 올려놓고 빠른 시계를 확장한 다음 표를 보고 확장한 다음 표[0]를 봅니다(예:빠른 시계에는 {Table1}과(와) 같은 것이 표시되지만 돋보기 아이콘도 있습니다.해당 아이콘을 클릭하면 데이터 테이블이 그리드 보기로 열립니다.
아디다스의 디버거 출력을 미화하기 위해 몇 가지 간단한 포맷을 만들었습니다.
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는 필요 없습니다!다음은 출력 예입니다.
패키지 커즈, 팩 이름, 버팩펑겐의 패키지 Gewitcht를 선택합니다. 팩커즈 | 팩 이름 | 팩게이치트 |---------------------|----------------------|----------------------|-BB205 | 빅백 205kg | 205 |BB300 | 빅백 300kg | 300 |BB365 | 빅백365kg | 365 |CO | 컨테이너, 알터우...| |EP | 팔레트 | | |IBC | 화학칼리엔게페...| |지다 | nichtverpackungs...| 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 키를 누른 후 결과가 바로 창으로 인쇄됩니다.
그리고 만약 당신이 이것을 원한다면 어디든...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);
}
}
Xml Visualizer를 사용해 보십시오.아직 최신 버전을 시도하지 않았지만 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
나는 그것을 위한 작은 방법을 프로그래밍했습니다.그것은 일반화 함수입니다.
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 이상에서는 디버거 비주얼라이저 개념을 지원합니다.이를 통해 IDE에 개체가 표시되는 방식을 사용자 지정할 수 있습니다.자세한 내용은 이 기사를 참조하십시오.
http://davidhayden.com/blog/dave/archive/2005/12/26/2645.aspx
언급URL : https://stackoverflow.com/questions/491555/how-can-i-easily-view-the-contents-of-a-datatable-or-dataview-in-the-immediate-w
'programing' 카테고리의 다른 글
최신 Git commit에서 간단히 패치를 생성하려면 어떻게 해야 합니까? (0) | 2023.06.29 |
---|---|
상태를 사용하려면 선택기를 사용해야 합니다. (0) | 2023.06.24 |
업데이트 패널 내의 단추에서 전체 포스트백을 강제로 수행하려면 어떻게 해야 합니까? (0) | 2023.06.24 |
단일 파일을 pytest로 테스트하는 방법 (0) | 2023.06.24 |
Git 병합 중단 (0) | 2023.06.24 |