Friday, July 11, 2008

วิธี ใช้ sqlite 3 ร่วมกับ C#

บทความนี้เหมาะกับ
ผู้เริ่มต้นศึกษาการเขียน c# มาได้สักระยะหนึ่ง
บทความนี้ไม่เหมาะกับ
ผู้เริ่มต้นศึกษาการเขียน c# จริง ๆ แบบไม่รู้อะไรเลย

ปกติแล้วเวลาเราทำเว็บไซต์หรือเขียนโปรแกรมธรรมดาก็ตามก็จะมีฐานข้อมูลให้เลือกใช้มากมาย เช่น oracle, mysql, access etc. ซึ่งมีทั้งฟรีและไม่ฟรีปะปนกันไป แต่ฐานข้อมูลที่มีคนใช้จำนวนมากมายและฟรี ก็เห็นจะเป็น mysql นั่นเอง ซึ่งฐานข้อมูลแบบนี้มีระบบจัดการฐานข้อมูลอยู่ภายใน มีโครงสร้างซับซ้อนหรือที่เรียกในภาษาอังกฤษว่า Database Management System (DBMS) ในการใช้งานสำหรับเว็บไซต์คงจะไม่ค่อยมีปัญหาเพราะว่า host ต่าง ๆ ก็ได้ลงฐานข้อมูล mysql ไว้ให้ใช้เรียบร้อยแล้ว แต่หากจะนำไปใช้กับโปรแกรมบน desktop ทั่วไป ที่อาจเขียนขึ้นด้วยภาษาทั่วไป เช่น java หรือ c#, vb และ c ก็คิดว่าลำบากหน่อย เพราะถ้าโปรแกรมมีขนาดเล็กแต่เครื่อง user ที่นำโปรแกรมเราไปติดไม่มี mysql ติดตั้งอยู่ล่ะก็ โปรแกรมเราก็ต้องอำนวยความสะดวกในการจัดหา mysql รวมเข้าไว้ในตัวติดตั้งของเราด้วย ซึ่งเป็นไปได้ว่าตัวติดตั้งของโปรแกรมเราต้องมีขนาดเพิ่มขึ้นอย่างแน่นอน และหลีกเลี่ยงไม่ได้ถ้าจะไม่นำฐานข้อมูล mysql รวมเข้าไว้ด้วย หากมองอีกแง่หนึ่ง โปรแกรมที่เราพัฒนาต้องทำงานร่วมกับฐานข้อมูลขนาดใหญ่และมีประสิทธิภาพมากพอ เราก็ควรใช้ mysql แต่หากเป็นโปรแกรมเล็ก ๆ ไม่ต้องพะวงถึงเรื่อง time usage ที่ใช้ในการ query ของโปรแกรม หากจะไปใช้ mysql ก็คิดว่าไม่น่าจะเหมาะสมแน่นอน ดังนั้น ในบทความนี้ผมจึงอยากจะพาผู้อ่านทุกท่านรู้จักกับฐานข้อมูลตัวเล็ก ที่ชื่ีอว่า SQLite แค่ชื่อก็บอกแล้วว่า Lite ขนาดเล็ก ใช้งานง่าย พกพาสะดวก (คู่แข่งของ mysql เลยล่ะ)


ตัวฐานข้อมูลของ sqlite เอง ให้เปรียบเสมือนเป็น file เล็ก ๆ ไฟล์หนึ่งที่เราสามารถแนบติดกับโปรแกรมของเราใช้งานได้สะดวก โดยที่เราไม่จำเป็นที่จะต้องติดตั้ง mysql บนคอมพิวเตอร์ของผู้ใช้เลย สะดวกมาก ต่อไปนี้ผมจะมาแนะนำเป็นข้อ ๆ ถึงเหตุผลที่ทำไมถึงจะต้องใช้ SQLite สำหรับ Application ของคุณ

  • SQLite มีการใช้ memory น้อยและเพียงแค่ใช้ library เล็ก ๆ ก็สามารถเข้าถึงฐานข้อมูล นำติดตั้งไปพร้อมกับ application ที่ของคุณที่พัฒนาได้เลยทันที
  • SQLite สามารถนำไปใช้หลาย platform และยังสามารถรันได้ที่ Windows CE และ Palm OS อีกด้วย
  • SQLite มีขนาดเล็ก สามารถนำไปใช้แทนที่ฐานข้อมูลตัวเก่าได้เลย เพราะมันมีคุณสมบัติที่เรียกว่า consistancy(ลงรอยกับรูปแบบการใช้งานแบบเก่า ๆ), แยกเป็นไฟล์เดียวเลยก็ได้, ยืดหยุ่นสำหรับการใช้งาน
  • SQLite สามารถใช้ภาษา SQL สร้างฐานข้อมูลได้ตามปกติ อาจจะมีคำสั่งเฉพาะบ้างเล็กน้อยในการเรียกดูข้อมูลต่าง ๆ ของฐานข้อมูล
  • SQLite ไม่ต้องการ driver พิเศษเลยสำหรับการเข้าถึง DB เช่นพวก ODBC เพียงแค่ include library และ DB file เข้าไปใน application ก็ใช้งานได้แล้ว
  • SQLite สนับสนุนหลายภาษา Native language API สำหรับภาษา C/C++, PHP, Perl, Python, Tcl etc. แต่ก็ยังไม่มี API สำหรับ C# ปรากฎให้ใช้งาน
แต่สำหรับบทความนี้เราจะมาใช้ SQLite ควบคู่กับ SQLite โดยใช้ ADO.NET หรือเป็นพวก Third Party Software สำหรับผู้ที่สนใจ และอ่านมาถึงบรรทัดนี้แล้ว ก็สามารถดาวน์โหลดได้โดยตรงเลย ผมได้ pack เฉพาะสิ่งที่จำเป็นสำหรับ C# ทั้งตัวสร้าง SQLite DB และ Library สำหรับติดต่อ

sqlite C# pack

เมื่อได้ไฟล์ที่จำเป็นสำหรับการเขียนโปรแกรมด้วยภาษา c# แล้ว ต่อไปผมจะแนะนำการสร้างฐานข้อมูลเบื้องต้นนะครับ สำหรับใครที่อยากรู้จักการสร้างฐานข้อมูลแบบลึก ๆ ลองทำตามในเว็บนี้ได้นะครับ

SQLite Tutorial


ก่อนอื่นก็เปิด CMD ขึ้นมาก่อน หรือ Command Dos เข้าไปที่ Start > Run และพิมพ์ว่า cmd และ enter
ใน sqlite C# pack ให้เข้าไป copy folder ที่ชื่ว่า SQLite3 ไปวางไว้ที่ c:/ จะได้ path เป็น C:/SQLite3

กลับมาที่ CMD เช่นเดิม ให้พิมพ์คำสั่ง cd\ เพื่อย้อน path ปัจจุบันให้เป็น c:\> เพราะปกติมันจะไม่ได้อยู่ที่ c:\> หลังจากนั้นให้พิมพ์คำสั่ง cd sq และกด tab มันจะขึ้นตัวเต็ม ๆ มาเป็น cd sqlite และกด enter
เท่านี้ก็เข้าไปสู่หน้าหลักที่มีโปรแกรม SQLite3.exe อยู่แล้ว ให้ทดลองสร้างฐานข้อมูลที่ชื่อว่า friends.db ขึ้นมา โดยพิมพ์คำสั่งต่อไปนี้ sqlite3 friends.db แล้วก็กด enter line ของ cmd ก็จะเปลี่ยนไปเป็น sqlite3> จากบรรทัดต่อไปนี้มันจะเ้ข้าไปสู่ภายใน application ของ sqlite3 แล้ว ให้สร้าง table ได้ตามปกติ
โดยในบทความนี้จะบังคับให้สร้าง table ในฐานข้อมูล friends.db ดังนี้นะครับ

Create table coe (fid integer primary key, firstname text, lastname text);


อาจจะ copy text ข้างต้นไปวางใน cmd ได้เลยนะครับ คลิ๊กขวาและ paste แล้วอย่าลืมกด enter ล่ะ ทีนี้ลองใช้คำสั่ง .tables ก็จะเห็นว่ามีตารางของเราปรากฎขึ้นมาแล้ว
(หมายเหตุ ในตอนใช้คำสั่ง sqlite3 friends.db ครั้งแรก ไฟล์ฐานข้อมูลจะยังไม่ปรากฎ แต่จะปรากฎหลังจากเราสร้าง table เรียบร้อยแล้ว)

ทีนี้ก็ให้ใช้คำสั่ง .q หรือ .quit หรือ .exit เพื่อออกจาก application ได้แล้ว ปิด cmd ทั้งเลย เพราะเราจะไม่ใช้มันอีกแล้ว เราได้ไฟล์ฐานข้อมูลมาแล้วนี่นา ทีนี้ให้ new โปรเจ็ก c# ขึ้นมานะ เป็น c# application ตรงนี้ไม่ขอแนะนำนะครับ คิดว่าผู้ที่สนใจคงจะ new โปรเจ็กกันเป็นอยู่แล้ว ไม่งั้นจะเขียนโปรแกรมได้ไงล่ะเออ

เมื่อ new โปรเจ็ก c# application เรียบร้อยแล้ว ให้ run โปรแกรมครั้งหนึ่งครับ กด short cut key F5 ครับ หลังจากนั้นก็ปิดเลย ต่อมาให้เข้าไปที่ folder bin debug หรือ release แล้วแต่ว่าสร้างกันแบบไหนนะครับ ของโปรเจ็กตัวเอง และก็ copy file "friends.db" เข้าไปวางไว้ใน folder นั้น

ถัดมาให้ไปที่ sqlite C# pack ที่ผมให้ดาวน์โหลดไปกัน ไปเอาไฟล์ SQLite.NET.dll ออกมาไปวางไว้ใน folder project ของเราตรงไหนก็ได้ เอาไว้ไว้ตรง CS file ก็ได้นะครับ ถัดมาให้กลับมาที่ Visual Studio C# เช่นเดิม ให้มองไปทางขวาจะเห็น Tree Views ของ Solution Explorer มองไปหา folder Referrences ใน Tree Views นั่นล่ะ เมื่อพบแล้วให้คลิ๊กขวาและ Add Referrence... เลือก SQLite.NET.dll ที่เรา copy ไปวางไว้นั่นล่ะครับ พอเลือกแล้ว SQLite.NET.dll ก็จะมาอยู่ใน Referrences ของโปรเจ็กของเรา

ถัดมาให้ไปหาไฟล์ SQLite3.dll และ copy มันซะ แล้วเอาไปวางไว้ใน folder bin debug หรือ release ที่เดิมกับที่วาง DB file (friends.db) น่ะ ถัดมาให้กลับไปที่ Visual Studio เพื่อใส่ directive ให้กับ Main Form ของเรา ชื่อว่า ‘Using Finisar.SQLite;’ เท่านี้ก็เป็นอันเสร็จในขั้นตอนการติดตั้ง เราสามารถเขียนโปรแกรมติดต่อกับ ฐานข้อมูล sqlite ได้แล้ว

บางท่านอาจจะว่าหลายขั้นตอนจัง แต่ลองคิดดูนะครับ เราไม่ต้องไปหาพวก Mysql ODBC มาลงเลยนะ ไม่ต้องลง Mysql ไม่ต้องลง MyODBC อีก แค่พกไฟ .db ไปก็ใช้งานได้แล้ว มันเหมือนกับเราพกไฟล์ธรรมดาแนบไปกับโปรแกรมของเรา

เริ่มเขียนโปรแกรมง่าย ๆ กันดีกว่า
ให้ประกาศ property ต่อไปนี้ไปที่หัวของ class นะครับ

private SQLiteConnection sql_con; //ใช้สร้างการเชื่อมต่อ
private SQLiteCommand sql_cmd; //ใช้สร้างคำสั่ง
private SQLiteDataAdapter DB; //ใช้จัดการข้อมูล
private DataSet DS = new DataSet(); //ใช้เก็บข้อมูลเป็น dataset
private DataTable DT = new DataTable(); //ใช้เก็บข้อมูลเป็น datatable

สร้าง ฟังก์ชั่นการเชื่อมต่อขึ้นมา ชื่อว่า SetConnection()
private void SetConnection()
{
sql_con = new SQLiteConnection("Data Source=friends.db;Version=3;New=False;Compress=True;");
}

Connection String ที่ใช้คือ string ข้างล่างนี้นะ
Data Source=friends.db;Version=3;New=False;Compress=True;

สร้างฟังก์ชั่นสำหรับ Execute ใช้สำหรับการส่งคำสั่ง insert,delete ไม่ต้องการ return ผลลัพธ์
private void ExecuteQuery(string txtQuery)
{
sql_con.Open(); //เปิดการเชื่อมต่อ
sql_cmd = sql_con.CreateCommand(); สร้างชุดคำสั่งก่อน
sql_cmd.CommandText = txtQuery; ใส่ query ที่จะทำงานให้กับ commandText
sql_cmd.ExecuteNonQuery(); //execute query
sql_con.Close(); //ปิดการเชื่อมต่อ
}

สร้างฟังก์ชั่นสำหรับโหลดข้อมูลเมื่อ run program ขึ้นมาครั้งแรกให้มันแสดงเลย
private void LoadData()
{
sql_con.Open(); //เปิดการเชื่อมต่อ
sql_cmd = sql_con.CreateCommand(); //สร้างชุดคำสั่งก่อน
string CommandText = "select * from coe"; //กำหนดชุดคำสั่ง
DB = new SQLiteDataAdapter(CommandText, sql_con); //ใช้ตัวจัดการข้อมูลช่วยนำข้อมูลออกมา
DS.Reset(); //หา dataset มีข้อมูลอยู่ก็ให้ reset ก่อนทุกครั้ง
DB.Fill(DS); //นำข้อมูลจากการใช้ตัวจัดการข้อมูลดึงข้อมูลได้มา นำไปใส่ใน Dataset
DT = DS.Tables[0]; //ดึงข้อมูลเป็นตารางออกมาใส่ไว้ใน datatable
dataGridView1.DataSource = DT; //นำข้อมูล datatable เข้าไปใส่ให้กับ dataGridViews
sql_con.Close(); //ปิดการเชื่อมต่อ
}

สร้าง function สำหรับ Add ข้อมูล เพื่อเพิ่มข้อมูลเข้าไป
private void Add()
{
string txtSQLQuery = "insert into coe (firstname,lastname) values ('" + textBox1.Text + "','" + textBox2.Text + "')";
ExecuteQuery(txtSQLQuery);
}

เมื่อฟอร์มโหลดก็ให้มันตั้งค่าฐานข้อมูลที่จะใช้และก็ LoadData() ให้มันแสดงใน DataGridView
private void Form1_Load(object sender, EventArgs e)
{
SetConnection();
LoadData();
}

ทำปุ่มไว้สำหรับ Add Record ส่วนการลบ หรือ edit ก็ลองสร้างดูเองนะ ไ่ม่ยาก
private void button1_Click(object sender, EventArgs e)
{
Add();
LoadData();
}

เกือบลืมบอกไปครับ สำหรับ SQLite นี้ มันไม่ได้เป็นของ Mysql นะครับ มันเป็นคนละส่วนกัน คนละเจ้ากันเลย เกรงว่าพูดไปพูดมาแล้วมันจะทำให้สับสนกัน ^^

สำหรับไฟล์ project สามารถดาวน์โหลดไปดูได้เลย อยู่ข้างล่างนี้

SQLiteTester Source

เว็บไซต์
http://www.sqlite.org/



------------------------------------------------------------

No comments:

ฟรีโฮสต์
โฆษณาออนไลน์,โฆษณา,ออนไลน์,ลงโฆษณา,ประกาศ,online advertising,
online,advertising,โปรโมทสินค้า,โปรโมทเว็บไซต์,promote website,
seo,pay per click,ad per click,media,ค้นหาเว็บ,media,สื่อ
โฆษณาออนไลน์,ออนไลน์,โฆษณา,ลงโฆษณา,ประกาศ,
online advertising,online,advertising,โปรโมทสินค้า,
โปรโมทเว็บไซต์,promote website,seo,pay per click,
ad per click,media,ค้นหาเว็บ,media,สื่อ