【问题标题】:Adding new record from dataset从数据集中添加新记录
【发布时间】:2015-09-29 22:18:27
【问题描述】:

我是新手,所以我要求一些回旋余地和理解。我正在使用 VB.NET 从网站上筛选表格并将其放入数据集中。我可以把它写成DataGridView 并使用Insert 将数据集保存到MS Access 数据库中。当我第二天使用该程序并添加新记录时出现问题。我不知道如何只添加新记录。谁能帮我弄清楚如何将新记录添加到 MS Access 数据库而不是完整的数据集?

这是我的Insert 代码:

Private Sub Button5_Click(sender As Object, e As EventArgs) Handles Button5.Click
    Try
        con2.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=O:\Maintenance\XXXXXX.accdb;"
        com2.Connection = con2

        com2.CommandText = "INSERT INTO INCOMING2 ([DriverNumber],[Name],[Terminal],[Region],[PostDate],[InspectionDate],[Citation],[InspState],[UnitType],[InspLevel],[Basic],[Section],[Description],[OOS],[Severity],[OOSWeight],[TimeWeight],[Points],[License],[State],[VIN],[Unit],[CostCenter],[UnitDesc],[HomeTerm],[TerminalName],[ShopEmail],[TerminalEmail],[TermMgr],[Count]) VALUES " & _
                                     "(@DriverNumber,@Name,@Terminal,@Region,@PostDate,@InspectionDate,@Citation,@InspState,@UnitType,@InspLevel,@Basic,@Section,@Description,@OOS,@Severity,@OOSWeight,@TimeWeight,@Points,@License,@State,@VIN,@Unit,@CostCenter,@UnitDesc,@HomeTerm,@TerminalName,@ShopEmail,@TerminalEmail,@TermMgr,@Count)"
        con2.Open()
        For Each dr As DataRow In table.Rows
            With com2.Parameters
                .Clear()
                .AddWithValue("@DriverNumber", dr("Driver Number"))
                .AddWithValue("@Name", dr("Name"))
                .AddWithValue("@Terminal", dr("Terminal"))
                .AddWithValue("@Region", dr("Region"))
                .AddWithValue("@PostDate", Convert.ToDateTime(dr("Post Date")))
                .AddWithValue("@InspectionDate", Convert.ToDateTime(dr("Inspection Date")))
                .AddWithValue("@Citation", dr("Citation"))
                .AddWithValue("@InspState", dr("Insp State"))
                .AddWithValue("@UnitType", dr("Unit Type"))
                .AddWithValue("@InspLevel", dr("Insp Level"))
                .AddWithValue("@Basic", dr("Basic"))
                .AddWithValue("@Section", dr("Section"))
                .AddWithValue("@Description", dr("Description"))
                .AddWithValue("@OOS", dr("OOS"))
                .AddWithValue("@Severity", dr("Severity"))
                .AddWithValue("@OOSWeight", dr("OOS Weight"))
                .AddWithValue("@TimeWeight", dr("Time Weight"))
                .AddWithValue("@Points", dr("Points"))
                .AddWithValue("@License", dr("License"))
                .AddWithValue("@State", dr("State"))
                .AddWithValue("@VIN", dr("VIN"))
                .AddWithValue("@Unit", dr("Unit"))
                .AddWithValue("@CostCenter", dr("Cost Center"))
                .AddWithValue("@UnitDesc", dr("Unit Descr"))
                .AddWithValue("@HomeTerm", dr("Home Term"))
                .AddWithValue("@TerminalName", dr("Terminal Name"))
                .AddWithValue("@ShopEmail", dr("Shop E-mail"))
                .AddWithValue("@TerminalEmail", dr("Terminal E-mail"))
                .AddWithValue("@TermMgr", dr("Term Mgr"))
                .AddWithValue("@Count", dr("Count"))
            End With
            'com2 = New OleDb.OleDbCommand(Query, con2)
            com2.ExecuteNonQuery()

        Next
        MessageBox.Show("Captured Data has Updated Incoming CSA", "Required", MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
        con2.Close()


    Catch ex As Exception
        MsgBox(ex.ToString)
    Finally
        If con2.State = ConnectionState.Open Then
            con2.Close()
        End If
        ds.Tables.Clear()
    End Try
End Sub

【问题讨论】:

  • 您需要创建一个临时表以在每次运行时将新记录加载到其中,然后在临时表和 INCOMING2 之间进行左外连接,其中 INCOMING2 键字段 = null。这将只返回新记录,您可以将它们插入到 INCOMING2 中。不要忘记在每次运行结束或开始时清空临时表。
  • 感谢 Eric 的快速回复。我喜欢你提到的这里的逻辑。我还没有机会实施它。在我试一试之前,我想确保我跟随你。所以我很清楚;在我的数据库中创建 INCOMING2 的临时表或重复表。然后在临时表和 INCOMING2 之间进行左外连接,其中数据集 keyfields = null IN MY INSERT STATEMENT?如果是这样,你能举一个插入语句的例子吗?
  • 你好,埃里克,谢谢你。你让我以不同的方式看待整个项目。我没有意识到我可以像 VBA 代码一样将命令文本发送到 Access 数据库。我能够清除临时表插入数据,然后将其移动到我需要的表中,类似于您描述的方式。我是新来的,但我如何对您的解决方案进行投票?
  • 你不能,因为我没有提供答案,只是评论。随意发布您的最终解决方案作为答案,以帮助将来帮助其他人,然后您可以接受自己的答案。
  • 可能不是最有效的代码,但这是我解决它的方法。我重复使用命令文本来清除我的临时表,存储在临时表中并移动到不在的主表:

标签: html vb.net ms-access dataset


【解决方案1】:

试试

        con2.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=O:\Maintenance\BWALLER\CSA AUTO\CSA.accdb;"
        com2.Connection = con2

        com2.CommandText = "DELETE FROM T_INCOMING2"
        con2.Open()
        com2.ExecuteNonQuery()
        con2.Close()
        com2.Connection = con2

        com2.CommandText = "DELETE FROM INCOMING3"
        con2.Open()
        com2.ExecuteNonQuery()
        con2.Close()
        com2.Connection = con2


        com2.CommandText = "INSERT INTO T_INCOMING2 ([DriverNumber],[Name],[Terminal],[Region],[PostDate],[InspectionDate],[Citation],[InspState],[UnitType],[InspLevel],[Basic],[Section],[Description],[OOS],[Severity],[OOSWeight],[TimeWeight],[Points],[License],[State],[VIN],[Unit],[CostCenter],[UnitDesc],[HomeTerm],[TerminalName],[ShopEmail],[TerminalEmail],[TermMgr],[Count]) VALUES " & _
                                     "(@DriverNumber,@Name,@Terminal,@Region,@PostDate,@InspectionDate,@Citation,@InspState,@UnitType,@InspLevel,@Basic,@Section,@Description,@OOS,@Severity,@OOSWeight,@TimeWeight,@Points,@License,@State,@VIN,@Unit,@CostCenter,@UnitDesc,@HomeTerm,@TerminalName,@ShopEmail,@TerminalEmail,@TermMgr,@Count) "
        con2.Open()
        For Each dr As DataRow In table.Rows
            With com2.Parameters
                .Clear()
                .AddWithValue("@DriverNumber", dr("Driver Number"))
                .AddWithValue("@Name", dr("Name"))
                .AddWithValue("@Terminal", dr("Terminal"))
                .AddWithValue("@Region", dr("Region"))
                .AddWithValue("@PostDate", Convert.ToDateTime(dr("Post Date")))
                .AddWithValue("@InspectionDate", Convert.ToDateTime(dr("Inspection Date")))
                .AddWithValue("@Citation", dr("Citation"))
                .AddWithValue("@InspState", dr("Insp State"))
                .AddWithValue("@UnitType", dr("Unit Type"))
                .AddWithValue("@InspLevel", dr("Insp Level"))
                .AddWithValue("@Basic", dr("Basic"))
                .AddWithValue("@Section", dr("Section"))
                .AddWithValue("@Description", dr("Description"))
                .AddWithValue("@OOS", dr("OOS"))
                .AddWithValue("@Severity", dr("Severity"))
                .AddWithValue("@OOSWeight", dr("OOS Weight"))
                .AddWithValue("@TimeWeight", dr("Time Weight"))
                .AddWithValue("@Points", dr("Points"))
                .AddWithValue("@License", dr("License"))
                .AddWithValue("@State", dr("State"))
                .AddWithValue("@VIN", dr("VIN"))
                .AddWithValue("@Unit", dr("Unit"))
                .AddWithValue("@CostCenter", dr("Cost Center"))
                .AddWithValue("@UnitDesc", dr("Unit Descr"))
                .AddWithValue("@HomeTerm", dr("Home Term"))
                .AddWithValue("@TerminalName", dr("Terminal Name"))
                .AddWithValue("@ShopEmail", dr("Shop E-mail"))
                .AddWithValue("@TerminalEmail", dr("Terminal E-mail"))
                .AddWithValue("@TermMgr", dr("Term Mgr"))
                .AddWithValue("@Count", dr("Count"))
            End With

            com2.ExecuteNonQuery()
        Next
        con2.Close()
        com2.CommandText = "INSERT INTO INCOMING2 " & _
                            "SELECT T_INCOMING2.* " & _
                            "FROM INCOMING2 RIGHT JOIN T_INCOMING2 ON INCOMING2.[Name] = T_INCOMING2.[Name] AND INCOMING2.[PostDate] = T_INCOMING2.[PostDate] AND INCOMING2.[Section] = T_INCOMING2.[Section] " & _
                            "WHERE ((((T_INCOMING2.[Name]) Not In (INCOMING2.[Name])) And ((T_INCOMING2.[PostDate]) Not In (INCOMING2.[PostDate])) And ((T_INCOMING2.[Section]) Not In (INCOMING2.[Section]))));"

        con2.Open()
        com2.ExecuteNonQuery()
        con2.Close()

        com2.CommandText = "INSERT INTO INCOMING3 " & _
                            "SELECT * " & _
                            "FROM INCOMING2;"
        con2.Open()
        com2.ExecuteNonQuery()
        con2.Close()
        com2.Connection = con2

        MessageBox.Show("Captured Data has Updated Incoming CSA", "Required", MessageBoxButtons.OK, MessageBoxIcon.Exclamation)

    Catch ex As Exception
        MsgBox(ex.ToString)
    Finally
        If con2.State = ConnectionState.Open Then
            con2.Close()
        End If
        ds.Tables.Clear()
    End Try

【讨论】:

  • 对于那些拒绝我的编辑的人,请随意阅读这个问题和答案。我的编辑确实是为操作员以及将来可能遇到此问题的任何人准备的,并且如果您不只是为了积分而游戏系统,那将非常有意义。我自己也可以很容易地发布这个,但没有和 bwaller,使用我的 cmets 对原始问题提出了他自己的解决方案。我只是指出没有必要围绕每个查询进行 .Open/.Close ,并在我的编辑评论中说明了这一点。
猜你喜欢
  • 2013-08-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多