Dim update_status = False

Dim tableName = "SF6SETUP"

Dim conn As MySqlConnection = New MySqlConnection(cs)
Dim da As MySqlDataAdapter = New MySqlDataAdapter()
'Dim cmd As MySqlCommand = New MySqlCommand("SELECT * FROM SF6SETUP")
Dim ds As DataSet = New DataSet()

' Open connection as late as possible to get data.
conn.Open()
da.SelectCommand = New MySqlCommand("SELECT * FROM SF6SETUP")
da.SelectCommand.Connection = conn

da.Fill(ds)

' Make a change to some row then update it.
ds.Tables(0).Rows(0).Item("O2AreaCts") = "73333337"
ds.AcceptChanges()

da.Update(ds)

conn.Close()


有人可以帮我弄清楚我在做什么错。我没有错。表中未做任何更改。

为什么?!

最佳答案

AcceptChanges仅更新数据集中的行(在内存中)。它将状态更改为unchanged。如果要将行更新到数据库,请调用TableAdapter's Update方法。此方法将隐式调用AcceptChanges

ds.Tables(0).Rows(0).Item("O2AreaCts") = "73333337"
ds.AcceptChanges()  ' this will prevent the update in the next line '
da.Update(ds) ' this would call AcceptChanges implicitely after the database was updated '


请注意,使用DataAdapter时无需打开/关闭连接。它将在Fill方法中打开/关闭。

除此之外,您还没有像Christopher所提到的那样为DataAdapter提供UpdateCommand。但这将是下一个问题,因为您通常会get an exception when it's missing

您可以使用DataSet.GetChanges获取所有更改的行。我认为这没有任何回报。

编辑:好的,这是一个示例,显示如何提供UpdateCommand(假设您有ID列)

  ' Create the UpdateCommand.
  Dim sql = "UPDATE SF6SETUP SET O2AreaCts=?O2AreaCts WHERE id=?oldId"
  da.UpdateCommand = New MySqlCommand(sql, conn)
  da.UpdateCommand.Parameters.Add("?O2AreaCts", MySqlDbType.VarChar, 50, "O2AreaCts" )
  da.UpdateCommand.Parameters.Add("?oldId", MySqlDbType.VarChar, 50, "id")

10-05 22:14