Comment puis-je facilement visualiser le contenu d’un datatable ou dataview dans la fenêtre immédiate

Parfois, je serai à un point d’arrêt dans mon code et je veux voir le contenu d’une variable datatable (ou d’un datatable dans un dataset). La montre rapide ne vous donne pas une vue très claire du contenu. Comment puis-je les voir facilement?

Le débogueur Visual Studio est fourni avec quatre visualiseurs standard. Ce sont les visualiseurs de texte, HTML et XML, qui fonctionnent tous sur des objects de chaîne, et le visualiseur de jeu de données, qui fonctionne pour les objects DataSet, DataView et DataTable.

Pour l’utiliser, décomposez votre code, passez la souris sur votre DataSet, développez la surveillance rapide, affichez les tableaux, développez-la, puis affichez la table [0] (par exemple). Vous verrez quelque chose comme {Table1} dans la montre rapide, mais notez qu’il y a aussi une icône en forme de loupe . Cliquez sur cette icône et votre DataTable s’ouvrira dans une vue en grid.

Pour embellir la sortie du débogueur d’Adinas, j’ai fait quelques mises en forme simples:

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.Subssortingng(0, 17) + "..."; Debug.Write(Ssortingng.Format("{0,-20} | ", s)); } Debug.Write(Environment.NewLine); } for (int i = 0; i < table.Columns.Count; i++) { Debug.Write("---------------------|-"); } Debug.Write(Environment.NewLine); } 

La meilleure de cette solution: vous n'avez pas besoin de Visual Studio ! Voici mon exemple de sortie:

 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äß ... |  | 
 perdre |  nicht verpackungs ... |  0 | 
 --------------------- | ---------------------- | ----- ----------------- | -

Ce que je fais est d’avoir une classe statique avec le code suivant dans mon projet:

  #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("
" + "=======" + "
"); 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("
"); } } 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

J'appellerai alors l'une des fonctions ci-dessus dans la fenêtre immédiate et les résultats apparaîtront également. Par exemple, si je veux voir le contenu d'une variable «myDataset», j'appellerai printTbl (myDataset). Après avoir cliqué sur Entrée, les résultats seront imprimés dans la fenêtre immédiate

 public static void DebugDataSet ( ssortingng 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].ToSsortingng () + " " ); 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 ( ssortingng 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 = Ssortingng.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.ToSsortingng ( "yyyy:MM:dd -- hh:mm:ss.fff --- " ) + msg + "\n" ); break; //2 -- output to the error label in the master case 2: ssortingng previousMsg = System.Convert.ToSsortingng (System.Web.HttpContext.Current.Session["global.DebugMsg"]); System.Web.HttpContext.Current.Session["global.DebugMsg"] = previousMsg + DateTime.Now.ToSsortingng ( "yyyy:MM:dd -- hh:mm:ss.fff --- " ) + msg + "\n "; break; //output both to debug window and error label case 3: ssortingng previousMsg1 = System.Convert.ToSsortingng (System.Web.HttpContext.Current.Session["global.DebugMsg"] ); System.Web.HttpContext.Current.Session["global.DebugMsg"] = previousMsg1 + DateTime.Now.ToSsortingng ( "yyyy:MM:dd -- hh:mm:ss.fff --- " ) + msg + "\n"; System.Diagnostics.Debug.WriteIf ( System.Convert.ToBoolean( System.Configuration.ConfigurationSettings.AppSettings["Debugging"] ), DateTime.Now.ToSsortingng ( "yyyy:MM:dd -- hh:mm:ss.fff --- " ) + msg + "\n " ); break; //TODO: implement case when debugging goes to database } //eof switch } //eof method WriteIf 

Je ne l’ai pas essayé moi-même, mais Visual Studio 2005 (et les versions ultérieures) prennent en charge le concept des visualiseurs de débogage. Cela vous permet de personnaliser l’affichage d’un object dans l’EDI. Consultez cet article pour plus de détails.

http://davidhayden.com/blog/dave/archive/2005/12/26/2645.aspx

Essayez le Visualiseur XML . Je n’ai pas encore essayé la dernière version, mais je ne peux pas travailler sans la précédente dans Visual Studio 2003.

En plus de l’affichage hiérarchique de DataSet, il existe également de nombreuses autres fonctionnalités pratiques telles que le filtrage et la sélection du RowState que vous souhaitez afficher.

et si vous voulez que n’importe où … être un assistant sur DataTable cela suppose que vous vouliez capturer la sortie sur Log4Net mais l’excellent exemple de démarrage sur lequel j’ai travaillé ne fait que migrer vers la console … Celui-ci a aussi une variable de largeur de colonne éditable nMaxColWidth – en fin de compte, je passerai ça de n’importe quel contexte …

 public static class Helpers { private static ILog Log = Global.Log ?? LogManager.GetLogger("MyLogger"); ///  /// Dump contents of a DataTable to the log ///  ///  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 = ssortingng.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.Subssortingng(0, nMaxColWidth - 3) + "..."; sLogMessage = ssortingng.Concat(sLogMessage, ssortingng.Format(sColFormat, s)); } Log?.Debug(sLogMessage); //Debug.Write(Environment.NewLine); } Log?.Debug(sUnderScore); } }