ภาษา C#.net – การแปลงข้อมูลจาก DataReader ให้เป็น DataTable

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

ภาษา c#.net
สร้างไฟล์ webform ขึ้นมาใหม่

สอน c#.net
ทำการสร้าง GridView ขึ้นมา 2 อัน มี ID เป็น gvAuto และ gvManual

 

จากนั้นเราก็เริ่มมาเขียนโค้ดกันเลยครับเริ่มกันที่ 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 listCols = new 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"]สอน c# ผลลัพธ์[/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 เข้าไปก็เป็นอันจบ

เขียนโปรแกรม
เวลา Debug
c#.net
ข้อมูลแบบ Visual ที่เก็บใน DataTable

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

Download Source

Leave a Reply

Your email address will not be published. Required fields are marked *