VB.NET使用DataTable更新Access数据库

时间:2011-05-26 23:08:34

标签: vb.net ms-access ado.net dataset

我一直在阅读一些人工论坛和一些帮助书,但似乎无法理解我的头脑。我的任务是从两个文本文件中读取数据,然后将该数据加载到现有的MS Access 2007数据库中。所以这就是我想要做的事情:

  1. 从第一个文本文件中读取数据,并使用CarID作为我的唯一字段,为每一行数据添加数据到DataTable。
  2. 从第二个文本文件中读取数据,并在DataTable中查找现有的CarID,如果存在则更新该行。如果它不存在则添加一个新行。
  3. 一旦完成,就将DataTable的内容推送到数据库。
  4. 到目前为止:

        Dim sSQL As String = "SELECT * FROM tblCars"
        Dim da As New OleDb.OleDbDataAdapter(sSQL, conn)
        Dim ds As New DataSet
        da.Fill(ds, "CarData")
        Dim cb As New OleDb.OleDbCommandBuilder(da)
    
        'loop read a line of text and parse it out. gets dd, dc, and carId
    
        'create a new empty row
        Dim dsNewRow As DataRow = ds.Tables("CarData").NewRow()
    
        'update the new row with fresh data
        dsNewRow.Item("DriveDate") = dd
        dsNewRow.Item("DCode") = dc
        dsNewRow.Item("CarNum") = carID
        'about 15 more fields
    
        'add the filled row to the DataSet table
        ds.Tables("CarData").Rows.Add(dsNewRow)
    
        'end loop
    
        'update the database with the new rows
        da.Update(ds, "CarData")
    

    问题:

    在构建我的表时,我使用“SELECT * FROM tblCars”,但如果该表已有数百万条记录,该怎么办呢?这不是浪费资源吗?如果我想用新记录更新,我应该尝试不同的东西吗?

    完成第一个文本文件后,我转到下一个文本文件。这里最好的方法是:首先查找基于CarNum的现有记录,还是创建第二个表,然后将两个表合并在一起?

    最后,当DataTable完成填充并将其推送到数据库时,我想确保如果已经存在三个主要字段(DriveDate,DCode和CarNum)的记录,那么它们将使用新字段进行更新,如果是如果不存在则会追加这些记录。这可能与我的过程有关吗?

    TIA AGP

1 个答案:

答案 0 :(得分:1)

将每个文本文件加载到内存中是性能更好的选项,并且更容易编码。这当然完全取决于您可用的内存量以及文本文件的大小。

我的方法是首先将文件中的所有数据加载到DataTable中。然后将此表转换为XML。然后,您可以将XML传递到存储过程。此存储过程将XML转换为表变量或临时表,您可以从中运行SQL查询。

从这里开始,这是一个简单的例子,你在SP上的tblCars中使用你传入的数据进行“不存在”查询,并且插入适用。

在我看来,这是迄今为止表现最佳的选项,您的应用程序无需从SQL中提取任何数据。 SQL适用于这些类型的东西,并且会大量执行应用程序。

如果你想真正聪明一点,你可以使用工作线程读取每个文本文件,并在读取后立即将它们加载到SQL中。它可以节省内存使用量并且非常快。