Imports System.Data
Imports MySql.Data.MySqlClient
Public Class Form1
Dim StrCon = "Server=127.0.0.1;user id=root;password=1234;Database=convb"
Dim Con As New MySqlConnection(StrCon)
Dim Da As New MySqlDataAdapter
Dim DS As New DataSet
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Sql = "select * from student"
Da.MissingSchemaAction = MissingSchemaAction.AddWithKey
Da.SelectCommand = New MySqlCommand(Sql, Con)
Try
Da.Fill(DS, "std")
GridShow.DataSource = DS.Tables("std")
Obj = Me.BindingContext(DS.Tables("std"))
Call Btn_Status(True)
Call ShowData(Obj.Position)
Catch ex As Exception
MessageBox.Show(ex.Message)
End Try
End Sub
Private Sub BtnSave_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnSave.Click
Dim Cb As New MySqlCommandBuilder(Da)
Dim Dr_Save As DataRow = Nothing
If ChkBtn = "add" Then
Sql = "select * from student where std_id='" & TxtId.Text & "'"
Da.MissingSchemaAction = MissingSchemaAction.AddWithKey
Da.SelectCommand = New MySqlCommand(Sql, Con)
Try
Da.Fill(DS, "chk")
If DS.Tables("chk").Rows.Count > 0 Then
MessageBox.Show("รหัส " & TxtId.Text & " มีอยู่แล้ว", "รหัสซ้ำ")
DS.Tables("chk").Clear() : Exit Sub
End If
Catch ex As Exception
MessageBox.Show(ex.Message)
End Try
Dr_Save = DS.Tables("std").NewRow
With Dr_Save
.BeginEdit()
.Item("std_id") = TxtId.Text
.Item("std_fname") = TxtFName.Text
.Item("std_lname") = TxtLName.Text
.EndEdit()
End With
DS.Tables("std").Rows.Add(Dr_Save)
Da.InsertCommand = Cb.GetInsertCommand
ElseIf ChkBtn = "edit" Then
Dr_Save = DS.Tables("std").Rows.Find(TxtId.Text)
With Dr_Save
.BeginEdit()
.Item("std_fname") = TxtFName.Text
.Item("std_lname") = TxtLName.Text
.EndEdit()
Da.UpdateCommand = Cb.GetUpdateCommand
End With
End If
Da.Update(DS.Tables("std"))
DS.Tables("std").AcceptChanges()
Call Btn_Status(True)
End Sub
ผมใช้ฐานข้อมูลphpmyadminครับจะbugตรง Da.Update(DS.Tables("std")) จะขึ้นข้อความว่าConnection must be valid and open ซึ่งจะเป็นเฉพาะตอนที่เพิ่มแถวข้อมูลใหม่แต่ตอนแก้ไขจะไม่มีปัญหาอะไร
If ChkBtn = "add" Then
Sql = "select * from student where std_id='" & TxtId.Text & "'"
Da.MissingSchemaAction = MissingSchemaAction.AddWithKey
Da.SelectCommand = New MySqlCommand(Sql, Con)
Try
Da.Fill(DS, "chk")
If DS.Tables("chk").Rows.Count > 0 Then
MessageBox.Show("รหัส " & TxtId.Text & " มีอยู่แล้ว", "รหัสซ้ำ")
DS.Tables("chk").Clear() : Exit Sub
End If
Catch ex As Exception
MessageBox.Show(ex.Message)
End Try
Dr_Save = DS.Tables("std").NewRow
With Dr_Save
.BeginEdit()
.Item("std_id") = TxtId.Text
.Item("std_fname") = TxtFName.Text
.Item("std_lname") = TxtLName.Text
.EndEdit()
End With
DS.Tables("std").Rows.Add(Dr_Save)
Da.InsertCommand = Cb.GetInsertCommand
ElseIf ChkBtn = "edit" Then
Dr_Save = DS.Tables("std").Rows.Find(TxtId.Text)
With Dr_Save
.BeginEdit()
.Item("std_fname") = TxtFName.Text
.Item("std_lname") = TxtLName.Text
.EndEdit()
Da.UpdateCommand = Cb.GetUpdateCommand
End With
End If
Da.Update(DS.Tables("std"))
DS.Tables("std").AcceptChanges()
Call Btn_Status(True)
เนื่องจาก คุณไปเรียกใช้ Da ใน If loop แล้วคุณ มา update มันข้างนอก If loop มันเลย error ว่า หา Da ไม่เจอ หรือไม่ได้ Init นั่นเอง
วิธีแก้ คุณต้อง ย้าย
Da.Update(DS.Tables("std"))
DS.Tables("std").AcceptChanges() เข้าไปใน If
หรือ ย้าย
Da.MissingSchemaAction = MissingSchemaAction.AddWithKey
Da.SelectCommand = New MySqlCommand(Sql, Con)
ออกจาก If เอาไปประกาศไว้ ต้นๆ ของ functions
ลองดูให้ครบครับ ผม copy ลวกๆ อาจไม่ครบ
Date :
2010-03-22 11:00:44
By :
numenoy
No. 5
Guest
connection must be valid and open ลบไม่ได้ไม่รู้ไง เดงนี้ขื้นมา
Public data As String = "Server=127.0.0.1;Port=3306;Database= test;Uid=root;Pwd=1234;Convert Zero Datetime=True;"
Public ConnectionDB As New MySqlConnection(data)
''' <summary>
''' เปิด/ปิด การเชื่อมต่อฐานข้อมูล MySQL อัตโนมัติ
''' </summary>
''' <remarks>Call open_connection()</remarks>
Public Sub open_connection()
Try
If ConnectionDB.State = ConnectionState.Open Then ConnectionDB.Close()
ConnectionDB.Open()
Catch ex As Exception
Throw New Exception("การเชื่อมต่อฐานข้อมูลใช้งานไม่ได้ เกิดข้อผิดพลาด : " & ex.Message)
End Try
End Sub
การใช้งาน
Code (VB.NET)
cmd = New MySqlCommand("SELECT prosection_id,prosection_name FROM product_section ORDER BY prosection_name;", ConnectionDB)
Call open_connection() '<<<<<<< เรียกใช้ซับ open_connection() เพื่อเปิดการเชื่อมต่อฐานข้อมูล
Dr = cmd.ExecuteReader
If Dr.HasRows Then
dt = New DataTable
Me.cbbPWgetProSection.DisplayMember = "Name"
Me.cbbPWgetProSection.ValueMember = "ID"
dt.Columns.Add("Name", GetType(String))
dt.Columns.Add("ID", GetType(String))
While Dr.Read
dt.Rows.Add(Dr.Item("prosection_name"), Dr.Item("prosection_id"))
End While
Me.cbbPWgetProSection.DataSource = dt
End If