วันศุกร์ที่ 3 ตุลาคม พ.ศ. 2551

เรื่องของ Nested Class ใน .Net

ก่อนอื่นต้องทำความรู้จัก Nested Class ก่อนว่าคืออะไร พิจารณา Code ต่อไปนี้
class Container
{
class Nested
{
Nested() {}
}
}
จากตัวอย่าง code ข้างต้นจะเห็นว่าภายใน class Container จะมี class ภายใน ซึ่งเราจะเรียกว่า Nested Class โดยปกติแล้้ว การมองเห็น Nested จะเป็น private แต่เราสามารถเปลี่ยนรูปแบบการมองเห็นเป็นแบบอื่นได้ เช่น public, protected เป็นต้น
สำหรับการอ้างถึง Container Class (class นอก) จาก Nested Class (class ภายใน) สามารถทำได้โดยใช้ constructer ช่วย ดังตัวอย่างต่อไปนี้
public class Container
{
public class Nested
{
private Container m_parent;
public Nested()
{
}
public Nested(Container parent)
{
m_parent = parent;
}
}
}
การอ้างถึง Nested Class จากภายนอกสามารถทำได้โดย
Container.Nested nest = new Container.Nested();

เกร็ดเล็กๆ น้อยๆ ของ XML กับ DataSet ใน .Net

- การอ่าน XML เข้ามาใน DataSet
DataSet ds = new DataSet();
ds.ReadXml("XmlFile.xml");
- เวลาเขียนข้อมูลใน DataSet เป็นไฟล์ XML ใช้คำสั่ง
ds.WriteXML("XmlFile.xml");
- ภายหลังเรียกคำสั่ง ReadXml ถ้ามี table อยู่ก่อนหน้าใน dataset ข้อมูลเก่าจะหาย ดังนั้นหากต้องการอ่านข้อมูลเข้าข้อมูลหลายๆ ตาราง ให้สร้าง DataSet 2 ตัวโดยให้ตัวหนึ่งอ่าน แล้วค่อย copy() table ไปยัง DataSet อีกตัวหนึ่ง
- การใช้คำสั่ง clone() ของ DataTable จะเป็นเพียงการสร้าง Table ใหม่ซึ่งมีโครงสร้างทุกอย่างเหมือน Table ต้นฉบับแต่ไม่ได้คัดลอกข้อมูลภายในมาด้วย
- การใช้คำสั่ง copy () ของ DataTable นั้นคล้ายกับ clone() แต่จะต่างกันตรงที่คำสั่ง copy() จะคัดลอกข้อมูลนั้นมาด้วย
- ชนิดของข้อมูลของ column ที่อยู่ภายใน table ซึ่งได้จากการอ่าน ReadXML จะมีเฉพาะ string เท่านั้น
- ข้อมูลใน XML ที่เขียนลงไฟล์จะมีเพียง Table เดียวเท่านั้นคือ table แรกที่อยู่ใน DataSet (หรือมีค่า index เป็น 0)
- หากต้องการหาข้อมูลที่อยู่ใน DataSet ทำได้สองวิธีคือ 1. ใช้คำสั่ง find และ 2. ใช้คำสั่ง select โดยแต่ละวิธีจะมีรายละเอียดดังนี้
1. หากใช้คำสั่ง find จะต้องทำการกำหนด PrimaryKey ให้กับ Table ที่ต้องการค้นหาข้อมูลก่อน ซึ่งจะต้องกำหนด Keys โดย Keys ที่จะกำหนดนั้นต้องมี DataType เป็น DataColumn[] (Array ของ DataColumn) เมื่อเขียน Code จะมีลักษณะดังนี้
public string GetData(String itemID)
{
DataColumn[] keys = new DataColumn[1];
keys[0] = dataSet1.Tables["TableName"].Columns["ColumnName"];
dataSet1.Tables["TableName"].PrimaryKey = keys;
DataRow findRow = dataSet1.Tables["TableName"].Rows.Find(itemId);
if (findRow != null)
{
return findRow["ItemName"].ToString();
}
else
return "";
}
2. การใช้คำสั่ง select จะมีรูปแบบเหมือนกับการ filter ข้อมูล ผลลัพธ์ที่ได้จะอยู่ในรูป array ของ DataRow (DataRow[]) Code การทำงานมีดังนี้
public string GetData(String itemID)
{
DataRow[] findRow = dataSet1.Tables["TableName"].Select("ColumnName=" + itemID);
if(findRow.Length != 0)
{
return findRow[0]["ColumnName"].ToString();
}
else
{
return null;
}

วันอังคารที่ 30 กันยายน พ.ศ. 2551

วิธีการเข้า web ที่ถูก block ด้วย proxy

คำเตือน การรับส่งข้อมูลผ่าน open proxy อาจจะมีการดัก password ไว้ได้ ดังนั้นหากต้องการใช้หรือจำเป็นต้องใช้งาน open proxy ต้องแน่ใจว่าไม่มีการรับส่งข้อมูลที่มีความสำคัญในขณะรับส่งข้อมูลผ่าน open proxy
จากปัญหาการ block web site บางแห่งจากองค์กรของรัฐ (อย่างไม่เป็นธรรม)  เราสามารถเข้าถึง web ที่ถูก block ได้โดยใช้งานผ่าน proxy server ซึ่งมีบริการฟรีทั่วโลก 
การค้นหา proxy และการติดตั้งมีดังนี้
ขั้นแรก เราต้องหา proxy ที่จะใช้บริการก่อนโดยค้นจาก google ใช้คำค้นดังนี้ free proxy ตัวอย่าง proxy ที่ได้จะมีลักษณะดังนี้ http://www.publicproxyservers.com/page1.html 
ขั้นที่สอง ตรวจสอบว่า proxy นั้นสามารถใช้งานได้หรือไม่ ที่ 
http://www.checker.freeproxy.ru/checker/ โดยใช้ host และ port เช่น ข้อมูลที่ได้จาก google บอกว่า host = 123.123.123.123 port = 80 เราก็กรอกข้อมูลเป็น 123.123.123.123:80
ขั้นที่สาม (สำหรับผู้ใช้ที่มีระบบ LAN หรือผู้ใช้ ADSL ผ่านสาย LAN) ติดตั้ง proxy  โดยเลือก 
1. Control Panel -> Internet Options  (แสดงหน้าต่าง Internet Properties)
2. Connections-> LAN settings (แสดงหน้าต่าง Local Area Network (LAN) Settings)
3. ติ๊กถูกที่ Use a proxy server for your LAN .... 
4. กรอก proxy ที่ตรวจสอบแล้วว่าใช้งานได้ ลงในช่อง Address และ Port แล้วคลิ๊กตอบตกลงสองครั้ง

วันอาทิตย์ที่ 28 กันยายน พ.ศ. 2551

แก้ปัญหา "Unable to convert MySQL date/time value to System.DateTime" ใน .Net

เวลาเราต้องการนำข้อมูลจาก DataAdapter ใส่ลงใน DataSet จะใช้คำสั่ง Fill แต่หากในตารางมีข้อมูลประเภท Datetime และข้อมูลภายในมีค่าเป็น null จะทำให้เกิด Exception 
"Unable to convert MySQL date/time value to System.DateTime"
ปัญหานี้สามารถแก้ไขโดยเพิ่มข้อความ 
Allow Zero Datetime=True
ตัวอย่าง คำสั่งการใช้ MySqlConnection
string conStr = "SERVER=" + hn + ";DATABASE=" + db + ";Port=" + pt + ";UID=" + UID + ";PWD=" + PWD + ";Allow Zero Datetime=true;";
MySqlConnection conn = new MySqlConnection(conStr);