我的程序不接受AddNewRow作为数据行

问题描述 投票:0回答:1

我已经为此苦苦挣扎了好几天了。

我的套路不接受这样的说法:

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))

我不知道出了什么问题/遗漏了。我做错了什么?

vb.net ms-access newrow
1个回答
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 块而关闭数据库连接。

© www.soinside.com 2019 - 2024. All rights reserved.