Обновление базы данных VB.NET с помощью DataTable - PullRequest
0 голосов
/ 27 мая 2011

Я просматривал некоторые форумы по гепатиту и некоторые справочные книги, но, похоже, я не могу понять, как это происходит. Моя задача - прочитать данные из двух текстовых файлов, а затем загрузить эти данные в существующую базу данных MS Access 2007. Вот что я пытаюсь сделать:

  1. Считывание данных из первого текстового файла и для каждой строки данных добавляйте данные в DataTable, используя CarID в качестве моего уникального поля.
  2. Считайте данные из второго текстового файла и найдите существующий CarID в DataTable, если существует, обновите эту строку. Если его не существует, добавьте новую строку.
  3. как только я закончу, поместите содержимое DataTable в базу данных.

Что у меня есть:

    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), они обновляются новыми полями, и если не существует, тогда эти записи добавляются. Возможно ли это с моим процессом?

ТИА AGP

1 Ответ

1 голос
/ 27 мая 2011

Загрузка каждого текстового файла в память - более эффективный вариант, и его легче кодировать. Это, конечно, полностью зависит от того, сколько памяти у вас есть, и насколько велики ваши текстовые файлы.

Мой подход заключается в том, чтобы сначала загрузить все данные из файлов в DataTable. Затем преобразуйте эту таблицу в XML. Затем вы можете передать XML в хранимую процедуру. Эта хранимая процедура преобразует XML в переменную таблицы или временную таблицу, из которой можно запускать запросы SQL.

Отсюда простой пример выполнения запроса «Не существует» в вашем SP на tblCars с данными, которые вы передали, и вставка была применима.

На мой взгляд, это наиболее эффективный вариант, поэтому вашему приложению не нужно извлекать какие-либо данные из SQL. SQL оптимизирован для такого рода вещей и будет чрезвычайно эффективно выполнять приложения.

Если вы хотите быть действительно умным, вы можете прочитать каждый текстовый файл, используя рабочий поток, и загрузить их в SQL, как только они будут прочитаны. Это сэкономит на использовании памяти и будет очень быстрым.

...