รู้จัก Entity Framework (EF) คืออะไร ใช้ทำอะไร และมีประโยชน์อย่างไรบน .Net Framework |
รู้จัก Entity Framework (EF) คืออะไร ใช้ทำอะไร และมีประโยชน์อย่างไรบน .Net Framework การพัฒนา Application ด้วย .Net Framework เพื่อใช้งานทั่ว ๆ ไป การติดต่อกับ Database ถือเป็นหัวใจหลักในการพัฒนาโปรแกรม รองจากการวางโครงสร้างของ Application และจากประสบการณ์การเขียนโปรแกรมและผ่านโปรเจคมามาหลายตัว ทั้งขนาดเล็กคนเดียว หรือ 2-3 คน หรือทีมเป็น 10 คน ประสบการณ์หนึ่งที่ได้จากการทำงานเป็นทีม คือการไม่มีมาตตรฐานของการเขียน Coding ในแนวคิดว่าสไตล์ใครสไตล์มัน การออกแบบ Class ที่ใช้ในการติดต่อกับ Database ค่อนข้างจะมีความสำคัญมาก ถ้าออกแบบและเขียนไม่ดีตั้งแต่แรกเมื่อโปรแกรมพัฒนาไปได้และเริ่มมีขนาดใหญ่ การทำงานที่ซับซ้อนมากขึ้น หรือเมื่อโปรแกรมเมอร์คนอื่น ๆ มารับช่วงต่อ และขาดความเข้าใจและแนวคิดของคนที่ Design ไว้ตั้งแต่แรก เราจะเห็นการการติดต่อกับ Database ที่เริ่มมั่วเกิดขึ้น การเปิด-ปิดหลายครั้ง เพื่อเขียน SQL Query ให้ได้ตรงกับความต้องการ จะเกิดข้อมูลออกมาใช้งาน ซ้ำ ๆ ไม่มีมาตรฐานว่าต้องเรียกใช้ตอนไหน และ เรียกใช้อย่างไร ในหลายครั้งจะเห็นการสร้าง Method ขึ้นมาใหม่ที่ไม่มีความจำเป็นว่าเขียนแบบนี้มีข้อดีและข้อเสียอย่างไร และจะมีปัญหากับ Performance ในอนาคตเมื่อมี Database ใหญ่ขึ้นหรือผู้ใช้จำนวนมากขึ้นหรือไม่ และยิ่งการออกแบบ Class ของโปรแกรมเมอร์ที่วางโครงของแต่ล่ะคนก็ไม่สามารถนำมาเป็นมาตรฐาน ขาดประสบการณ์ ว่า Pattern ที่ Design นั้นมันจะสามารถทำงานได้อย่างรวดเร็วและมีประสิทธิภาพ สามารถพัฒนาต่อยอดในอนาคต เมื่อมีความต้องการใหม่ ๆ เกิดขึ้น และจะมั่นใจได้ว่าอย่างไรว่าไม่เป็นปัญหาเกี่ยวกับ Performance ของโปรแกรมในอนาคต ซึ่งเคสดังกล่าวที่ได้พูดถึง ผมได้พบเจอมากับตัวเองในโปรเจคหลายตัว ได้เห็นถึงปัญหาการออกแบบที่ค่อนข้างจะไม่มีมาตรฐาน และเป็น Concept เก่าใช้กันไม่ต่ำกว่า 7-8 ปีมาแล้ว
สาเหตุหลักหนึ่ง ของการพัฒนา Application ในทีมส่วนมาก คือ เมื่อเขียนโปรแกรมไปซะพัก จะเกิดปัญหาว่า ใครอยากเขียนอะไรก็เขียน มีการประกาศ Variable , Function ใหม่ ๆ ขึ้มามากมาย ใช้เหตุผลที่ว่าขอให้โปรแกรมมันทำงานได้ก็พอ แต่ Performance ที่ได้ค่อนข้างจะ Drop ลงมาก เช่น ระบบทำงาน Execute ไป 30 วินาที แทนที่การทำงานจริง ๆ น่าจะไม่ควรเกิน 2-3 วินาทีเท่านั้น จะเพิ่มฟังก์ชั่นอื่น ๆ เช่น เกี่ยวกับ Transaction ของโปรแกรม หรือจัดทำ Log กลับต้องรื้อโปรแกรมใหม่เกือบทั้งหมด บางครั้งก็ทำอะไรเพิ่มเติมไม่ได้ เพราะโปรแกรมมีขนาดใหญ่มากเกินจะมาตามแก้ ก็ต้องปล่อยให้มันทำงานแบบผิด ๆ ถูก ๆ แล้วค่อยมาทำการเขียน Query เพื่อซ่อม Data ซึ่งเป็นการแก้ปัญหาที่ปลายเหตุ และเป็นการวาง Logic ที่ทำให้คนมารับช่วงต่อเกิดอาการ งง และ สับสนว่า จะสร้างมันมาเพื่ออะไร??
ปัญหาดังที่กล่าวมานี้ใน .Net Framework ได้มีการออก Library ออกมาหลายตัวเพื่อมาลดปัญหาของการสร้างมาตรฐานในการติดต่อกับ Database อันที่จริงมันมีอยู่หลายตัวมาก แต่ตัวหนึ่งที่น่าสนใจและมากับ .NET Framework ชื่อว่า Entity Framework ทำหน้าที่เป็น Entity Data Model (คลาสสำหรับจัดการกับ Database) วัตถุประสงค์หลัก ๆ ของมันคือ ทำหน้าที่เป็น Data Layer ร่วมกับ ADO.Net ในการที่จะเชื่อมต่อกับ Database และเราจะสั่งให้มันทำงานกับ Table ต่าง ๆ ผ่าน Layer นี้ สำหรับ Concept ของ Entity Framework ออกมาได้ซะพักละหลายปีและหลายเวอร์ชั่นแล้ว และหลายคนก็ได้เลือกใช้ไปแล้วในหลายโปรเจค ซึ่งมันก็มีทั้งข้อดีและข้อเสีย แต่สำหรับผมแล้วใช้มันมา 3-4 โปรคเจคแล้ว และมันก็ค่อนข้างจะทำงานได้เร็วไม่มีปัญหาในเรื่องของ Performance หรือปัญหาในเรื่องของ Design Pattern การพัฒนาต่อยอดในอนาคต และสมาชิก ๆ ในทีมหลายคนก็สามารถเขียนและพัฒนาได้ในรูปแบบที่เดียวกัน ซึ่งสำหรับผมแล้วมันค่อนข้างเยี่ยมและทำงานได้อย่างน่าพอใจ และในบทความเกี่ยวกับ Entity Framework ผมจะพยายามใช้ศัพท์ที่เข้าใจง่าย และ ไม่ซับซ้อน เพราะก่อนจะเขียนบทความนี้ ผมลองหาอ่านจากหลาย ๆ เว็บ แล้วมีแค่ใช้ศัพท์ที่เข้าใจยาก และ อ่านไปก็ค่อนข้างจะมีแต่น้ำ ไม่ค่อยมีเนื้อหาที่สรุปให้สามารถนำไปใช้งานจริงได้
Entity Framework ทำหน้าที่เป็น Layer ตัวกลางในการติดต่อระหว่าง Application กับ Database
Entity Framework คืออะไร ???
คือ Library ที่ทำหน้าที่จัดการ Database ร่วมกับการเขียน Class บนโปรแกรมที่เราจะเขียนขึ้น แนวคิดของ Entity Framework อยู่ในรูปแบบของ Object/Relational Mapping (O/RM) คือ Entity Framework จะสร้าง Layer ทำหน้าที่เป็น Database Model ขึ้นมาเป็น Class ใน Project ที่เรากำลังเขียน โดยจะ Mapping ตัว Class ที่จะสร้างขึ้นใหม่นี้ กับ Table , View และ Stored Procedure จาก Database มาไว้บนโปรเจค ซึ่งต่อไปนี้เราสามารถเรียกใช้มันผ่าน Class ที่อยู่ในโปรเจคได้เลย โดยไม่ต้องไปเขียนคำสั่ง SQL Statement ของ INSERT , UPDATE หรือ DELETE แล้วค่อยส่งไป Execute ที่ Table อีก เรียกได้ว่าต่อไปนี้ คำสั่ง SQL บนโปรเจคแทบจะไม่ต้องเขียนอีกเลย และพวกคำสั่ง DataSet, DataTable, DataReader, ExecuteNonQuery ที่ใช้สำหรับการจัดการกับ Data ก็ไม่จำเป็นอีกต่อไปแล้ว เพราะตัว Entity Framework จะทำหน้าที่แทนเราทั้งหมดและให้เราเรียกใช้งาน Table ต่าง ๆ ผ่าน EntitySet ที่มันสร้างขึ้น ส่วนรูปแบบภาษา Syntax ที่จะใช้เขียนให้ Entity Framework ทำงานแทนคือจะใช้ Syntax ของ LINQ to Entitiesทำงานร่วมกับ Generic ของ List ซึ่งเจ้า LINQ นี้จะมี Syntax ที่แตกต่างกับ SQL Statement พอสมควร แต่สามารถเข้าใจง่ายตามรูปแบบของภาษาเช่น VB.Net หรือ C# และก็ไม่ยากที่จะเข้าใจมันได้
Entity Framework จะสร้างจำลอง Model Entities ซึ่งจะจำลองชื่อ EntitySet ให้เหมือนกับชื่อของ Table และ View
Model Entities คืออะไร ?? เป็น Object ใหญ่สุดของ Entity Framework ซึ่งเปรียบเสมือน Class หลักที่รวบรวม EntitySet หรือ Table,View,Stored Procedure มาไว้รวมกัน เราสามารถเพิ่มคุณสมบัติต่าง ๆ ของ EntitySet ได้ เช่น Relation , Data Type หรืออื่น ๆ ภายในหนึ่ง โปรเจคสามารถมีได้หลาย Model Entities และการเรียกใช้งานก็จะเรียกได้มากกว่าหนึ่ง Entities ให้ทำงานพร้อม ๆ กันได้
EntitySet, ObjectSet, DbSet คืออะไร ?? เป็น Object ย่อยของแต่ล่ะ Model Entities ประกอบด้วย Table,View,Stored Procedure เป็น Method ย่อย ๆ ซึ่งเปรียบเสมือน Table และ EntitySet นี้จะคอยทำหน้าที่แลกเปลี่ยนข้อมูลระหว่าง Database กับ Application ที่เราสั่งให้ทำงาน
การเรียกใช้งาน Model Entities
ในการเรียกใช้งาน Database ทั่ว ๆ ไป เราจะต้องทำการกำหนด Connection String พร้อมกับ Open Connection จากนั่นจะสร้าง Command ให้มัน SELECT, INSERT, UPDATE หรือ DELETE ผ่าน Command ของ ADO.Net แต่ถ้าเราเขียนบน Entity Framework เราแทบจะไม่ต้องสนใจคำสั่งพวกนี้เลย เพราะในการเริ่มต้นใช้งาน เราจะเริ่มด้วยการ New Entities หรือเรียกใช้งาน Class ของ Entities มันจะเริ่มทำงานให้เราอัตโนมัติ ซึ่งหลังจากนั้นเราสามารถทำการ Select รายการข้อมูลจาก Table ต่าง ๆ ได้ทันที
เปรียบเทียบ ADO.Net แบบปกติ กับ Entity Framework
ADO.Net แบบปกติ
(C#)
String strConnString = "Server=localhost;UID=sa;PASSWORD=;database=mydatabase;Max Pool Size=400;Connect Timeout=600;";
SqlConnection objConn = new System.Data.SqlClient.SqlConnection(strConnString);
objConn.Open();
String strSQL = "SELECT * FROM customer";
SqlDataReader dtReader;
objCmd = new System.Data.SqlClient.SqlCommand(strSQL, objConn);
dtReader = objCmd.ExecuteReader();
objConn.Close();
objConn = null;
(VB.Net)
Dim strConnString As [String] = "Server=localhost;UID=sa;PASSWORD=;database=mydatabase;Max Pool Size=400;Connect Timeout=600;"
Dim objConn As SqlConnection = New System.Data.SqlClient.SqlConnection(strConnString)
objConn.Open()
Dim strSQL As [String] = "SELECT * FROM customer"
Dim dtReader As SqlDataReader
objCmd = New System.Data.SqlClient.SqlCommand(strSQL, objConn)
dtReader = objCmd.ExecuteReader()
objConn.Close()
objConn = Nothing
ADO.Net ด้วย Entity Framework
(C#)
using (var db = new myDatabaseEntities())
{
var ds = db.CUSTOMER.ToList();
}
(VB.Net)
Using db = New myDatabaseEntities()
Dim ds = db.CUSTOMER.ToList()
End Using
Example Syntax การ SELECT
SQL Statement การ SELECT ด้วย Query
SELECT * FROM CUSTOMER ORDER BY CUSTOMER_ID ASC
Syntax Entity Framework ด้วย LINQ (C#)
var ds = db.CUSTOMER.OrderBy(o => (o.CUSTOMER_ID)).ToList();
Syntax Entity Framework ด้วย LINQ (VB.Net)
Dim ds = db.CUSTOMER.OrderBy(Function(o) (o.CUSTOMER_ID)).ToList()
Example Syntax การ INSERT
SQL Statement การ INSERT ด้วย Query
INSERT INTO CUSTOMER (CUSTOMER_ID,NAME,EMAIL,COUNTRY_CODE,BUDGET)
VALUES ('C005','Rut Wisarut','[email protected]','TH',5000000,0)
Syntax Entity Framework ด้วย LINQ (C#)
db.CUSTOMER.Add(new CUSTOMER()
{
CUSTOMER_ID = "C005",
NAME = "Rut Wisarut",
EMAIL = "[email protected]",
COUNTRY_CODE = "TH",
BUDGET = 5000000,
USED = 0,
});
Syntax Entity Framework ด้วย LINQ (VB.Net)
db.CUSTOMER.Add(New CUSTOMER() With { _
.CUSTOMER_ID = "C005", _
.NAME = "Rut Wisarut", _
.EMAIL = "[email protected]", _
.COUNTRY_CODE = "TH", _
.BUDGET = 5000000, _
.USED = 0 _
})
Example Syntax การ UPDATE
SQL Statement การ UPDATE ด้วย Query
UPDATE CUSTOMER SET BUDGET = 6000000,USED = 100000 WHERE o.CUSTOMER_ID = C005
Syntax Entity Framework ด้วย LINQ (C#)
var update = db.CUSTOMER.Where(o => (o.CUSTOMER_ID == "C005")).FirstOrDefault();
if (update != null)
{
update.BUDGET = 6000000;
update.USED = 100000;
}
Syntax Entity Framework ด้วย LINQ (VB.Net)
Dim update = db.CUSTOMER.Where(Function(o) (o.CUSTOMER_ID = "C005")).FirstOrDefault()
If Not IsNothing(update) Then
update.BUDGET = 6000000
update.USED = 100000
End If
Example Syntax การ DELETE
SQL Statement การ DELETE ด้วย Query
DELETE FROM CUSTOMER WHERE CUSTOMER_ID = 'C005'
Syntax Entity Framework ด้วย LINQ (C#)
var del = db.CUSTOMER.Where(o => (o.CUSTOMER_ID == "C005")).FirstOrDefault();
if (del != null)
{
db.CUSTOMER.Remove(del);
}
Syntax Entity Framework ด้วย LINQ (VB.Net)
Dim del = db.CUSTOMER.Where(Function(o) (o.CUSTOMER_ID = "C005")).FirstOrDefault()
If Not IsNothing(del) Then
db.CUSTOMER.Remove(del)
End If
Entity Framework ยังสามารถในการ Execute คำสั่ง SQL Statement ทั้ง SELECT,INSERT,UPDATE และ DELETE
Entity Framework Execute SQL Statement (C#)
string strSQL = string.Empty;
strSQL = "INSERT INTO CUSTOMER ";
strSQL += " (CUSTOMER_ID,NAME,EMAIL,COUNTRY_CODE,BUDGET,USED)";
strSQL += " VALUES";
strSQL += " ('C005','Rut Wisarut','[email protected]'";
strSQL += ",'TH','5000000','0')";
db.Database.ExecuteSqlCommand(strSQL);
Entity Framework Execute SQL Statement (VB.Net)
Dim strSQL As String = String.Empty
strSQL = "INSERT INTO CUSTOMER "
strSQL = strSQL & " (CUSTOMER_ID,NAME,EMAIL,COUNTRY_CODE,BUDGET,USED)"
strSQL = strSQL & " VALUES"
strSQL = strSQL & " ('C005','Rut Wisarut','[email protected]'"
strSQL = strSQL & ",'TH','5000000','0')"
db.Database.ExecuteSqlCommand(strSQL)
ในการใช้ Entity Framework สามารถอ้างถึง Table และ Attribute Field ใน Table ชนิดของ Data Type ได้อย่างถูกต้อง ไม่มีปัญหาเรื่องชื่อ Table หรือ Field ผิดแน่นอน ลดปัญหาการ Insert ข้อมูลหรือพวก SQL Injection , ค่า Null , DBNull , Data Type ซึ่งเป็นปัญหาเก่า ๆ จะไม่เป็นปัญหาอีกต่อไป ประเด็นสำคัญของ Entity Framework คือ มันค่อนข้างจะให้ความสำคัญของ Key และ Relation ของ Table อย่างมาก โดยเฉพาะ Primary Key ถ้า Project ของเราขาดตัวนี้ ก็แนะนำให้หลีกเลี่ยงการใช้ Entity Framework เพราะจะต้องไปจัดการเพิ่ม Key ใน EntitySet ก่อนที่จะใช้งาน ส่วนประเด็นของ Relation ของ Table อันนี้ไม่จำเป็นต้องใช้ก็ได้ แต่ถ้า Table ของเราทำการภูก Relation ไว้แล้วการใช้ Entity Framework จะมีความมหัสจรรย์ยิ่งขึ้น เช่น เราสามารถดึงข้อมูลของ Table พร้อมทั้งข้อมูลที่ Relation ของ Table ที่เกี่ยวข้องออกมาได้ด้วยการเลือกข้อมูลครั้งเดียว โดยที่ไม่ต้องมาทำการ Join Table แต่อย่างใด ยกตัวอย่างขอมูลของ ลูกค้า กับ รายการสั่งซื้อ เราเพียงแค่ Select ข้อมูลลองลูกค้าตาม รหัสูลูค้า หลังจากนั้นข้อมูลพวก Order ต่าง ๆ จะขึ้นมาให้เราอัโตนมัติ สามารถเรียกใช้ได้ทันที โดยไม่ต้องไป Select เพิ่มอีก และยังมีความสามารถในการทำ Cascade พวก Insert , update และ delete แต่ในทางปฏิบัติแล้วการออกแบบ Table ให้มี Relation ถูกต้องเปะ ๆ แทบจะเป็นไปไม่ได้เลย ฉะนั้นทางเลือกของ Relation Table ผมจะไม่ค่อยให้ความสำคัญเท่าไหร่ เพราะสามาาถไปจัดการได้ที่การ Join ข้อมูลแทน
การเชื่อม Relation ของ Table , View จะช่วยให้การทำงานของ Entity Framework นั้นได้ประสิทธิภาพสูงสุด
Future และ Performance ของ Entity Framework ??
Entity Framework ได้พัฒนามาหลาย Version แล้ว ปัจจุบันอยู่ที่เวอร์ชั่น 6.0 และยังมี Tool ร่วมกับการเขียน .Net Application ใหม่ ๆ หลายตัว เช่น MVC ฉะนั้น Entity Framework จะไม่ถูกทอดทิ้งและ มีอนาคตแน่นอน รวมทั้งมีการพัฒนา Feature และความสามารถใหม่ ๆ ออกพร้อม ๆ กับ Version ของ .Net Framework
Performance ของ Entity Framework
ในความคิดเห็นส่วนตัวของการใช้ Entity Framework ช่วยให้การเขียนโปรแกรมนั้นง่ายและรวดเร็วมาก แต่เรื่อง Performance ของ คิดว่าไม่ได้ทำงานเร็วกว่าออกแบบ Class เองซะเท่าไหร่นัก เพราะสุดท้ายแล้ว Entity Framework ยังคงใช้ ADO.Net ในการทำงานเหมือนเดิม แต่มันจะมีประสิทธิภาพที่เหนือกว่าในด้าน สภาพแวดล้อมที่ Entity Framework ได้สร้างขึ้น ลดความซ้ำซ้อน และการทำงานที่ไม่จำเป็น เมื่อโปรแกรมมีขนาดใหญ่และซับซ้อนมากขึ้น โปรแกรมจึงไม่เกิด Process และการทำงาน ที่ไม่จำเป็น เพราะ Entity Framework ได้สร้างมาตรฐานเอาไว้ ในการเขียนที่ค่อนข้างจะเป็นระบบ เช่น Table จะต้องมี Key และการเขียนมีการ Validate ตัว Data Type ให้ถูกต้องก่อนที่จะ Build ผ่านได้ ซึ่งปัจจัยหลัก ๆ นี้ จะลดข้อผิดพลาดในขณะ Run-time ภาพรวมของโปรแกรมจึงสามมารถทำงานได้อย่างมีประสิทธิภาพและรวดเร็วราบรื่น รวมทั้งยังสามารถพัฒนาต่อยอดได้ง่ายด้วย
ข้อเสียของ Entity Framework
เนื่องจาก Entity Framework ต้องใช้รูปแบบ Syntax ของ LINQ ในการเขียนด้วยภาษาVB.Net หรือ C# ซึ่งในกรณีที่ซับซ้อนมาเกินการเขียนบน Syntax LINQ เพื่อให้ Entities ทำงานได้ตรงกับความต้องการนั้นค่อนข้างจะยากพอสมควร ฉะนั้นหลาย ๆ คำสั่งอาจจะต้องอาศัยการสร้างการเขียน Query บน VIEW Table หรือ Stored Procedure เข้ามาทำงานแทน จะทำงานได้รวดเร็วกกว่าการจัดการที่ Entities
ก่อนอื่นต้องเข้าใจก่อนว่า Entity Framework ไม่ได้เป็น Framework ที่ช่วยในการ Design Pattern วางโครงของ Application ทั้งหมด แต่จะเข้ามาจัดการ Layer ที่เป็น Database Model เท่านั้น และสามารถประยุกต์ใช้กับ Database ได้หลาย ๆ ประเภท ไม่ว่าจะเป็น SQL Server , MySQL, MS Access , Oracle และอื่น ๆ ขึ้นอยู่กับ Driver ที่จะเลือกใช้ ฉะนั้นการที่จะให้ Entity Framework ทำงานได้อย่างมีปสิทธิภาพสูงสุด ต้องอาศัยการออกแบบทั้ง Business Logic ทำงานร่วมกับ Model รวมทั้งการเขียน Code จากการวางโครงที่ดี
Table สำหรับการทดสอบ Entity Framework ในบทความ ให้สร้าง Table หรือตารางขึ้นมาตามโครงสร้างนี้ (SQL Server Database)
Table : CUSTOMER
CREATE TABLE [CUSTOMER](
[CUSTOMER_ID] [varchar](4) NOT NULL,
[NAME] [varchar](50) NULL,
[EMAIL] [varchar](50) NULL,
[COUNTRY_CODE] [varchar](2) NULL,
[BUDGET] [decimal](18, 2) NULL,
[USED] [decimal](18, 2) NULL,
CONSTRAINT [PK_CUSTOMER] PRIMARY KEY CLUSTERED
(
[CUSTOMER_ID] ASC
) ) ON [PRIMARY]
INSERT INTO CUSTOMER VALUES ('C001', 'Win Weerachai', '[email protected]', 'TH', 1000000, 600000);
INSERT INTO CUSTOMER VALUES ('C002', 'John Smith', '[email protected]', 'UK', 2000000, 800000);
INSERT INTO CUSTOMER VALUES ('C003', 'Jame Born', '[email protected]', 'US', 3000000, 600000);
INSERT INTO CUSTOMER VALUES ('C004', 'Chalee Angel', '[email protected]', 'US', 4000000, 100000);
โครงสร้างและข้อมูลของตาราง CUSTOMER
Table : COUNTRY
CREATE TABLE [COUNTRY](
[COUNTRY_CODE] [varchar](2) NOT NULL,
[COUNTRY_NAME] [varchar](100) NULL,
CONSTRAINT [PK_COUNTRY] PRIMARY KEY CLUSTERED
(
[COUNTRY_CODE] ASC
)) ON [PRIMARY]
INSERT INTO COUNTRY VALUES ('TH', 'Thailand ');
INSERT INTO COUNTRY VALUES ('UK', 'United Kingdom');
INSERT INTO COUNTRY VALUES ('US', 'United States');
โครงสร้างและข้อมูลของตาราง COUNTRY
Table : AUDIT
CREATE TABLE [dbo].[AUDIT](
[AUDIT_ID] [int] NOT NULL,
[CUSTOMER_ID] [varchar](4) NULL,
[LOG_DATE] [datetime] NULL,
[USED] [decimal](18, 2) NULL,
CONSTRAINT [PK_AUDIT] PRIMARY KEY CLUSTERED
(
[AUDIT_ID] ASC
)) ON [PRIMARY]
INSERT INTO AUDIT VALUES (1, 'C001', '01-Aug-2015', 100000);
INSERT INTO AUDIT VALUES (2, 'C001', '05-Aug-2015', 200000);
INSERT INTO AUDIT VALUES (3, 'C001', '10-Aug-2015', 300000);
INSERT INTO AUDIT VALUES (4, 'C002', '02-Aug-2015', 400000);
INSERT INTO AUDIT VALUES (5, 'C002', '07-Aug-2015', 100000);
INSERT INTO AUDIT VALUES (6, 'C002', '15-Aug-2015', 300000);
INSERT INTO AUDIT VALUES (7, 'C003', '20-Aug-2015', 400000);
INSERT INTO AUDIT VALUES (8, 'C003', '25-Aug-2015', 200000);
INSERT INTO AUDIT VALUES (9, 'C004', '04-Jul-2015', 100000);
โครงสร้างและข้อมูลของตาราง AUDIT
|
ช่วยกันสนับสนุนรักษาเว็บไซต์ความรู้แห่งนี้ไว้ด้วยการสนับสนุน Source Code 2.0 ของทีมงานไทยครีเอท
|
|
|
By : |
ThaiCreate.Com Team (บทความเป็นลิขสิทธิ์ของเว็บไทยครีเอทห้ามนำเผยแพร่ ณ เว็บไซต์อื่น ๆ) |
|
Score Rating : |
|
|
|
Create/Update Date : |
2015-09-28 22:03:13 /
2017-03-24 23:08:16 |
|
Download : |
No files |
|
Sponsored Links / Related |
|
|
|
|
|