Imports System.Data.OleDb
Imports System.Linq
Imports System.Data.SqlClient
Imports Microsoft.Office.Core
Imports Excel = Microsoft.Office.Interop.Excel
Imports ExcelAutoFormat = Microsoft.Office.Interop.Excel.XlRangeAutoFormat
Imports Microsoft.Office.Interop
Imports System.IO
Imports System.Xml.XPath
Imports System.Data
Imports System.Xml
Public Class Form1
Dim Conn As New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Application.StartupPath & "\MyData.MDB")
Dim CMD As OleDbCommand
Dim dr As OleDbDataReader
Dim da As OleDbDataAdapter
Dim ds As DataSet
Dim SQL As String
Dim DelByid As String
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Me.CenterToScreen()
'Call LoadInfo()
End Sub
Sub LoadInfo() 'Load Data Show
SQL = "SELECT * FROM Table1"
CMD = New OleDbCommand(SQL, Conn)
Try
If Conn.State = ConnectionState.Open Then Conn.Close()
Conn.Open()
dr = CMD.ExecuteReader
DataGridView1.Rows.Clear()
Dim iD As Integer = 1
While dr.Read
DataGridView1.Rows.Add(iD, dr("XX").ToString, dr("YY").ToString)
iD += 1
End While
Conn.Close()
CMD.Dispose()
Catch ex As Exception
MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error)
End Try
End Sub
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Call LoadInfo()
End Sub
Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
Dim iconn As OleDbConnection
Dim idta As OleDbDataAdapter
Dim idts As DataSet
Dim excel As String
Dim OpenFileDialog As New OpenFileDialog
OpenFileDialog1.FileName = ""
OpenFileDialog1.InitialDirectory = My.Computer.FileSystem.SpecialDirectories.Desktop
OpenFileDialog1.Filter = "All Files (*.*)|*.*|Excel files (*.xlsx)|*.xlsx|CSV Files (*.csv)|*.csv|XLS Files (*.xls)|*xls"
If (OpenFileDialog1.ShowDialog(Me) = System.Windows.Forms.DialogResult.OK) Then
DataGridView2.Columns.Clear()
Dim fi As New FileInfo(OpenFileDialog1.FileName)
Dim FileName As String = OpenFileDialog1.FileName
excel = fi.FullName
iconn = New OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + excel + ";Extended Properties=Excel 12.0;")
idta = New OleDbDataAdapter("Select * From [Sheet1$]", iconn)
idts = New DataSet
idta.Fill(idts, "[Sheet1$]")
DataGridView2.DataSource = idts
DataGridView2.DataMember = "[Sheet1$]"
iconn.Close()
End If
End Sub
Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click
If DataGridView1.Rows.Count > 0 And DataGridView2.Rows.Count > 0 Then
DataGridView3.Rows.Clear()
Dim row As Integer = DataGridView1.Rows.Count
For i As Integer = 0 To row - 1
DataGridView3.Rows.Add(DataGridView1.Rows(i).Cells(0).Value, DataGridView1.Rows(i).Cells(1).Value + DataGridView2.Rows(i).Cells(1).Value, DataGridView1.Rows(i).Cells(2).Value + DataGridView2.Rows(i).Cells(2).Value)
Next
End If
End Sub
Private Sub Button5_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button5.Click
If DataGridView3.Rows.Count = 0 Then
Exit Sub
Else
Call SaveToData()
End If
End Sub
Sub SaveToData()
Try
If Conn.State = ConnectionState.Open Then Conn.Close()
Conn.Open()
Dim i As Integer = 0
For Each row As DataGridViewRow In DataGridView3.Rows
If Not row.IsNewRow Then
SQL = "SELECT * FROM Table1"
CMD = New OleDbCommand(SQL, Conn)
'CMD.CommandText = "UPDATE Table1 SET XX='" & DataGridView3.Rows(i).Cells(1).Value & "',YY='" & DataGridView3.Rows(i).Cells(2).Value
'Error Syntax error in string in query expression
CMD.CommandText = "UPDATE Table1 SET XX=" & DataGridView3.Rows(i).Cells(1).Value & ",YY=" & DataGridView3.Rows(i).Cells(2).Value
CMD.ExecuteNonQuery()
End If
Next
Conn.Close()
CMD.Dispose()
MessageBox.Show("Save All Data", "!!!", MessageBoxButtons.OK, MessageBoxIcon.Information)
Catch ex As Exception
MessageBox.Show(ex.Message, "!!!", MessageBoxButtons.OK, MessageBoxIcon.Error)
End Try
End Sub
End Class
จากภาพ ฐานข้อมูลมี 2 คอลัม 10 แถว ต้องการบันทึกข้อมูล จากตารางที่ 3 ลงฐานข้อมูล หากใช้คำสั่ง UPDATE ตามโค๊ดจะเป็นการเขียนข้อมูลทุกระเบียนเป็น ID ที่ 10 ค่า XX 624 YY 612 เพราะไม่มี Where ID
For Each row As DataGridViewRow In DataGridView3.Rows
ที่จะเช็คแค่ DataGridView3 ลองเปลี่ยนไปใช้
Code (VB.NET)
For i As Integer = 0 To DataGridView3.Rows.Count - 1
'จัดการทั้ง 3 DataGridView ในแถวเดียวกัน
'จะ บวก ลบ แล้ว ค่อย ไปบันทึกลง DataGridView3 ก็ได้ ขอแค่อยู่ใน ID เดียวกัน
Next
Sub SaveToData()
If Conn.State = ConnectionState.Open Then Conn.Close()
Conn.Open()
For i As Integer = 0 To DataGridView3.Rows.Count - 1
SQL = "SELECT * FROM Table1"
CMD = New OleDbCommand(SQL, Conn)
CMD.CommandText = "UPDATE Table1 SET XX=" & DataGridView3.Rows(i).Cells(1).Value & ",YY=" & DataGridView3.Rows(i).Cells(2).Value
CMD.ExecuteNonQuery()
Next
Conn.Close()
CMD.Dispose()
MessageBox.Show("Save All Data", "!!!", MessageBoxButtons.OK, MessageBoxIcon.Information)
End Sub
ลองเปลี่ยนโค๊ดแล้วครับ ผลลัพธ์ หากใช้คำสั่ง UPDATE ตามโค๊ดจะเป็นการเขียนข้อมูลทุกระเบียนเป็น ID ที่ 10 ค่า XX 624 YY 612 เพราะไม่มี Where ID ครับผม ผลลัพธ์ยังเหมือนเดิมนะครับผม
https://www.thaicreate.com/upload/stock/20220706124847.jpg
Sub SaveToData()
If Conn.State = ConnectionState.Open Then Conn.Close()
Conn.Open()
For i As Integer = 0 To DataGridView3.Rows.Count - 1
SQL = "SELECT * FROM Table1"
CMD = New OleDbCommand(SQL, Conn)
'XX = DataGridView1.Rows(i).Cells(1).Value + DataGridView2.Rows(i).Cells(1).Value
'YY = DataGridView1.Rows(i).Cells(2).Value + DataGridView2.Rows(i).Cells(2).Value
'โค้ด ...........................................................
Next
Conn.Close()
CMD.Dispose()
MessageBox.Show("Save All Data", "!!!", MessageBoxButtons.OK, MessageBoxIcon.Information)
End Sub
Sub SaveToData()
If Conn.State = ConnectionState.Open Then Conn.Close()
Conn.Open()
DataGridView3.Rows.Clear()
Dim XX As Integer = 0
Dim YY As Integer = 0
For i As Integer = 0 To DataGridView1.Rows.Count - 1
SQL = "SELECT * FROM Table1"
CMD = New OleDbCommand(SQL, Conn)
'เช็คข้อมูลก่อนว่ามีไม๊ โดย select มาดู
'ถ้าไม่มี ให้ Insert ข้อมูล ถ้ามี ให้ update
'รัน ExecuteNonQuery
CMD.ExecuteNonQuery()
Next
Conn.Close()
CMD.Dispose()
MessageBox.Show("Save All Data", "!!!", MessageBoxButtons.OK, MessageBoxIcon.Information)
'ในกรณีที่ ข้อมูลใน MyData.mdb มีจำนวนคงที่ ไม่จำเป็นต้องเช็ค แต่หาก สามารถเพิ่มข้อมูลได้ จำเป็ยนต้องเช็ค เพื่อ Insert/Update
End Sub