Иногда я оказываюсь в точке останова в своем коде и хочу просмотреть содержимое DataTable
переменной (или a DataTable
в a DataSet
). Быстрые часы не дают вам очень четкого представления о содержимом. Как мне их легко просмотреть?
c#
.net
asp.net
visual-studio
Adinas
источник
источник
Ответы:
Отладчик Visual Studio поставляется с четырьмя стандартными визуализаторами. Это визуализаторы текста, HTML и XML, которые работают со строковыми объектами, и визуализатор набора данных, который работает с объектами DataSet, DataView и DataTable.
Чтобы использовать его, взломайте свой код, наведите указатель мыши на DataSet, разверните быстрый просмотр, просмотрите таблицы, разверните его, затем просмотрите Table [0] (например). В быстрых часах вы увидите что-то вроде {Table1}, но обратите внимание на значок увеличительного стекла . Щелкните этот значок, и ваша таблица данных откроется в виде сетки.
источник
Чтобы украсить вывод отладчика 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 ! Вот мой пример вывода:
источник
У меня в проекте есть статический класс со следующим кодом:
#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 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
источник
и если вы хотите, чтобы это было где угодно ... чтобы быть помощником в 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 (и новее) поддерживает концепцию визуализаторов отладчика. Это позволяет вам настроить способ отображения объекта в среде IDE. Прочтите эту статью для получения более подробной информации.
http://davidhayden.com/blog/dave/archive/2005/12/26/2645.aspx
источник