无法使用datagridview保存和更新mysql数据库 [英] Unable to save and update a mysql database using a datagridview

查看:83
本文介绍了无法使用datagridview保存和更新mysql数据库的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在使用链接到MySQL数据库的winform。我已经更新了我的代码。我的表单有文本框,组合框,复选框和数据网格视图。最终目标是更新,添加新记录并将更改保存回MySQL数据库。 

当我点击datagridview中的一行(比如记录7)然后我更新记录7的数量文本框,然后我点击更新按钮,它会抛出一条异常消息: -





抛出异常'  system.invalidoperationexception'(SelectCommand属性尚未初始化 





我的vba.net代码是:Private Sub Form1_Shown(sender As Object,e As EventArgs)Handles MyBase.Shown 
daOrders = New MySqlDataAdapter(SELECT * FROM Orders,MysqlConn)
daOrders.MissingSchemaAction = MissingSchemaAction.AddWithKey
Dim dsOrders As New DataSet
dtOrders = New DataTable(Orders)
daOrders.Fill(dtOrders)
dsOrders.Tables。添加(dtOrders)
Dim cbOrders As New MySqlCommandBuilder(daOrders)
daProducts = New MySqlDataAdapter(SELECT * FROM Products,MysqlConn)
dtProducts = New DataTable(Products)
daProducts.Fill(dtProducts)
dsOrders.Tables.Add(dtProducts)
cbOrders = New MySqlCommandBuilder( daProducts)

dtOrders.Columns(MetricID)。AutoIncrement = True
dtProducts.Columns(ProductID)。AutoIncrement = True

dtOrders.Columns( 0).AutoIncrementSeed = dtProducts.Rows.Cast(Of DataRow).Max(Function(dr As DataRow)CInt(dr.Item(0)))+ 1
dtProducts.Columns(0).AutoIncrementStep = 1

dtProducts.Columns(0).AutoIncrementSeed = dtProducts.Rows.Cast(Of DataRow).Max(Function(dr)CInt(dr.Item(0)))+ 1
dtProducts。 Columns(0).AutoIncrementStep = 1

dsOrders.Relations.Add(New DataRelation(relation,dsOrders.Tables(Products)。Columns(ProductID),dsOrders.Tables(订单)。列(ProductID_fk)))

ProductBindingSource = New BindingSource(dsOrders,Produc ts)

CboProductID_fk.DisplayMember =Product
CboProductID_fk.ValueMember =ProductID
CboProductID_fk.DataSource = ProductBindingSource

OrderBindingSource = New BindingSource (ProductBindingSource,relation)

'将Product的外键绑定到组合框的SelectedValue
Me.CboProductID_fk.DataBindings.Add(New System.Windows.Forms.Binding(SelectedValue) ,Me.OrderBindingSource,ProductID_fk,True))

'通过BindingSource将DataTable绑定到UI。
OrderBindingSource.DataSource = dtOrders
Me.OrderBindingNavigator.BindingSource = Me.OrderBindingSource

txtMetricID.DataBindings.Add(Text,Me.OrderBindingSource,MetricID)
txtOrders.DataBindings.Add(Text,Me.OrderBindingSource,Orders)
ChkCheckedStatus.DataBindings.Add(Text,Me.OrderBindingSource,CheckedStatus)
txtOrderQuantity.DataBindings。添加(Text,Me.OrderBindingSource,Quantity)

'将DataGridView绑定到BindingSource
'并从数据库加载数据。

OrderBindingSource.DataSource = OrderDataGridView.Rows
OrderBindingNavigator.BindingSource = OrderBindingSource
Me.OrderDataGridView.DataSource = Me.OrderBindingSource
GetOrderData(select * from Orders)

'而不是为MoveFirst添加事件处理程序,MoveLast,MoveNext,MovePrevious
'选择了这个。无论如何它都会开火
AddHandler BindingNavigatorPositionItem.TextChanged,AddressOf bindingnavigator_Postionchanged


'如果找不到钥匙,position = 1
'你还可以尝试任何其他正确的事件
OrderBindingSource.Position = OrderBindingSource.Find(MetricID,IIf(txtMetricID.Text =,0,txtMetricID.Text))
End Sub

Private Sub UpdateOrders()
Dim conn As New MySqlConnection
conn.ConnectionString =
server = localhost; Port = 3306; database = database; userid = root; password = password; persistsecurityinfo = True
Dim daOrders As MySqlDataAdapter = New MySqlDataAdapter(SELECT * From Orders,conn)
Dim myBuilder = New MySqlCommandBuilder(daOrders)
conn.Open()
daOrders.Fill( dsOrders,Orders)
daOrders.Update(dsOrders,Orders)
MsgBox(Data Updated,MsgBoxStyle.OkOnly)

使用CboProductID_fk
.DisplayMember =Product
.ValueMember =ProductID
.DataSource = OrderBindingSource
End with


txtOrders.DataBindings.Clear()
ChkCheckedStatus.DataBindings.Clear()
txtOrderQuantity.DataBindings.Clear()

OrderBindingNavigator.BindingSource = OrderBindingSource

With Me
.txtOrders .DataBindings.Add(Text,OrderBindingSource,Orders,True,DataSourceUpdateMode.OnValidation,vbNullString)
.ChkCheckedStatus.DataBindings.Add(CheckState,OrderBindingSource,CheckedStatus,True,DataSourceUpdateMode.OnValidation, CheckState.Unchecked)
.txtOrderQuantity.DataBindings.Add(Text,OrderBindingSource,Quantity,True,DataSourceUpdateMode.OnValidation,vbNullString)
End with

OrderBindingSource.EndEdit ()
daOrders.Update(dtOrders)
End Sub
Private Sub DgvOrders()
con = New MySqlConnection
con.ConnectionString = conString
Dim MySqldaOrders As New MySqlDataAdapter
Dim OrdersBindingSource As New BindingSource
尝试
con。 Open()
Dim queryOrders As String =select * from database.Orders
cmd = New MySqlCommand(queryOrders,con)
MySqldaOrders.Fill(dtOrders)
OrdersBindingSource.DataSource = dtOrders
OrderDataGridView.DataSource = OrderBindingSource
MySqldaOrders.Update(dtOrders)

con.Close()

Catch ex As Exception

结束尝试
结束Sub
Private Sub BtnProductUpdate_Click(sender As Object,e As EventArgs)处理BtnProductUpdate.Click

UpdateOrders()
DgvOrders()


End Sub


Private Sub BtnOrderSave_Click(sender As Object, e As EventArgs)处理BtnOrderSave.Click
Dim dsOrders As New DataSet
Me.Validate()

Me.OrderBindingSource.EndEdit()

Me .daOrders.Update(dsOrders,Orders)

End Sub -



我遇到的另一个问题是如果我添加一条记录,使用绑定导航器新记录控件并填写新记录的详细信息并单击保存按钮,则会出现以下错误消息: -  





 System.InvalidOperationException:' 更新无法找到TableMapping ['Orders']或DataTable'Orders'。' 





我的尝试:



更新update事件中的dataadapters并显示错误。

解决方案

我得到了当我使用这个vb.net代码将文本框数据更新保存回MySQL时,我的问题得到了解决atabase: -



 进口 MySql 
Imports MySql.Data.MySqlClient
Imports MySql.Data

公共 Form1
继承表单

公共 ConnectionString 作为 字符串 =
Dim conString 作为 字符串 = < span class =code-string> Server = localhost; Port = 3306; Database = mydatabase; userid = root; password = mypassword; persist security info = True
Dim con As MySqlConnection = MySqlConnection(conString)


私有 Sub EndEditOnAllBindingSources()
Dim BindingSourcesQuery = From bindingsources In .components.Components
其中( TypeOf bindingsources Windows.Forms.BindingSource)
选择 bindingsources

For 每个 bindingSource As Windows.Forms.BindingSource BindingSourcesQuery
bindingSource.EndEdit()
下一步
结束 Sub


私人 Sub BtnOrderSave_Click(发件人作为 对象,e As EventArgs)句柄 BtnOrderSave.Click

Me .EndEditOnAllBindingSources()

SaveOrders()

结束 Sub

私有 Sub SaveOrders(可选消息作为 布尔 = True

con = MySqlConnection
con .ConnectionString = conString
Dim daOrders As MySqlDataAdapter( select * from Orders,con)
Dim dsOrders As DataSet

如果 .Validate 那么
Me .OrderBindingSource.EndEdit()
Me .daOrders.Update( .dtOrders)
dsOrders.EnforceConstraints = False
其他
System.Windows.Forms.MessageBox.Show( Me 验证_
发生错误。

保存,System.Windows.Forms.MessageBoxButtons.OK,
System.Windows.Forms.MessageBoxIcon.Warning)
结束 如果

尝试
dsOrders.EnforceConstraints = True
Catch e 作为系统。 Data.ConstraintException
' 处理异常并返回。
Console.WriteLine(< span class =code-string> 类型{0}的异常发生。
e。 GetType ()。ToString())
结束 尝试


结束 Sub


私人 < span class =code-keyword> Sub BtnOrderSave_Click(sender As Object ,e < span class =code-keyword> As EventArgs)句柄 BtnOrderSave.Click

.EndEditOnAllBindingSources()

SaveOrders()
结束 Sub

私有 Sub SaveOrders(可选消息作为 布尔 = True

con = MySqlConnection
con.ConnectionString = conString
Dim daOrders 作为 MySqlDataAdapter( select * from Orders,con)
Dim dsOrders As DataSet

如果 .Validate 然后
.OrderBindingSource.EndEdit()
Me .daOrders.Update( Me .dtOrders)
dsOrders.EnforceConstraints = 错误
其他
System.Windows.Forms .MessageBox.Show( Me 验证_ $ b发生了$ b错误。
保存,System.Windows .Forms.MessageBoxButtons.OK,
System.Windows.Forms.MessageBoxIcon.Warning)
结束 如果

尝试
dsOrders.EnforceConstraints = True
Catch e As System.Data.ConstraintException
' 处理异常并返回。
Console.WriteLine( 类型{0}的异常发生ed。
e。 GetType ()。ToString())
结束 尝试


结束 Sub
结束


I am using a winform which is linked to a MySQL database. I have updated my code. My form has textboxes, a combobox, a checkbox and a datagridview. The end goal is to update, add new records and save changes back to MySQL database.

When I click on a row in the datagridview (say record 7) and I then make an update the quantity textbox for record 7, and I click the update button, it throws an exception message:-



exception thrown 'system.invalidoperationexception' in system.data.dll (the SelectCommand property has not been initilalize



My vba.net code is: Private Sub Form1_Shown(sender As Object, e As EventArgs) Handles MyBase.Shown
daOrders = New MySqlDataAdapter("SELECT * FROM Orders", MysqlConn)
        daOrders.MissingSchemaAction = MissingSchemaAction.AddWithKey
        Dim dsOrders As New DataSet
        dtOrders = New DataTable("Orders")
        daOrders.Fill(dtOrders)
        dsOrders.Tables.Add(dtOrders)
        Dim cbOrders As New MySqlCommandBuilder(daOrders)
        daProducts = New MySqlDataAdapter("SELECT * FROM Products", MysqlConn)
        dtProducts = New DataTable("Products")
        daProducts.Fill(dtProducts)
        dsOrders.Tables.Add(dtProducts)
        cbOrders = New MySqlCommandBuilder(daProducts)

        dtOrders.Columns("MetricID").AutoIncrement = True
        dtProducts.Columns("ProductID").AutoIncrement = True

        dtOrders.Columns(0).AutoIncrementSeed = dtProducts.Rows.Cast(Of DataRow).Max(Function(dr As DataRow) CInt(dr.Item(0))) + 1
        dtProducts.Columns(0).AutoIncrementStep = 1

        dtProducts.Columns(0).AutoIncrementSeed = dtProducts.Rows.Cast(Of DataRow).Max(Function(dr) CInt(dr.Item(0))) + 1
        dtProducts.Columns(0).AutoIncrementStep = 1

        dsOrders.Relations.Add(New DataRelation("relation", dsOrders.Tables("Products").Columns("ProductID"), dsOrders.Tables("Orders").Columns("ProductID_fk")))

        ProductBindingSource = New BindingSource(dsOrders, "Products")

        CboProductID_fk.DisplayMember = "Product"
        CboProductID_fk.ValueMember = "ProductID"
        CboProductID_fk.DataSource = ProductBindingSource

        OrderBindingSource = New BindingSource(ProductBindingSource, "relation")

        'bind the Product's foreign key to the combobox's "SelectedValue"
        Me.CboProductID_fk.DataBindings.Add(New System.Windows.Forms.Binding("SelectedValue", Me.OrderBindingSource, "ProductID_fk", True))

        'Bind the DataTable to the UI via a BindingSource.
        OrderBindingSource.DataSource = dtOrders
        Me.OrderBindingNavigator.BindingSource = Me.OrderBindingSource

        txtMetricID.DataBindings.Add("Text", Me.OrderBindingSource, "MetricID")
        txtOrders.DataBindings.Add("Text", Me.OrderBindingSource, "Orders")
        ChkCheckedStatus.DataBindings.Add("Text", Me.OrderBindingSource, "CheckedStatus")
        txtOrderQuantity.DataBindings.Add("Text", Me.OrderBindingSource, "Quantity")

        ' Bind the DataGridView to the BindingSource
        ' and load the data from the database.

        OrderBindingSource.DataSource = OrderDataGridView.Rows
        OrderBindingNavigator.BindingSource = OrderBindingSource
        Me.OrderDataGridView.DataSource = Me.OrderBindingSource
        GetOrderData("select * from Orders")

        'instead of adding event handler for MoveFirst,MoveLast,MoveNext,MovePrevious
        'chose this one. it will fire anyway
        AddHandler BindingNavigatorPositionItem.TextChanged, AddressOf bindingnavigator_Postionchanged


  'if it didn't find the key, position = 1
        'you can also try any else proper event
OrderBindingSource.Position = OrderBindingSource.Find("MetricID", IIf(txtMetricID.Text = "", 0, txtMetricID.Text))
End Sub

Private Sub UpdateOrders()
        Dim conn As New MySqlConnection
        conn.ConnectionString =
       "server=localhost;Port=3306;database=database;userid=root;password=password;persistsecurityinfo=True"
        Dim daOrders As MySqlDataAdapter = New MySqlDataAdapter("SELECT * From Orders", conn)
        Dim myBuilder = New MySqlCommandBuilder(daOrders)
        conn.Open()
        daOrders.Fill(dsOrders, "Orders")
        daOrders.Update(dsOrders, "Orders")
        MsgBox("Data Updated", MsgBoxStyle.OkOnly)

        With CboProductID_fk
            .DisplayMember = "Product"
            .ValueMember = "ProductID"
            .DataSource = OrderBindingSource
        End With


        txtOrders.DataBindings.Clear()
        ChkCheckedStatus.DataBindings.Clear()
        txtOrderQuantity.DataBindings.Clear()

        OrderBindingNavigator.BindingSource = OrderBindingSource

        With Me
            .txtOrders.DataBindings.Add("Text", OrderBindingSource, "Orders", True, DataSourceUpdateMode.OnValidation, vbNullString)
            .ChkCheckedStatus.DataBindings.Add("CheckState", OrderBindingSource, "CheckedStatus", True, DataSourceUpdateMode.OnValidation, CheckState.Unchecked)
            .txtOrderQuantity.DataBindings.Add("Text", OrderBindingSource, "Quantity", True, DataSourceUpdateMode.OnValidation, vbNullString)
        End With

        OrderBindingSource.EndEdit()
        daOrders.Update(dtOrders)
End Sub
Private Sub DgvOrders()
        con = New MySqlConnection
        con.ConnectionString = conString
        Dim MySqldaOrders As New MySqlDataAdapter
        Dim OrdersBindingSource As New BindingSource
        Try
            con.Open()
            Dim queryOrders As String = "select * from database.Orders"
            cmd = New MySqlCommand(queryOrders, con)
            MySqldaOrders.Fill(dtOrders)
            OrdersBindingSource.DataSource = dtOrders
            OrderDataGridView.DataSource = OrderBindingSource
            MySqldaOrders.Update(dtOrders)

            con.Close()

        Catch ex As Exception

        End Try
    End Sub
Private Sub BtnProductUpdate_Click(sender As Object, e As EventArgs) Handles BtnProductUpdate.Click

        UpdateOrders()
        DgvOrders()

        
    End Sub


Private Sub BtnOrderSave_Click(sender As Object, e As EventArgs) Handles BtnOrderSave.Click
        Dim dsOrders As New DataSet
        Me.Validate()

        Me.OrderBindingSource.EndEdit()

        Me.daOrders.Update(dsOrders, "Orders")

End Sub-


Another problem which I am experiencing is if I add a record, using the binding navigator new record control and I fill in the details of the new record and click the save button, the following error message occurs: -



System.InvalidOperationException: 'Update unable to find TableMapping['Orders'] or DataTable 'Orders'.'



What I have tried:

updating the dataadapters in the update event and it shows an error.

解决方案

I got my issue resolved when I used this vb.net code to save textbox data updates back to the MySQL database: -

Imports MySql
Imports MySql.Data.MySqlClient
Imports MySql.Data

Public Class Form1
    Inherits Form

   Public ConnectionString As String = ""
    Dim conString As String = "Server=localhost;Port=3306;Database=mydatabase;userid=root;password=mypassword;persist security info=True"
    Dim con As MySqlConnection = New MySqlConnection(conString)


Private Sub EndEditOnAllBindingSources()
        Dim BindingSourcesQuery = From bindingsources In Me.components.Components
                                  Where (TypeOf bindingsources Is Windows.Forms.BindingSource)
                                  Select bindingsources

        For Each bindingSource As Windows.Forms.BindingSource In BindingSourcesQuery
            bindingSource.EndEdit()
        Next
    End Sub


Private Sub BtnOrderSave_Click(sender As Object, e As EventArgs) Handles BtnOrderSave.Click

        Me.EndEditOnAllBindingSources()

        SaveOrders()

    End Sub

    Private Sub SaveOrders(Optional messages As Boolean = True)

        con = New MySqlConnection
        con.ConnectionString = conString
        Dim daOrders As New MySqlDataAdapter("select * from Orders", con)
        Dim dsOrders As New DataSet

        If Me.Validate Then
            Me.OrderBindingSource.EndEdit()
            Me.daOrders.Update(Me.dtOrders)
            dsOrders.EnforceConstraints = False
        Else
            System.Windows.Forms.MessageBox.Show(Me, "Validation _
                                              errors occurred.",
              "Save", System.Windows.Forms.MessageBoxButtons.OK,
              System.Windows.Forms.MessageBoxIcon.Warning)
        End If

        Try
            dsOrders.EnforceConstraints = True
        Catch e As System.Data.ConstraintException
            ' Process exception and return.
            Console.WriteLine("Exception of type {0} occurred.",
            e.GetType().ToString())
        End Try


    End Sub


Private Sub BtnOrderSave_Click(sender As Object, e As EventArgs) Handles BtnOrderSave.Click

        Me.EndEditOnAllBindingSources()

       SaveOrders()
  End Sub

    Private Sub SaveOrders(Optional messages As Boolean = True)

        con = New MySqlConnection
        con.ConnectionString = conString
        Dim daOrders As New MySqlDataAdapter("select * from Orders", con)
        Dim dsOrders As New DataSet

        If Me.Validate Then
            Me.OrderBindingSource.EndEdit()
            Me.daOrders.Update(Me.dtOrders)
            dsOrders.EnforceConstraints = False
        Else
            System.Windows.Forms.MessageBox.Show(Me, "Validation _
                                              errors occurred.",
              "Save", System.Windows.Forms.MessageBoxButtons.OK,
              System.Windows.Forms.MessageBoxIcon.Warning)
        End If

        Try
            dsOrders.EnforceConstraints = True
        Catch e As System.Data.ConstraintException
            ' Process exception and return.
            Console.WriteLine("Exception of type {0} occurred.",
            e.GetType().ToString())
        End Try


    End Sub
End Class


这篇关于无法使用datagridview保存和更新mysql数据库的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆