我一直在阅读一些人工论坛和一些帮助书,但似乎无法理解我的头脑。我的任务是从两个文本文件中读取数据,然后将该数据加载到现有的MS Access 2007数据库中。所以这就是我想要做的事情:
到目前为止:
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
答案 0 :(得分:1)
将每个文本文件加载到内存中是性能更好的选项,并且更容易编码。这当然完全取决于您可用的内存量以及文本文件的大小。
我的方法是首先将文件中的所有数据加载到DataTable中。然后将此表转换为XML。然后,您可以将XML传递到存储过程。此存储过程将XML转换为表变量或临时表,您可以从中运行SQL查询。
从这里开始,这是一个简单的例子,你在SP上的tblCars中使用你传入的数据进行“不存在”查询,并且插入适用。
在我看来,这是迄今为止表现最佳的选项,您的应用程序无需从SQL中提取任何数据。 SQL适用于这些类型的东西,并且会大量执行应用程序。
如果你想真正聪明一点,你可以使用工作线程读取每个文本文件,并在读取后立即将它们加载到SQL中。它可以节省内存使用量并且非常快。