Bazen kodumda bir kesme noktasında olacağım ve bir DataTabledeğişkenin (veya a DataTableiçinde a DataSet) içeriğini görüntülemek istiyorum . Hızlı izleme, size içeriğin çok net bir görünümünü vermez. Bunları nasıl kolayca görebilirim?
Bazen kodumda bir kesme noktasında olacağım ve bir DataTabledeğişkenin (veya a DataTableiçinde a DataSet) içeriğini görüntülemek istiyorum . Hızlı izleme, size içeriğin çok net bir görünümünü vermez. Bunları nasıl kolayca görebilirim?
Yanıtlar:
Visual Studio hata ayıklayıcı, dört standart görselleştiriciyle birlikte gelir. Bunlar, tümü dize nesneleri üzerinde çalışan metin, HTML ve XML görselleştiriciler ile DataSet, DataView ve DataTable nesneleri için çalışan veri kümesi görselleştiricisidir.
Bunu kullanmak için, kodunuza girin, fareyi Veri Kümenizin üzerine getirin, hızlı izlemeyi genişletin, Tabloları görüntüleyin, onu genişletin ve ardından Tablo [0] 'yu görüntüleyin (örneğin). Hızlı saatte {Tablo1} gibi bir şey göreceksiniz, ancak bir büyüteç simgesi de olduğunu fark edeceksiniz . Bu simgeye tıklayın ve DataTable'ınız ızgara görünümünde açılacaktır.
Adinas'ın hata ayıklayıcı çıktısını güzelleştirmek için bazı basit biçimlendirmeler yaptım:
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);
}
Bu çözümün en iyisi: Visual Studio'ya ihtiyacınız yok ! İşte örnek çıktım:
Verpackungen'DEN PackKurz, PackName, PackGewicht'i SEÇİN PackKurz | PackName | PackGewicht | --------------------- | ---------------------- | ----- ----------------- | - BB205 | BigBag 205 kg | 205 | BB300 | BigBag 300 kg | 300 | BB365 | BigBag 365 kg | 365 | CO | Konteyner, Alteru ... | | EP | Palet | | IBC | Chemikaliengefäß ... | | kaybetmek | nicht verpackungs ... | 0 | --------------------- | ---------------------- | ----- ----------------- | -
Yaptığım şey, projemde aşağıdaki kodla statik bir sınıfa sahip olmak:
#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
Daha sonra hemen pencerede yukarıdaki işlevlerden birini çağıracağım ve sonuçlar orada da görünecek. Örneğin 'myDataset' değişkeninin içeriğini görmek istersem printTbl (myDataset) 'i çağıracağım. Enter tuşuna bastıktan sonra sonuçlar hemen pencereye yazdırılacaktır.
Ver XML Visualizer deneyin. Henüz en son sürümü denemedim, ancak Visual Studio 2003'te önceki sürüm olmadan çalışamam.
DataSet'i hiyerarşik olarak görüntülemenin yanı sıra, filtreleme ve görüntülemek istediğiniz RowState'i seçme gibi başka birçok kullanışlı özellik de vardır.
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
ve eğer bunun herhangi bir yerde DataTable'da bir yardımcı olmasını istiyorsanız, bu, Log4Net'e çıktıyı yakalamak istediğinizi varsayar, ancak sadece konsola yönelik dökümlere karşı çalıştığım mükemmel başlangıç örneği ... Bu ayrıca düzenlenebilir sütun genişliği değişkenine sahiptir nMaxColWidth - sonuçta bunu hangi bağlamda olursa olsun aktaracağım ...
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);
}
}
onun için küçük bir yöntem programladım .. bu bir genelleme işlevi ..
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) ;
}
Kendim denemedim, ancak Visual Studio 2005 (ve sonrası) Hata Ayıklayıcı Görselleştiriciler konseptini destekliyor. Bu, bir nesnenin IDE'de nasıl gösterileceğini özelleştirmenize olanak tanır. Daha fazla ayrıntı için bu makaleye göz atın.
http://davidhayden.com/blog/dave/archive/2005/12/26/2645.aspx