我已经为此苦苦挣扎了好几天了。
我的套路不接受这样的说法:
dsAddRow = ds.Tables("Nebenkosten").NewRow()
它跳过它并遇到错误:
未将对象引用设置为对象的实例
在课堂上
Header
,我已经完成了所有必要的声明:
Public con As New OleDb.OleDbConnection
Public dbProvider As String = "PROVIDER=Microsoft.Jet.OLEDB.4.0;"
Public myAppDir = System.Environment.GetEnvironmentVariable("USERPROFILE")
Public myDatabase As String = myAppDir & "\NebenkostenFuchs.mdb"
Public ds As New DataSet
Public da As New OleDb.OleDbDataAdapter
在
button_Save
例程中,我有以下代码:
'Open the Database
con.ConnectionString = dbProvider & "Data Source = " & myDatabase
con.Open()
'******************************************************************
Try
Dim cb As New OleDb.OleDbCommandBuilder(da)
Dim dsAddRow As DataRow '\<-- It jumps over this statement ?
dsAddRow = ds.Tables("Nebenkosten").NewRow() '\<-- and goes in error here?
dsAddRow.Item(1) = cmbObjekt.SelectedItem
dsAddRow.Item(2) = cmbJahr.SelectedItem
dsAddRow.Item(3) = cmbGruppe.SelectedItem
dsAddRow.Item(4) = cmbArt.SelectedItem
dsAddRow.Item(5) = cbUmlage.Checked
dsAddRow.Item(6) = txtSatz.Text
dsAddRow.Item(7) = txtBrutto.Text
dsAddRow.Item(8) = txtNetto.Text
dsAddRow.Item(9) = txtMwSt.Text
ds.Tables("Nebenkosten").Rows.Add(dsAddRow)
da.Update(ds, "Nebenkosten") `
con.Close()
Catch ex As Exception `
MsgBox(ex.Message.ToString, MessageBoxIcon.Error, "Oops - Fehler")
con.Close()
Exit Sub
End Try
在
*.mdb
文件中,我有一个表 Nebenkosten
,其中 ID
列作为索引 (.Item(0))
我不知道出了什么问题/遗漏了。我做错了什么?
首先,如果您不需要表数组(数据集),那么就不要使用表数组,而使用 DataTable。对于绝大多数此类情况,使用 DataSet 没有意义,也不是必需的,这样的选择也不反映开发人员的意图,即您只有一张表,并且没有很多表。
此外,您还需要“加载”数据库模式。现在,没有人会建议您每次在数据库中的列时都通过手动编码来“创建”。
因此,最简单的方法是使用不返回行的查询,我通常为此使用 PKColumn = 0。
所以,这意味着:
We need a connection.
A data adaptor
a Sql command builder
所以,代码应该如下所示:
Using conn As New OleDbConnection(My.Settings.AccessDB)
conn.Open()
Dim strSQL As String =
"SELECT * FROM tblHotelsA WHERE ID = 0"
Using da As New OleDbDataAdapter(strSQL, conn)
Dim rstData As New DataTable
da.Fill(rstData)
Dim daU As New OleDbCommandBuilder(da)
Dim MyNewRow = rstData.NewRow
MyNewRow("HotelName") = "Test Hotel ZZZ"
MyNewRow("Active") = True
MyNewRow("Cost") = 0
rstData.Rows.Add(MyNewRow)
da.Update(rstData)
End Using
End Using
注意 fill 命令,我们需要它来从数据库“加载/获取”列。
所以,根据上面的内容,你的代码应该看起来像这样:
Using conn As New OleDbConnection(My.Settings.AccessDB)
conn.Open()
Dim strSQL As String =
"SELECT * FROM Nebenkosten WHERE ID = 0"
Using da As New OleDbDataAdapter(strSQL, conn)
Try
Dim MyTable As New DataTable
da.Fill(MyTable)
Dim daU As New OleDbCommandBuilder(da)
Dim dsAddRow = MyTable.NewRow
dsAddRow.Item(1) = cmbObjekt.SelectedItem
dsAddRow.Item(2) = cmbJahr.SelectedItem
dsAddRow.Item(3) = cmbGruppe.SelectedItem
dsAddRow.Item(4) = cmbArt.SelectedItem
dsAddRow.Item(5) = cbUmlage.Checked
dsAddRow.Item(6) = txtSatz.Text
dsAddRow.Item(7) = txtBrutto.Text
dsAddRow.Item(8) = txtNetto.Text
dsAddRow.Item(9) = txtMwSt.Text
MyTable.Rows.Add(dsAddRow)
da.Update(MyTable)
Catch ex As Exception
MsgBox(ex.Message.ToString, MessageBoxIcon.Error, "Oops - Fehler")
End Try
End Using
End Using
注意 close 我们如何不(也不应该)由于 using 块而关闭数据库连接。