Kadang-kadang saya akan berada di breakpoint dalam kode saya dan saya ingin melihat isi DataTable
variabel (atau a DataTable
di a DataSet
). Jam tangan cepat tidak memberi Anda gambaran yang jelas tentang isinya. Bagaimana cara melihatnya dengan mudah?
c#
.net
asp.net
visual-studio
adinas
sumber
sumber
Jawaban:
Debugger Visual Studio dilengkapi dengan empat visualisator standar. Ini adalah teks, HTML, dan visualisator XML, yang semuanya bekerja pada objek string, dan visualizer kumpulan data, yang berfungsi untuk objek DataSet, DataView, dan DataTable.
Untuk menggunakannya, masuk ke kode Anda, arahkan mouse ke Kumpulan Data Anda, luaskan jam tangan cepat, lihat Tabel, luaskan, lalu lihat Tabel [0] (misalnya). Anda akan melihat sesuatu seperti {Table1} di jam tangan cepat, tetapi perhatikan bahwa ada juga ikon kaca pembesar . Klik pada ikon itu dan DataTable Anda akan terbuka dalam tampilan kisi.
sumber
Untuk mempercantik keluaran debugger adinas, saya membuat beberapa format sederhana:
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); }
Solusi terbaik ini: Anda tidak memerlukan Visual Studio ! Berikut contoh keluaran saya:
sumber
Yang saya lakukan adalah memiliki kelas statis dengan kode berikut di proyek saya:
#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
Saya kemudian akan memanggil salah satu fungsi di atas di jendela langsung dan hasilnya akan muncul di sana juga. Misalnya jika saya ingin melihat konten variabel 'myDataset' saya akan memanggil printTbl (myDataset). Setelah menekan enter, hasilnya akan langsung dicetak ke jendela
sumber
Berikan Xml Visualizer mencoba. Belum mencoba versi terbaru, tetapi saya tidak dapat bekerja tanpa versi sebelumnya di Visual Studio 2003.
selain menampilkan DataSet secara hierarki, ada juga banyak fitur berguna lainnya seperti pemfilteran dan memilih RowState yang ingin Anda lihat.
sumber
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
sumber
dan jika Anda ingin ini di mana saja ... menjadi penolong di DataTable ini mengasumsikan Anda ingin menangkap output ke Log4Net tetapi contoh awal yang sangat baik yang saya kerjakan hanya untuk membuang ke konsol ... Yang ini juga memiliki variabel lebar kolom yang dapat diedit nMaxColWidth - akhirnya saya akan meneruskannya dari konteks apa pun ...
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); } }
sumber
saya telah memprogram metode kecil untuk itu .. ini adalah fungsi generalisasi ..
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) ; }
sumber
Saya belum mencobanya sendiri, tetapi Visual Studio 2005 (dan yang lebih baru) mendukung konsep Debugger Visualizers. Ini memungkinkan Anda untuk menyesuaikan bagaimana suatu objek ditampilkan di IDE. Lihat artikel ini untuk lebih jelasnya.
http://davidhayden.com/blog/dave/archive/2005/12/26/2645.aspx
sumber