ในบางครั้งในการใช้ข้อมูลจากฐานข้อมูลนั้นเมื่อทำการ query มาแล้วเราก็ต้องการเก็บข้อมูลไว้สักที 1 แล้วนำไปใช้เมื่อต้องการใน .net นั้นมีตัวแปรชนิด 1 ที่ชื่อว่า DataTable ซึ่งมันจะเปรียบเสมือนว่ามีข้อมูลเป็นตารางตามข้อมูลและเงื่อนไขที่เรากำหนดไว้ในตอน query ซึ่งใน .net นั้นจะมีการแปลงแบบอัตโนมัติกับแบบที่เราต้องเขียนคำสั่งในการวนลูปเพื่อแปลง Reader ให้ไปเป็น DataTable เริ่มแรกให้ทำการสร้างไฟล์ webform ขึ้นมาใหม่ก่อนจากนั้นทำการสร้าง GridView ขึ้นมา 2 อันเพื่อที่จะทำการกำหนดข้อมูลใน Grid โดย DataTable ทั้ง 2 แบบ จากนั้นก็ไปในส่วนของ code behind เพื่อทำการสร้างฟังก์ชั่น 2 อันที่มีชื่อว่า ReaderToDataTableAuto และ ReaderToDataTableManual


จากนั้นเราก็เริ่มมาเขียนโค้ดกันเลยครับเริ่มกันที่ method หรือว่า function ที่ชื่อว่า ReaderToDataTableAuto
[sourcecode language=”c#”]
private void ReaderToDataTableAuto()
{
SqlConnection conn = new SqlConnection(@”server=.\sqlexpress;integrated security=true;database=northwind”);
conn.Open();
string sqlString = “SELECT ProductID, ProductName, QuantityPerUnit, UnitPrice FROM Products”;
SqlCommand comm = new SqlCommand(sqlString, conn);
SqlDataReader reader = comm.ExecuteReader();
DataTable dt = new DataTable();
dt.Load(reader);
gvAuto.DataSource = dt;
gvAuto.DataBind();
conn.Close();
}
[/sourcecode]
ต่อจากนั้นก็ ReaderToDataTableManual เมื่อเขียน 2 method เสร็จแล้วก็ให้ทำการเรียกใช้ตอน Page_Load เพื่อทำงานตอนหน้าเพจถูก load นั้นเอง
[sourcecode language=”c#”]
private void ReaderToDataTableManual()
{
SqlConnection conn = new SqlConnection(@”server=.\sqlexpress;integrated security=true;database=northwind”);
conn.Open();
string sqlString = “SELECT ProductID, ProductName, QuantityPerUnit, UnitPrice FROM Products”;
SqlCommand comm = new SqlCommand(sqlString, conn);
SqlDataReader reader = comm.ExecuteReader();
DataTable dtSchema = reader.GetSchemaTable();
DataTable dt = new DataTable();
List
if (dtSchema != null)
{
foreach (DataRow drow in dtSchema.Rows)
{
string columnName = System.Convert.ToString(drow[“ColumnName”]);
DataColumn column = new DataColumn(columnName, (Type)(drow[“DataType”]));
column.Unique = (bool)drow[“IsUnique”];
column.AllowDBNull = (bool)drow[“AllowDBNull”];
column.AutoIncrement = (bool)drow[“IsAutoIncrement”];
listCols.Add(column);
dt.Columns.Add(column);
}
}
// Read rows from DataReader and populate the DataTable
while (reader.Read())
{
DataRow dataRow = dt.NewRow();
for (int i = 0; i < listCols.Count; i++)
{
dataRow[((DataColumn)listCols[i])] = reader[i];
}
dt.Rows.Add(dataRow);
}
gvManual.DataSource = dt;
gvManual.DataBind();
conn.Close();
}
[/sourcecode]
[caption id="attachment_1471" align="alignnone" width="687"] ผลลัพธ์[/caption]
ผลลัพธ์จะเห็นว่า DataTable ทั้ง 2 แบบนั้นถูกกำหนดให้ Grid ทั้ง 2 อันซึ่งนั้นก็ทำให้เห็นว่าการแปลง DataTable นั้นสามารถทำได้ 2 แบบ คือจะให้ตัว c#.net นั้นแปลงเองหรือว่าเราจะเขียนโค้ดวนลูปแปลงก็แล้วแต่ชอบแล้วแต่สะดวกนะครับ เมื่อเราได้ DataTable แล้วมันจะมี property และ filed มากมายให้ใช้งานครับ
[sourcecode language=”c#”]
protected void Page_Load(object sender, EventArgs e)
{
ReaderToDataTableAuto();
ReaderToDataTableManual();
}
[/sourcecode]
และในการแปลงข้อมูลจาก DataReader ไปเป็น DataTable นั้นในการแปลงแบบ Maunal นั้นจะเห็นว่าต้องมีขั้นตอนในการแปลงคือทำการวนลูปเท่ากับจำนาวน column เพื่อทำการเก็บข้อมูลว่าแต่ละ column นั้นชื่ออะไรเมื่อเสร็จแล้วต้องทำการวนลูปอีกครั้งตามจำนวนของแถวข้อมูลนั้นเองซึ่งหากเราแค่ต้องการแปลงข้อมูลเป็น DataTable นั้นวิธีนี้ดูจะยากไปซะหน่อยแต่หากเราต้องการเปลี่ยนแปลงโครงสร้างอะไรบ้างอย่างในข้อมูลตารางนั้นวิธีนี้น่าจะเหมาะสมกว่านะครับ แต่การแปลงแบบ Auto นั้นแค่ใช้คำสั่ง .Load แล้วส่งค่าของ DataReader เข้าไปก็เป็นอันจบ


ตัวแปรแบบ DataTable นั้นเมื่อเรา Debug ในโปรแกรมดูมันสร้างเรียกดูได้ว่าตัวแปรนั้นๆมันเก็บข้อมูลอะไรอยู่บ้างโดยให้เรากดปุ่มแว่นขยายดังรูปด้านบนครับ