为什么我的 vb.net 代码没有改变我的 Access2007 数据库
Why does my vb.net code not change my Access2007 database
我有一个 Access 数据库 2007 并尝试使用下面显示的代码编辑内容。
代码无一例外都是运行,但没有改变原来的数据。
该数据库有一个主键 (ID) 以及大约 20 列。
使用相同的数据库并使用 Adapter.Update(ds) 添加新行可以正常工作-(此处未显示)。
现在我已经编写了一个最小的代码来更改特定列 (=4) 中的内容以查看出了什么问题,但是没有显示错误并且数据库没有被更改。我正在为 .exe 应用程序使用 VS 2019。
任何错误的建议and/or如何解决?
/库尔特 J
Private Sub Button2_Click_(sender As Object, e As EventArgs) Handles Button2.Click
'testa att uppdatera databas
cnnTävl = New OleDb.OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data source=" + TPath + AktTävlNamn + "_" + AktTävlDat + ".mdb")
Dim strSQL = "Select * FROM Deltagare WHERE Patrull='12' AND Figur='01'"
Dim cmd As New OleDb.OleDbCommand(strSQL, cnnTävl)
Dim Adapter As New OleDb.OleDbDataAdapter(cmd)
Dim ds As New DataSet
Dim cb As New OleDb.OleDbCommandBuilder(Adapter)
Stop
Try
cnnTävl.Open()
Adapter.Fill(ds)
If ds.Tables(0).Rows.Count = 1 Then
ds.Tables(0).Rows(0).BeginEdit()
ds.Tables(0).Rows(0).Item(4) = "Bo Ek"
Else
MsgBox("No rows to edit")
cnnTävl.Close()
Exit Sub
End If
cb.GetUpdateCommand()
Adapter.Update(ds)
Catch Er As Exception
MsgBox("Er= " + Er.Message)
End Try
cnnTävl.Close()
End Sub
连接和命令使用了需要释放的非托管资源。他们的 Dispose
方法就是这样做的。必须调用Dispose
方法;幸运的是,我们有 Using...End Using
块可以为我们处理这个问题并关闭连接。
您不需要使用DataAdapter 和DataSet 调用所有数据。直接更新就好了
Private Sub Button2_Click_(sender As Object, e As EventArgs) Handles Button2.Click
'testa att uppdatera databas
Dim strSql = "Update Deltagare Set NameOf5thColumn = 'Bo Ek'WHERE Patrull='12' AND Figur='01';"
Dim RecordsEffected As Integer
Using cnnTävl = New OleDb.OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data source=" + TPath + AktTävlNamn + "_" + AktTävlDat + ".mdb"),
cmd As New OleDb.OleDbCommand(strSql, cnnTävl)
Debug.Print(cnnTävl.ConnectionString)
Try
cnnTävl.Open()
RecordsEffected = cmd.ExecuteNonQuery()
Catch Er As Exception
MsgBox("Er= " + Er.Message)
End Try
End Using
If RecordsEffected = 1 Then
MessageBox.Show("Success!")
Else
MessageBox.Show("Failure!")
End If
End Sub
根据:
I've never worked with adapters, but you have a BeginEdit()
without a corresponding EndEdit()
. Adapter.Update(ds)
should return the number of rows affected, so don't ignore that.
EndEdit()
解决了问题。我在网上看到的所有例子都没有使用EndEdit()
,但可能是例子太旧了。
谢谢拉尔斯的帮助。
我有一个 Access 数据库 2007 并尝试使用下面显示的代码编辑内容。 代码无一例外都是运行,但没有改变原来的数据。 该数据库有一个主键 (ID) 以及大约 20 列。 使用相同的数据库并使用 Adapter.Update(ds) 添加新行可以正常工作-(此处未显示)。 现在我已经编写了一个最小的代码来更改特定列 (=4) 中的内容以查看出了什么问题,但是没有显示错误并且数据库没有被更改。我正在为 .exe 应用程序使用 VS 2019。
任何错误的建议and/or如何解决? /库尔特 J
Private Sub Button2_Click_(sender As Object, e As EventArgs) Handles Button2.Click
'testa att uppdatera databas
cnnTävl = New OleDb.OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data source=" + TPath + AktTävlNamn + "_" + AktTävlDat + ".mdb")
Dim strSQL = "Select * FROM Deltagare WHERE Patrull='12' AND Figur='01'"
Dim cmd As New OleDb.OleDbCommand(strSQL, cnnTävl)
Dim Adapter As New OleDb.OleDbDataAdapter(cmd)
Dim ds As New DataSet
Dim cb As New OleDb.OleDbCommandBuilder(Adapter)
Stop
Try
cnnTävl.Open()
Adapter.Fill(ds)
If ds.Tables(0).Rows.Count = 1 Then
ds.Tables(0).Rows(0).BeginEdit()
ds.Tables(0).Rows(0).Item(4) = "Bo Ek"
Else
MsgBox("No rows to edit")
cnnTävl.Close()
Exit Sub
End If
cb.GetUpdateCommand()
Adapter.Update(ds)
Catch Er As Exception
MsgBox("Er= " + Er.Message)
End Try
cnnTävl.Close()
End Sub
连接和命令使用了需要释放的非托管资源。他们的 Dispose
方法就是这样做的。必须调用Dispose
方法;幸运的是,我们有 Using...End Using
块可以为我们处理这个问题并关闭连接。
您不需要使用DataAdapter 和DataSet 调用所有数据。直接更新就好了
Private Sub Button2_Click_(sender As Object, e As EventArgs) Handles Button2.Click
'testa att uppdatera databas
Dim strSql = "Update Deltagare Set NameOf5thColumn = 'Bo Ek'WHERE Patrull='12' AND Figur='01';"
Dim RecordsEffected As Integer
Using cnnTävl = New OleDb.OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data source=" + TPath + AktTävlNamn + "_" + AktTävlDat + ".mdb"),
cmd As New OleDb.OleDbCommand(strSql, cnnTävl)
Debug.Print(cnnTävl.ConnectionString)
Try
cnnTävl.Open()
RecordsEffected = cmd.ExecuteNonQuery()
Catch Er As Exception
MsgBox("Er= " + Er.Message)
End Try
End Using
If RecordsEffected = 1 Then
MessageBox.Show("Success!")
Else
MessageBox.Show("Failure!")
End If
End Sub
根据
I've never worked with adapters, but you have a
BeginEdit()
without a correspondingEndEdit()
.Adapter.Update(ds)
should return the number of rows affected, so don't ignore that.
EndEdit()
解决了问题。我在网上看到的所有例子都没有使用EndEdit()
,但可能是例子太旧了。
谢谢拉尔斯的帮助。