C#.NET อ่านฐานข้อมูล MySql แบบเท่ๆตอนที่ 1
โดยปกติแล้วผมเป็นมนุษย์ที่ชี้เกียจมากๆ ไอ่สิ่งที่ขี้เกียจสุดๆ และน่าเบื่อสุดๆในการเขียนโปรแกรมเพื่อให้งานในออฟฟิสทั่วๆไปก็คือไอ้การเขียนเพื่ออ่าน/เพิ่ม/ลบข้อมูลจากฐานข้อมูลนี่แหละ มันเยอะ มันน่าเบื่อ มันง่วง ไอ้ครั้นจะไปใช้ NHibernate ไอ้กระผมก็ขี้เกียจเรียนรู้ ขี้เกียจเขียน XML ฯลฯ ก็เลยเอาเป็นว่าเขียนในแนวทางที่ชอบที่ชอบซะเลยละกัน มันจะออกมาเป็นอะไรก็ไม่รู้นะ
แรกสุดสิ่งที่จำเป็นต้องมีเลยก็คือ MySql.Data.dll ซึ่งอยู่ใน MySql.NET Connector เค้าอุตส่าห์ทำ ADO.NET driver มาให้แล้วก็ใช้ๆไปเหอะ หาโหลดได้จากเว็บหลักของพี่ท่านได้เลย http://dev.mysql.com/downloads/connector/net/ จัดการลงซะให้เรียบร้อย
ขั้นแรก
ก่อนอื่นเลย ไอ้การต่อฐานข้อมูลเนี่ย ถ้าจะให้เท่ โปรแกรมของเราควรมีเพียงแค่ 1 connection เท่านั้น เพราะการมีการเชื่อมต่อหลายๆอันมันทำให้หนืด หนืดไปถึง server เลยล่ะ ดังนั้นเพื่อให้โปรแกรมของเรามีการเชื่อมต่อเพียงแค่อันเดียวเสมอ เราต้องใช้ Design Pattern แบบ Singleton ครับ
Singleton คืออัลไล?
Singleton ไม่ใช่โครงกระดูกเพราะโครงกระดูกคือ Skeleton ไอ้เจ้า Singleton เนี่ยมันเป็น Design pattern รูปแบบหนึ่งที่จำกัดจำนวนของ object เอาไว้เพียงตัวเดียวและมีค่าเหมือนเดิมตลอดไม่ว่าจะเรียกใช้มันกี่ครั้งก็ตาม ไม่เข้าใจก็ถามอากู๋กันนะครัฟ
หน้าตาของ Singleton จะเป็นแนวๆนี้
เริ่มกันที่ class แรกเลย สร้างคลาสใหม่ชื่อ UniqueDB.cs ละกัน ง่ายดี เราจะทำเป็น sealed class เพราะแราไม่ต้องการให้มี class ใดๆมาทำการ inherit มัน และในที่นี้ผมต้องการให้ตัว singleton นี้ thread safe เพื่อที่ว่าเวลาเขียนโปรแกรมแบบ multithread มันจะได้ไม่มี Instance 2 ตัว เพราะถ้ามีเกิน 1 ตัวมันก็ไม่ใช่ Singleton แล้ว
UniqueDB.cs
ตอนนี้เราก็ได้โครงของ Singleton แล้ว ตอนนี้ไม่ว่าเราจะเรียกใช้มันกี่ครั้ง มันก็จะมีอยู่อันเดียว ส่วนวิธีเรียกใช้ ไม่ใช่การ new มันขึ้นมานะ แต่เรียกใช้แบบนี้
UniqueDB uniqueDB = UniqueDB.Instance;
ต่อไปเราจะมาเริ่มกำหนดการทำงานของ class นี้กัน
ตอนนี้เราทำ class ที่ใช้เชื่อมต่อกับ database เสร็จไปแล้ว ในตอนหน้าเราจะนำมันไปใช้งานกันแบบเท่ๆครับ ถามว่าเท่ตรงไหน อันนี้ผมก็ไม่ทราบครับ เพราะผมเขียนคำว่า เท่ๆ ไปงั้นแหละ
ยังไงช่วงนี้อากาศชุ่มชื้นสุดๆฝนตกพลั่กๆ อาจเป็นหวัดได้ ดูแลสุขภาพกันด้วยนะครับ ตอนที่ 2
ขั้นแรก
- สร้างโปรเจคใหม่ขึ้นมา New project -> C# -> Class Library ตั้งชื่ออะไรก็ได้
- ลบไฟล์ class1.cs ทิ้งไป
- Add Reference ที่ชื่อ MySql.Data.dll อยู่ที่ไหนงั้นเหรอ ก็ตรงที่ลง MySql.NET Connector ไว้นั่นแหละ
- มา code กันเถอะ
ก่อนอื่นเลย ไอ้การต่อฐานข้อมูลเนี่ย ถ้าจะให้เท่ โปรแกรมของเราควรมีเพียงแค่ 1 connection เท่านั้น เพราะการมีการเชื่อมต่อหลายๆอันมันทำให้หนืด หนืดไปถึง server เลยล่ะ ดังนั้นเพื่อให้โปรแกรมของเรามีการเชื่อมต่อเพียงแค่อันเดียวเสมอ เราต้องใช้ Design Pattern แบบ Singleton ครับ
Singleton คืออัลไล?
Singleton ไม่ใช่โครงกระดูกเพราะโครงกระดูกคือ Skeleton ไอ้เจ้า Singleton เนี่ยมันเป็น Design pattern รูปแบบหนึ่งที่จำกัดจำนวนของ object เอาไว้เพียงตัวเดียวและมีค่าเหมือนเดิมตลอดไม่ว่าจะเรียกใช้มันกี่ครั้งก็ตาม ไม่เข้าใจก็ถามอากู๋กันนะครัฟ
หน้าตาของ Singleton จะเป็นแนวๆนี้
sealed class Singleton {
private Singleton() {}
public static readonly Singleton instance = new Singleton();
}
เริ่มกันที่ class แรกเลย สร้างคลาสใหม่ชื่อ UniqueDB.cs ละกัน ง่ายดี เราจะทำเป็น sealed class เพราะแราไม่ต้องการให้มี class ใดๆมาทำการ inherit มัน และในที่นี้ผมต้องการให้ตัว singleton นี้ thread safe เพื่อที่ว่าเวลาเขียนโปรแกรมแบบ multithread มันจะได้ไม่มี Instance 2 ตัว เพราะถ้ามีเกิน 1 ตัวมันก็ไม่ใช่ Singleton แล้ว
UniqueDB.cs
public sealed class UniqueDB
{
#region ตรงนี้เป็น Singleton
//ไอ้ Lazy<T> มีตั้งแต่ .NET 4 ขึ้นไปนะ อยากรู้ว่าคืออะไร ก็ถามอากู๋เบย
private static readonly Lazy<UniqueDB> Lazy =
new Lazy<UniqueDB>(()=>new UniqueDB());
//Static Constructor
static UniqueDB()
{
}
//เอาไว้รับ instance ของ UniqueDB จาก Lazy ข้างบนนั่น
public static UniqueDB Instance
{
get { return Lazy.Value; }
}
#endregion
}
ตอนนี้เราก็ได้โครงของ Singleton แล้ว ตอนนี้ไม่ว่าเราจะเรียกใช้มันกี่ครั้ง มันก็จะมีอยู่อันเดียว ส่วนวิธีเรียกใช้ ไม่ใช่การ new มันขึ้นมานะ แต่เรียกใช้แบบนี้
UniqueDB uniqueDB = UniqueDB.Instance;
ต่อไปเราจะมาเริ่มกำหนดการทำงานของ class นี้กัน
public sealed class UniqueDB
{
#region ตรงนี้เป็น Singleton
...
#endregion
#region การทำงาน
private MySqlConnection _connection;
private string _connectionString;
private string _database,_password,_port,_server, _user;
//Constructor
private UniqueDB()
{
}
//รับค่า Connection จากที่นี่
public MySqlConnection GetConnection()
{
return _connection;
}
//สร้าง Connection แล้ว return ตัวเองออกมาใช้ต่อได้
public UniqueDB SetConnection(string server, string database, string user, string password, string port = null)
{
_server = server;
_database = database;
_user = user;
_password = password;
_port = port;
SetConnectionString();
_connection = new MySqlConnection(_connectionString);
return this;
}
//สร้าง Connection String
private void SetConnectionString()
{
if (_port == null)
{
_connectionString =
String.Format("SERVER={0};user={1};PASSWORD={2};DATABASE={3};Allow Zero Datetime=true;", _server, _user, _password, _database);
}
else
{
_connectionString = String.Format("SERVER={0};port={1};user={2};PASSWORD={3};DATABASE={4};Allow Zero Datetime=true;", _server, _port,_user, _password, _database);
}
}
#endregion
}
ตอนนี้เราทำ class ที่ใช้เชื่อมต่อกับ database เสร็จไปแล้ว ในตอนหน้าเราจะนำมันไปใช้งานกันแบบเท่ๆครับ ถามว่าเท่ตรงไหน อันนี้ผมก็ไม่ทราบครับ เพราะผมเขียนคำว่า เท่ๆ ไปงั้นแหละ
ยังไงช่วงนี้อากาศชุ่มชื้นสุดๆฝนตกพลั่กๆ อาจเป็นหวัดได้ ดูแลสุขภาพกันด้วยนะครับ ตอนที่ 2
No comments:
Post a Comment