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

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

[VB.NET] การโหลดและบันทึกข้อมูลแบบไม่ซ้ำกันระหว่าง ComboBox และระบบฐานข้อมูล MS Access

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

311

กระทู้

502

โพสต์

6050

เครดิต

ผู้ดูแลระบบ

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

Rank: 9Rank: 9Rank: 9

เครดิต
6050


จากโปรเจค แจกฟรีโค้ดโปรแกรมการเก็บบันทึกข้อมูลบุคคล โดยใช้ VB.NET + MS Access 2007+ เรามาดูในส่วนย่อยของการใช้ ComboBox ก็เพื่อเชื่อมความสัมพันธ์กันแบบ One to One ซึ่งโค้ดในบทความนี้จะเป็นต้นฉบับ ก่อนที่จะทำให้มันกลายไปเป็นโปรแกรมย่อย หรือฟังค์ชั่นเพื่อในงานจริง เพราะถ้าหากเราใช้ ComboBox เพียงตัวเดียวก็ไม่มีปัญหา แต่ทีนี้งานมันมีมากกว่า 1 ตัวนี่ซิ ... โดยตัวอย่างนี้จะใช้ตาราง tblPosition หรือแสดงตำแหน่งพนักงาน คำว่า One To One หมายความว่าพนักงาน 1 คน จะมีตำแหน่งได้เพียง 1 ตำแหน่งเท่านั้น (ในทางปฏิบัติจริงอาจจะมีมากกว่า 1 ตำแหน่งได้ แต่ตอนนี้เอาแบบพื้นฐานเบื้องต้นก่อนข่ะรับ) ...

ขออารัมภบทเล็กน้อย ในการออกแบบตารางข้อมูลตาม ทฤษฎีบทของทองก้อน (Thongkorn's Theorem) หากฟิลด์ข้อมูลใดมีค่าที่ซ้ำๆกันในตารางนั้น ให้แยกฟิลด์นั้นออกไปอยู่อีก 1 ตาราง จากนั้นจับมันกลับเข้ามาเชื่อมความสัมพันธ์กันใหม่อีกครั้ง จะปรากฏดังรูป

ที่เรียกว่า ความสัมพันธ์แบบ 1 ต่อ 1 ก็เพราะค่า PositionFK ในตารางหลัก tblContact จะมีความสัมพันธ์กับ PositionPK ในตารางย่อย tblPosition เพียงค่า 1 ค่า เช่น PositionFK และ PositionPK = 14 มันมีค่า PositionName = IT Specialist และค่าตำแหน่งนี้ก็จะมีอยู่ด้วยกัน 2 คน แต่ค่า "IT Specialist" มันจะเก็บค่าเอาไว้เพียง 1 ค่าเท่านั้นในตาราง tblPosition ... การแยกย่อยตารางออกไป ก็เพื่อลดความซ้ำซ้อนของข้อมูล และทำให้ลดขนาดของไฟล์ฐานข้อมูล (DataBase) ลงไปด้วยนั่นเอง ประเด็นที่สำคัญคือ มันเกิดความยืดหยุ่น อำนวยความสะดวกให้กับผู้ใช้งาน แต่ทั้งนี้ทั้งนั้นมันก็ต้องมาพร้อมกับการเขียนโปรแกรมที่ยากขึ้นไปอีกนั่นเอง ...
มาดูโค้ดในส่วนของการโหลดข้อมูลเข้าสู่ ComboBox
  1.     ' / --------------------------------------------------------------------------------
  2.     ' / Load Position data into ComboBox
  3.     Private Sub PopulateComboBox()
  4.         strSQL = "SELECT * FROM tblPosition ORDER BY PositionName "
  5.         '// Initialize ComboBox
  6.         With cmbPositionName
  7.             .DropDownStyle = ComboBoxStyle.DropDown
  8.             .AutoCompleteMode = AutoCompleteMode.Suggest
  9.             .AutoCompleteSource = AutoCompleteSource.ListItems
  10.         End With
  11.         '//
  12.         Try
  13.             If Conn.State = ConnectionState.Closed Then Conn.Open()
  14.             Cmd = New OleDb.OleDbCommand(strSQL, Conn)
  15.             Dim DR As OleDb.OleDbDataReader = Cmd.ExecuteReader
  16.             Dim DT As DataTable = New DataTable
  17.             DT.Load(DR)
  18.             '/ Primary Key = ValueMember
  19.             cmbPositionName.ValueMember = "PositionPK"
  20.             '/ Display with field PositionName
  21.             cmbPositionName.DisplayMember = "PositionName"
  22.             '// Bind data source to control.
  23.             cmbPositionName.DataSource = DT
  24.             DR.Close()

  25.         Catch ex As Exception
  26.             MessageBox.Show(ex.Message)
  27.         End Try
  28.     End Sub
คัดลอกไปที่คลิปบอร์ด

เมื่อเราทำการป้อนค่าเข้าไปยัง ComboBox จากนั้นทำการบันทึก (Save) จะต้องไป ตรวจสอบก่อนว่าค่าที่ป้อนเข้าไปใหม่มันมีอยู่แล้วหรือไม่
  1.     ' / --------------------------------------------------------------------------------
  2.     ' / Check duplicate data, If exist data then return <> 0
  3.     Function CheckDuplicateName() As Integer
  4.         ' Blank, and used TRIM for cut the head and tail spaces.
  5.         If Trim(cmbPositionName.Text) = "" Then Return 1
  6.         strSQL = _
  7.             " SELECT Count(tblPosition.PositionName) AS CountName FROM tblPosition " & _
  8.             " WHERE PositionName = " & "'" & Trim(cmbPositionName.Text) & "'"
  9.         If Conn.State = ConnectionState.Closed Then Conn.Open()
  10.         Cmd = New OleDb.OleDbCommand(strSQL, Conn)
  11.         ' Return count records
  12.         CheckDuplicateName = CInt(Cmd.ExecuteScalar)
  13.     End Function
คัดลอกไปที่คลิปบอร์ด
หากมีค่าซ้ำมันจะรีเทิร์น หรือส่งค่ากลับมากกว่า 1 ก็ให้ข้ามไป หากมีค่าเป็น 0 แสดงว่าค่าที่ป้อนเข้าไปใหม่ยังไม่มี ก็ให้ทำการบันทึกเข้าสู่ตาราง

แต่ก่อนที่จะบันทึกข้อมูล จะต้องทำการหาค่า Primary Key ตัวใหม่ ซ่ะก่อน
  1.     ' / --------------------------------------------------------------------------------
  2.     ' / Populate Primary Key for new Position Name and Return Primary Key.
  3.     Function SetupNewPK() As Long
  4.         strSQL = " SELECT MAX(tblPosition.PositionPK) AS MaxPK FROM tblPosition "
  5.         If Conn.State = ConnectionState.Closed Then Conn.Open()
  6.         Cmd = New OleDb.OleDbCommand(strSQL, Conn)
  7.         '/ Check exist data and return value
  8.         If IsDBNull(Cmd.ExecuteScalar) Then
  9.             SetupNewPK = 1
  10.         Else
  11.             SetupNewPK = CLng(Cmd.ExecuteScalar) + 1
  12.         End If
  13.     End Function
คัดลอกไปที่คลิปบอร์ด

ทำการบันทึกข้อมูลค่าตำแหน่ง (Position) ใหม่
  1.     ' / --------------------------------------------------------------------------------
  2.     ' / Save data from ComboBox into DataBase
  3.     Private Sub SaveData()
  4.         Try
  5.             ' / Create New Primary Key for PositionName
  6.             Dim PK As Integer = SetupNewPK()
  7.             '/ ------------------------------------------------------------------
  8.             If Conn.State = ConnectionState.Closed Then Conn.Open()
  9.             '// Set your query to a variable(strSQL)
  10.             strSQL = "INSERT INTO tblPosition (PositionPK, PositionName) Values (" & PK & ", '" & Trim(cmbPositionName.Text) & "')"
  11.             Dim DA As OleDb.OleDbDataAdapter = New OleDb.OleDbDataAdapter(strSQL, Conn)
  12.             '// Fill and add or refreshes rows in the dataset
  13.             Dim DS As New DataSet
  14.             DA.Fill(DS)
  15.             '// Refresh data in ComboBox
  16.             Dim strPos As String = Trim(cmbPositionName.Text)
  17.             '// Load Data into ComboBox
  18.             Call PopulateComboBox()
  19.             ' Check value and show
  20.             cmbPositionName.Text = strPos
  21.             cmbPositionName.Focus()
  22.         Catch ex As Exception
  23.             MsgBox(ex.Message)
  24.         End Try
  25.     End Sub
คัดลอกไปที่คลิปบอร์ด
Conclusion: นี่คือกระบวนการคิดแบบเป็นขั้นเป็นตอน โดยทำการแยกย่อยงานต่างๆออกมาให้ได้ก่อน จากนั้นทำการเขียนโค้ดและทดสอบว่ามันได้ผลอย่างที่ต้องการหรือไม่ แล้วค่อยตัดต่อไปใช้กับงานจริงต่อไป มันก็จะลดปัญหาเรื่องของข้อผิดพลาดที่เราเรียกกันว่า "Bug" ได้ครับทั่นผู้ชม ... สวัสดี
ดาวน์โหลดโค้ดต้นฉบับ VB.NET (2010) ได้ที่นี่

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

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

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

0

กระทู้

1

โพสต์

91

เครดิต

Member

Rank: 2

เครดิต
91
โพสต์ 2018-7-3 10:37:56 | ดูโพสต์ทั้งหมด

Code อาจารย์เป็น สากล เลยครับ

311

กระทู้

502

โพสต์

6050

เครดิต

ผู้ดูแลระบบ

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

Rank: 9Rank: 9Rank: 9

เครดิต
6050
 เจ้าของ| โพสต์ 2018-7-3 13:35:03 | ดูโพสต์ทั้งหมด

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

0

กระทู้

13

โพสต์

40

เครดิต

Newbie

Rank: 1

เครดิต
40
โพสต์ 2020-4-20 16:33:31 | ดูโพสต์ทั้งหมด

ขอบคุณครับ

0

กระทู้

58

โพสต์

10

เครดิต

Member

Rank: 2

เครดิต
10
โพสต์ 2022-10-25 14:26:53 | ดูโพสต์ทั้งหมด

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

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

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

GMT+7, 2024-4-25 09:01 , Processed in 0.288925 second(s), 12 queries , File On.

Powered by Discuz! X3.4, Rev.62

Copyright © 2001-2020 Tencent Cloud.

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