Tuesday, August 26, 2014

การใช้ C# อ่านฐานข้อมูล MySql แบบเท่ๆ ตอนที่ 1

C#.NET อ่านฐานข้อมูล MySql แบบเท่ๆตอนที่ 1

               โดยปกติแล้วผมเป็นมนุษย์ที่ชี้เกียจมากๆ ไอ่สิ่งที่ขี้เกียจสุดๆ และน่าเบื่อสุดๆในการเขียนโปรแกรมเพื่อให้งานในออฟฟิสทั่วๆไปก็คือไอ้การเขียนเพื่ออ่าน/เพิ่ม/ลบข้อมูลจากฐานข้อมูลนี่แหละ มันเยอะ มันน่าเบื่อ มันง่วง ไอ้ครั้นจะไปใช้ NHibernate ไอ้กระผมก็ขี้เกียจเรียนรู้ ขี้เกียจเขียน XML ฯลฯ ก็เลยเอาเป็นว่าเขียนในแนวทางที่ชอบที่ชอบซะเลยละกัน มันจะออกมาเป็นอะไรก็ไม่รู้นะ

แรกสุดสิ่งที่จำเป็นต้องมีเลยก็คือ MySql.Data.dll ซึ่งอยู่ใน MySql.NET Connector  เค้าอุตส่าห์ทำ ADO.NET driver มาให้แล้วก็ใช้ๆไปเหอะ หาโหลดได้จากเว็บหลักของพี่ท่านได้เลย http://dev.mysql.com/downloads/connector/net/ จัดการลงซะให้เรียบร้อย

ขั้นแรก 

  1. สร้างโปรเจคใหม่ขึ้นมา New project -> C# -> Class Library ตั้งชื่ออะไรก็ได้
  2. ลบไฟล์ class1.cs ทิ้งไป
  3. Add Reference ที่ชื่อ MySql.Data.dll อยู่ที่ไหนงั้นเหรอ ก็ตรงที่ลง MySql.NET Connector ไว้นั่นแหละ
  4. มา 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