কখনও কখনও আমি আমার কোডটির একটি ব্রেকপয়েন্টে থাকব এবং আমি কোনও DataTable
ভেরিয়েবলের সামগ্রী (বা একটিতে DataTable
একটি DataSet
) দেখতে চাই। দ্রুত ঘড়ি আপনাকে বিষয়বস্তুগুলির একটি খুব পরিষ্কার দৃষ্টিভঙ্গি দেয় না। এগুলি কীভাবে আমি সহজে দেখতে পারি?
কখনও কখনও আমি আমার কোডটির একটি ব্রেকপয়েন্টে থাকব এবং আমি কোনও DataTable
ভেরিয়েবলের সামগ্রী (বা একটিতে DataTable
একটি DataSet
) দেখতে চাই। দ্রুত ঘড়ি আপনাকে বিষয়বস্তুগুলির একটি খুব পরিষ্কার দৃষ্টিভঙ্গি দেয় না। এগুলি কীভাবে আমি সহজে দেখতে পারি?
উত্তর:
ভিজ্যুয়াল স্টুডিও ডিবাগারটি চারটি মানক ভিজ্যুয়ালাইজার সহ আসে। এগুলি হ'ল পাঠ্য, এইচটিএমএল এবং এক্সএমএল ভিজ্যুয়ালাইজার, এগুলি সমস্তই স্ট্রিং অবজেক্টগুলিতে কাজ করে এবং ডেটাসেট ভিজ্যুয়ালাইজার, যা ডেটাসেট, ডেটাভিউ এবং ডেটা টেবিল অবজেক্টগুলির জন্য কাজ করে।
এটি ব্যবহার করতে, আপনার কোডস, আপনার ডেটাসেটের উপর দিয়ে মাউস ভাঙ্গুন, দ্রুত ঘড়িটি প্রসারিত করুন, টেবিলগুলি দেখুন, প্রসারিত করুন, তারপরে সারণী দেখুন [0] (উদাহরণস্বরূপ)। দ্রুত ঘড়িতে আপনি {টেবিল 1 like এর মতো কিছু দেখতে পাবেন তবে লক্ষ্য করুন যে এখানে একটি ম্যাগনিফাইং গ্লাসের আইকনও রয়েছে । আইকনে ক্লিক করুন এবং আপনার ডেটা টেবিল একটি গ্রিড ভিউতে খুলবে।
অ্যাডিনাসের ডিবাগার আউটপুট সুন্দরী করতে আমি কয়েকটি সাধারণ বিন্যাস তৈরি করেছি:
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);
}
এই সমাধানের সেরা: আপনার ভিজ্যুয়াল স্টুডিওর দরকার নেই ! এখানে আমার উদাহরণ আউটপুট:
প্যাককুর্জ, প্যাকনাম, প্যাকজিউইচ থেকে ফর্ম ভারপ্যাকুঞ্জেন নির্বাচন করুন প্যাককুর্জ | প্যাকনাম | প্যাকজিচ | --------------------- | ---------------------- | ----- ----------------- | - বিবি 205 | বিগ ব্যাগ 205 কেজি | 205 | বিবি 300 | বিগ ব্যাগ 300 কেজি | 300 | বিবি 365 | বিগব্যাগ 365 কেজি | 365 | সিও | ধারক, আল্টেরু ... | | ইপি | প্যালেট | | আইবিসি | চেমিকালিঙ্গেফে ... | | হারান | নিখট ভারপাখং ... | 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
আমি তখনই তাত্ক্ষণিক উইন্ডোতে উপরের একটি ফাংশন কল করব এবং ফলাফলগুলি সেখানে উপস্থিত হবে। উদাহরণস্বরূপ, যদি আমি কোনও ভেরিয়েবলের 'মায়াড্যাট্যাসেট' এর বিষয়বস্তু দেখতে চাই তবে আমি প্রিন্টটিবিএল (মাইড্যাট্যাসেট) কল করব। প্রবেশের পরে হিট করার পরে ফলাফলগুলি তাত্ক্ষণিক উইন্ডোতে মুদ্রিত হবে
দিন Xml দৃষ্টিগোচরকারী ব্যবহার করে দেখুন। এখনও সর্বশেষতম সংস্করণ চেষ্টা করে দেখিনি, তবে আমি ভিজ্যুয়াল স্টুডিও 2003 এ আগেরটি ছাড়া কাজ করতে পারি না।
শ্রেণিবদ্ধভাবে ডেটাসেট প্রদর্শনের শীর্ষে, আরও অনেকগুলি সুবিধাজনক বৈশিষ্ট্য রয়েছে যেমন আপনি দেখতে চান রাউস্টেটটি ফিল্টারিং এবং নির্বাচন করা।
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
এবং আপনি যদি কোথাও এটি চান ... ডাটা টেবিলের সাহায্যকারী হতে পারেন এটি ধরে নিয়েছে আপনি লগ 4 নেট এ আউটপুট ক্যাপচার করতে চান তবে দুর্দান্ত সূচনা উদাহরণটি আমি কনসোলে কেবল ডাম্পের বিরুদ্ধে কাজ করেছি ... এটির একটি সম্পাদনাযোগ্য কলাম প্রস্থের পরিবর্তনশীল এন ম্যাক্সক্লোলউইথও রয়েছে - শেষ পর্যন্ত আমি যাই হোক না কেন প্রসঙ্গ থেকে এটি পাস করব ...
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) ;
}
আমি নিজে চেষ্টা করে দেখিনি, তবে ভিজ্যুয়াল স্টুডিও 2005 (এবং পরে) ডিবাগার ভিজ্যুয়ালাইজারের ধারণাকে সমর্থন করে। এটি আপনাকে আইডিইতে কীভাবে কোনও বস্তু প্রদর্শিত হয় তা কাস্টমাইজ করতে দেয়। আরও তথ্যের জন্য এই নিবন্ধটি দেখুন।
http://davidhayden.com/blog/dave/archive/2005/12/26/2645.aspx