ชุมชนคนรักภาษาเบสิค - Visual Basic Community

 ลืมรหัสผ่าน
 ลงทะเบียน
ค้นหา
ดู: 4550|ตอบกลับ: 2

[VB.NET] พื้นฐานการสร้าง Primary Key ขึ้นมาใหม่ โดยไม่ให้ซ้ำกับค่าเดิม

[คัดลอกลิงก์]

309

กระทู้

500

โพสต์

6030

เครดิต

ผู้ดูแลระบบ

ทองก้อน ทับทิมกรอบ

Rank: 9Rank: 9Rank: 9

เครดิต
6030


มาทำความเข้าใจกับ Primary Key และ Identifier
...
Primary Key (PK) หรือกุญแจหลัก เป็นคีย์ที่มีความเป็นเอกลักษณ์โดยเฉพาะ (Unique) โดยต้องไม่ซ้ำกับข้อมูลในรายการแถวอื่นๆ และที่สำคัญอีกอย่างคือ มันจะเปลี่ยนแปลงค่าไม่ได้ เพราะหากเปลี่ยนค่าได้ มันจะมีผลกระทบต่อความสัมพันธ์ในตาราง (Table) อื่นๆ ... ตามตำราโดยทั่วไป เขามักจะนิยมเอา Primary Key (PK) และ Identifier (ID) มาเป็นตัวเดียวกัน ก็เพื่อให้ง่ายต่อการนำมาสอนหรืออธิบาย เช่น รหัสบัตรประชาชน หรือ รหัสประกันสังคม เพราะจากคำนิยามค่าต่างๆเหล่านี้ มันก็มีค่าโดยเฉพาะ ซึ่งจะซ้ำกันไม่ได้อยู่แล้วตามหลักวิชาการ แต่ทว่าในความเป็นจริงนั้น มันจะต้องถูกแยกออกจากกัน โดยที่ ...

- Primary Key หรือ PK ควรจะเป็นตัวเลขแบบชนิดจำนวนเต็ม เพราะคำนวณหาค่าได้ง่าย ซึ่งจะ มีค่าที่ซ้ำกันไม่ได้ และเปลี่ยนแปลงค่าไม่ได้ เพราะค่า Primary Key จะเป็นตัวเชื่อมโยงไปสร้างความสัมพันธ์กับตารางอื่นๆ ซึ่งโปรแกรมเมอร์จะต้องใช้ PK นี้ในการกำหนดและควบคุมการทำงานของโปรแกรม

- IDentifier หรือ ID ค่านี้จะเป็นค่าที่บ่งบอกเอกลักษณ์โดยเฉพาะ (เหมือนกันกับ PK) ซึ่งจะ มีค่าที่ซ้ำกันไม่ได้ แต่สามารถเปลี่ยนแปลงค่าได้ ค่า ID มักจะผสมตัวเลข ตัวอักษร หรือตัวเลขอย่างเดียว เช่น รหัสสินค้า รหัสนักศึกษา ฯลฯ ... โดยค่า ID นี้ Users จะเป็นผู้ใช้งาน ดังนั้นการที่มันต้องสามารถเปลี่ยนค่า ID ได้ หลักๆมาจากข้อมูลอินพุทที่ผิดพลาด หรือเกิด Human Error เองของผู้ใช้งาน ซึ่งเมื่อเกิดการเปลี่ยนแปลงค่า ID ไป จะไม่มีผลกระทบใดๆต่อระบบเลย นั่นก็เพราะว่าค่า Primary Key (PK) ต่างหาก ที่จะเป็นตัวยึดโยงความสัมพันธ์ต่างๆของตารางข้อมูลเอาไว้ ...

บทความนี้เราจะมาว่ากันเรื่อง การสร้าง Primary Key ใหม่ โดยไม่ให้ซ้ำกันกับค่าเดิมเลย แอดมินไม่แนะนำให้ใช้การสร้าง Primary Key ในแบบ Autonumber จากฐานข้อมูล เพราะอาจจะมีปัญหาในการนำไปใช้งานแบบมัลติยูสเซอร์ หรือหากต้องการจะย้ายระบบฐานข้อมูล ก็อาจจะเกิดความยุ่งยากขึ้นได้ ...

สิ่งที่คุณจะได้รู้
...
- การสร้าง Primary Key โดยไม่ให้ซ้ำกัน
- การใช้ฟังค์ชั่นที่แอดมินสร้างขึ้นเอง SetupNewPK หรือ DoSQL ซึ่งฟังค์ชั่นทั้ง 2 ตัวนี้ เป็นการลดความซ้ำซ้อนในปฏิบัติการกับฐานข้อมูล เรียกได้ว่าเขียนครั้งเดียวแต่นำไปใช้ได้เหมือนกันหมดทุกฟอร์ม
- วิธีการลบข้อมูล

ทุกๆโปรเจคเราเริ่มต้นด้วยการค้นคืนข้อมูล หรือ Retrieve (ตัวอย่างนี้ใช้แบบ Bound Data)
  1.     ' / --------------------------------------------------------------------------------
  2.     ' / Data retrieval.
  3.     Private Sub RetrieveData()
  4.         strSQL = "SELECT tblContact.ContactPK, tblContact.Fullname FROM tblContact ORDER BY ContactPK"
  5.         Try
  6.             If Conn.State = ConnectionState.Closed Then Conn.Open()
  7.             Dim Cmd As OleDbCommand = New OleDbCommand(strSQL, Conn)
  8.             Dim Reader As OleDb.OleDbDataReader = Cmd.ExecuteReader
  9.             Dim DT As New DataTable
  10.             DT.Load(Reader)
  11.             dgvData.DataSource = DT
  12.             DT.Dispose()

  13.         Catch ex As Exception
  14.             MessageBox.Show(ex.Message)
  15.         End Try
  16.     End Sub
คัดลอกไปที่คลิปบอร์ด

ฟังค์ชั่นในการสร้างค่า Primary Key (SetupNewPK) ...
  1.     ' / --------------------------------------------------------------------------------
  2.     ' / Function to find and create the new Primary Key not to duplicate.
  3.     Function SetupNewPK(ByVal sql As String) As Long
  4.         If Conn.State = ConnectionState.Closed Then Conn.Open()
  5.         Dim Cmd As New OleDbCommand(sql, Conn)
  6.         '/ Check if the information is available. And return it back
  7.         If IsDBNull(Cmd.ExecuteScalar) Then
  8.             '// Start at 1
  9.             SetupNewPK = 1
  10.         Else
  11.             SetupNewPK = Cmd.ExecuteScalar + 1
  12.         End If
  13.     End Function
คัดลอกไปที่คลิปบอร์ด
เราใช้การหาค่าสูงสุดของ Primary Key ตัวเดิมด้วย MAX(tblContact.ContactPK) AS MaxPK
หาก IsDBNull(Cmd.ExecuteScalar) ไม่มีค่าใดๆอยู่เลย แสดงว่าเป็นตารางข้อมูลว่างเปล่า ก็กำหนดค่าใหม่เป็น 1 แต่ถ้าหากไม่ใช่ก็บวกเพิ่มขึ้น 1

ฟังค์ชั่นในการปฏิบัติการกับฐานข้อมูล (DoSQL) ... ไม่ว่าคุณจะเพิ่ม แก้ไข หรือลบ สามารถใช้ฟังค์ชั่นนี้ได้เลย
  1.     ' / --------------------------------------------------------------------------------
  2.     ' / Function to Execute data. (Add, Edit, Delete) ... Common base in your program.
  3.     Private Function DoSQL(ByVal Sql As String) As Boolean
  4.         Dim Cmd As New OleDbCommand
  5.         If Conn.State = ConnectionState.Closed Then Conn.Open()
  6.         'MsgBox(Sql)
  7.         Try
  8.             Cmd.Connection = Conn
  9.             Cmd.CommandType = CommandType.Text
  10.             Cmd.CommandText = Sql
  11.             Cmd.ExecuteNonQuery()
  12.             Cmd.Dispose()
  13.             Return True
  14.         Catch ex As Exception
  15.             MessageBox.Show("Error Update: " & ex.Message)
  16.             Return False
  17.         End Try
  18.     End Function
คัดลอกไปที่คลิปบอร์ด
แอดมินออกแบบเผื่อเอาไว้ หากบางคนต้องการเช็คความถูกต้องก่อน โดยจะมีการรีเทิร์น หรือคืนค่ากลับแบบ Boolean (True/False)


ส่วนของการเพิ่มข้อมูลเข้าไปใหม่ แอดมินจำลองการทำงานแบบง่ายๆเอาไว้ให้ดูนะครับ ...
  1.     ' / --------------------------------------------------------------------------------
  2.     ' / Add data and find new Primary Key values.
  3.     Private Sub btnAdd_Click(sender As System.Object, e As System.EventArgs) Handles btnAdd.Click
  4.         '// Input Fullname
  5.         Dim Fullname As String
  6.         Fullname = InputBox("Enter Fullname: ", "Sample", "")
  7.         '//
  8.         If Fullname = "" Then
  9.             MessageBox.Show("You must enter a Fullname to continue.")
  10.             Exit Sub
  11.         ElseIf Fullname = "" Then
  12.             Exit Sub
  13.         End If
  14.         '// Add new data into DataGridView.
  15.         Dim dataTable As DataTable = DirectCast(dgvData.DataSource, DataTable)
  16.         Dim DRow As DataRow = dataTable.NewRow()
  17.         '// Populate new Primary Key.
  18.         strSQL = _
  19.             " SELECT MAX(tblContact.ContactPK) AS MaxPK FROM tblContact "
  20.         Dim NewPK As Integer = SetupNewPK(strSQL)
  21.         '//
  22.         DRow("ContactPK") = NewPK
  23.         DRow("Fullname") = Fullname
  24.         dataTable.Rows.Add(DRow)
  25.         dataTable.AcceptChanges()
  26.         dataTable.Dispose()
  27.         '// Save data into DataBase.
  28.         strSQL = _
  29.             " INSERT INTO tblContact(" & _
  30.             " ContactPK, Fullname) " & _
  31.             " VALUES(" & _
  32.             "'" & NewPK & "', " & _
  33.             "'" & Fullname & "'" & _
  34.             ")"
  35.         '// Insert or Update same as operation
  36.         If DoSQL(strSQL) Then
  37.             MessageBox.Show("Records Updated Completed.", "Update Status", MessageBoxButtons.OK, MessageBoxIcon.Information)
  38.         End If
  39.     End Sub
คัดลอกไปที่คลิปบอร์ด
เมื่อเลือกกดปุ่ม Add PK เราก็ต้องป้อนค่า Fullname เข้าไปก่อน หากเลือก Cancel ก็ยกเลิกการทำงาน หากเลือกปุ่ม OK ก็จะนำเอาข้อมูลใหม่ไปต่อท้ายตารางกริดด้วย DataTable เพื่อแสดงผลให้เห็น จากนั้นก็ทำการ INSERT ค่า Primary Key และ Fullname เข้าไปเพื่อทำการทดสอบ


แถมพกกับการสั่งลบข้อมูลจากรายการแถวในตารางกริด ...
  1.     ' / --------------------------------------------------------------------------------
  2.     ' / Delete the item you have selected.
  3.     Private Sub btnDelete_Click(sender As System.Object, e As System.EventArgs) Handles btnDelete.Click
  4.         If dgvData.RowCount = 0 Then Exit Sub
  5.         '// Receive Primary Key value to confirm the deletion.
  6.         Dim iRow As Long = dgvData.Item(0, dgvData.CurrentRow.Index).Value
  7.         '// "" is Null protection, the solution comes from VB6.
  8.         Dim FName As String = "" & dgvData.Item(1, dgvData.CurrentRow.Index).Value
  9.         Dim Result As Byte = MessageBox.Show("Are you sure you want to delete the data?" & vbCrLf & _
  10.                                              "Primary Key = " & iRow & vbCrLf & _
  11.                                              "Fullname: " & FName, "Confirm Deletion", _
  12.                                              MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button2)
  13.         If Result = DialogResult.Yes Then
  14.             '// iRow is the ContactPK or Primary key that is hidden.
  15.             strSQL = " DELETE FROM tblContact WHERE ContactPK = " & iRow
  16.             '// UPDATE RECORD
  17.             DoSQL(strSQL)
  18.             '// Refresh
  19.             Call RetrieveData()
  20.         End If
  21.     End Sub
คัดลอกไปที่คลิปบอร์ด
Conclusion: หลายๆคนอาจจะมองว่าทำไมมันมีความยุ่งยากจังเลย แอดมินขอไม่อธิบายให้ฟังล่ะกันครับ เอาเป็นว่าให้ทุกๆท่านได้ลองนำไปคิด ไปลองลงมือปฏิบัติดูเอาเองกันดีกว่าครับ ... รอบหน้าเราจะมาว่ากันถึงเรื่อง IDentifier สวัสดี
ดาวน์โหลดโค้ดต้นฉบับแบบเต็ม VB.NET (2010) ได้ที่นี่

ขออภัย! โพสต์นี้มีไฟล์แนบหรือรูปภาพที่ไม่ได้รับอนุญาตให้คุณเข้าถึง

คุณจำเป็นต้อง ลงชื่อเข้าใช้ เพื่อดาวน์โหลดหรือดูไฟล์แนบนี้ คุณยังไม่มีบัญชีใช่ไหม? ลงทะเบียน

x
สิ่งที่ดีกว่าการให้ คือการให้แบบไม่มีที่สิ้นสุด

0

กระทู้

58

โพสต์

10

เครดิต

Member

Rank: 2

เครดิต
10
โพสต์ 2022-10-25 18:29:33 | ดูโพสต์ทั้งหมด

ขอบคุณครับ

0

กระทู้

33

โพสต์

372

เครดิต

Full Member

Rank: 3Rank: 3

เครดิต
372
โพสต์ 2022-12-11 21:11:45 | ดูโพสต์ทั้งหมด

ขอบพระคุณคัพ อาจารย์
ขออภัย! คุณไม่ได้รับสิทธิ์ในการดำเนินการในส่วนนี้ กรุณาเลือกอย่างใดอย่างหนึ่ง ลงชื่อเข้าใช้ | ลงทะเบียน

รายละเอียดเครดิต

ข้อความล้วน|อุปกรณ์พกพา|ประวัติการแบน|G2GNet.com  

GMT+7, 2024-4-20 01:46 , Processed in 0.154722 second(s), 4 queries , File On.

Powered by Discuz! X3.4, Rev.62

Copyright © 2001-2020 Tencent Cloud.

ตอบกระทู้ ขึ้นไปด้านบน ไปที่หน้ารายการกระทู้