【问题标题】:Datagridview save changes to Database vb.netDatagridview 将更改保存到数据库 vb.net
【发布时间】:2024-01-10 19:30:01
【问题描述】:

您好,我有一个数据库,我在 vb.net 应用程序中加载到 Datagridview。 它加载正常,但是当我尝试保存日期时它不起作用。 这是代码

    Private myConString As String
Private con As OleDbConnection = New OleDbConnection
Private Dadapter As OleDbDataAdapter
Private DSet As DataSet
Private DSet2 As DataSet
Private ConCMD As OleDb.OleDbCommand

Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
    myConString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=e:\Database31.accdb"
    con.ConnectionString = myConString
    con.Open()
    Dadapter = New OleDbDataAdapter("select * from Table1", con)
    DSet = New DataSet
    Dadapter.Fill(DSet, "Table1")
    DataGridView1.DataSource = DSet.Tables("Table1")
    con.Close()
End Sub


Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    con.Open()
    Dadapter.Update(DSet, "Table1")
    DSet.AcceptChanges()
    con.Close()
End Sub

当传递带有新行的 DataRow 集合时,更新需要有效的 InsertCommand。 我该怎么办?

accessdatabase 3 列,ID 为主键 ID 字段1 字段2

【问题讨论】:

    标签: database vb.net datagridview save


    【解决方案1】:

    所以你必须为你定义一个InsertCommandDataAdapter

    旁注:DSet.AcceptChanges() 行是多余的,因为前一行 Dadapter.Update 将隐式调用 AcceptChanges

    您应该将using-statement 用于任何实现IDisposable 的东西,例如连接。即使出现异常,也会隐式调用Dispose(关闭连接)。

    所以替换:

    con.Open()
    Dadapter.Update(DSet, "Table1")
    DSet.AcceptChanges()
    con.Close()
    

    Using con =  New OleDbConnection(myConString)
        con .Open()
        Dadapter.Update(DSet, "Table1")
    End Using
    

    【讨论】:

    • 谢谢,但是什么是插入命令?!我的数据库只有 3 个字段 ID Field1 Field2..那么我的插入命令应该是什么样子?
    • 编辑了我的答案以提供 OleDbDataAdapter.InsertCommand 的 msdn 链接。有一个 sql INSERT 语句的示例。
    • 太棒了..现在假设我用不同字段的循环填充了数据网格视图 2000 新值..我想保存这个最好的方法是什么?插入应该在循环期间而不是在循环之后?
    • @user1492051:看看这个示例代码,它展示了如何将 DataGridView 绑定到 Access 数据库以及如何选择、更新、删除和插入:dreamincode.net/forums/topic/…
    • 我还会在 .Update 方法之前添加 Dim cb As OleDbCommandBuilder = New OleDbCommandBuilder(Dadapter) 以防止出现此错误:“当传递带有修改行的 DataRow 集合时,更新需要有效的 UpdateCommand”
    【解决方案2】:

    您需要从数据网格中读回数据集

    con.Open()
    DSet = DataGridView1.DataSource  '<<<<<<<<<<<<<<<<<<<<<<<
    Dadapter.Update(DSet, "Table1")
    DSet.AcceptChanges()
    con.Close()
    

    【讨论】:

      【解决方案3】:

      我的4种数据库的VB.NET代码(从DataGridView更新信息到数据库)

      Private Sub sqldb_savedata()
          Dim connectionString As String = "Server='" & sql_server & "';Database='" & sql_database & "';User Id='" & sql_user & "';Password='" & sql_pass & "'"
          Dim sqlCon = New SqlConnection(connectionString)
          If (sqlCon.State = ConnectionState.Closed) Then sqlCon.Open()
          Dim SQLAdapter = New SqlDataAdapter("SELECT * FROM clinics", sqlCon)
          Dim SQLDataSet As New DataSet
          Dim myTable = DataGridViewClinic.DataSource
          Dim cmdbuilder As New SqlCommandBuilder(SQLAdapter)
          SQLAdapter.Update(myTable, "clinics")
          MsgBox("Updated!", MsgBoxStyle.OkOnly, "")
      End Sub
      
      Private Sub mysqldb_savedata()
          Dim connectionString As String = "Server='" & mysql_server & "';Database='" & mysql_database & "';User Id='" & mysql_user & "';Password='" & mysql_pass & "'"
          Dim sqlCon = New MySqlConnection(connectionString)
          If (sqlCon.State = ConnectionState.Closed) Then sqlCon.Open()
          Dim SQLAdapter = New MySqlDataAdapter("SELECT * FROM clinics", sqlCon)
          Dim SQLDataSet As New DataSet
          Dim myTable = DataGridViewClinic.DataSource
          Dim cmdbuilder As New MySqlCommandBuilder(SQLAdapter)
          SQLAdapter.Update(myTable, "clinics")
          MsgBox("Updated!", MsgBoxStyle.OkOnly, "")
      End Sub
      
      Private Sub firebirddb_savedata()
          Dim connectionString As String = "Database='" & firebird_server & "';User=SYSDBA;Password=masterkey;Dialect=3;ServerType=1"
          Dim sqlCon = New FirebirdSql.Data.FirebirdClient.FbConnection(connectionString)
          If (sqlCon.State = ConnectionState.Closed) Then sqlCon.Open()
          Dim SQLAdapter = New FirebirdSql.Data.FirebirdClient.FbDataAdapter("SELECT * FROM clinics", sqlCon)
          Dim SQLDataSet As New DataSet
          Dim myTable = DataGridViewClinic.DataSource
          Dim cmdbuilder As New FirebirdClient.FbCommandBuilder(SQLAdapter)
          SQLAdapter.Update(myTable, "clinics")
          MsgBox("Updated!", MsgBoxStyle.OkOnly, "")
      End Sub
      
       Private Sub localdb_savedata()
          DBconn = New SqlCeConnection("Data Source=Data Source=|DataDirectory|\Database.sdf")
          If (DBconn.State = ConnectionState.Closed) Then DBconn.Open()
          Dim SQLAdapter = New SqlCeDataAdapter("SELECT * FROM clinics", DBconn)
          Dim SQLDataSet As New DataSet
          Dim myTable = DataGridViewClinic.DataSource
          Dim cmdbuilder As New SqlCeCommandBuilder(SQLAdapter)
          SQLAdapter.Update(myTable, "clinics")
          MsgBox("Updated!", MsgBoxStyle.OkOnly, "")
      End Sub
      

      【讨论】: