【发布时间】: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