У мене виникають проблеми з фрагментом коду, який повинен завантажити таблицю бази даних на TypedTable і вставити (або оновити, якщо ключ вже присутній), в частині оновлення, хоча мій код працює надзвичайно повільно.
Тепер більшість таблиць, з якими я оброблюю, потребує повного оновлення, тому я стираю дані та повторно додаю все з іншої таблиці в набраній таблиці за допомогою простого AddTableRow(row)
процедура, яка працює просто чудово, але коли мені потрібно оновити дані, я використовую LoadDataRow(row, fAcceptChanges)
функції, і навіть з .BeginLoadData() -> .EndLoadData()
він стає надзвичайно повільним (2/3 оновлення в секунду) з Таблицею, що містить близько 500 к рядків даних (кожен рядок містить 15 колодок).
Я "досить новий на vb.net, тому я не знаю багато про альтернативи, мені доведеться оновити дані, але якщо хтось знає який-небудь спосіб її прискорити, я буду дуже радий почути все про це".
Деякі додаткові відомості:
Здебільшого причина тому, що я вставляю данірядок за рядком, тому що мені потрібно перевірити обмеження для моєї таблиці, щоб я міг обробляти exepep, підняті з частини вставки, плюс автоматичну перевірку обмежень для TypedDataTable
це досить добре, враховуючи, що я маю обробляти більше 10 db таблиць.
Мій код для оновлення працює так, як цей атм:
Table = Parser.GetData()
TypedTable = TableAdapter.GetData()
For Each row In Table
Try
Dim TypedRow = TypedTable.NewRow()
LoadNotTypedIntoTyped(row, TypedRow)
TypedTable.BeginLoadData()
TypedTable.LoadDataRow(TypedRow.ItemArray, True) "TODO speed up this
TypedTable.EndLoadData()
Catch ex As Exception
"Generic exception handling here
End Try
Next
SqlBulkCopyLoadProcedure()
Відповіді:
0 для відповіді № 1Я знайшов вдале рішення своєї конкретної проблеми;за допомогою введеного типу означає, що я маю більше контролю над обмеженнями таблиці, оскільки мій джерело даних пов'язаний з таблицею БД, тому я створив нову порожню введену таблицю для завантаження нових даних, потім завантажую поточні дані з db і Table1.Merge(Table2)
об'єднати дані.
У моєму випадку це можливо, оскільки сума одДані, з якими я обробляюсь, не надто великі (близько 500 тис. записів), якщо пам'ять стає проблемою, я думаю, що життєздатним рішенням може бути створення таблиці підтримки та об'єднання безпосередньо за допомогою SQL, але я "новачок DB, тому мені суперечать, якщо я" м тут не так
Код того, що я зробив:
Dim SupportTable As TypedTable = MyTypedTable.Clone()
For each row in TableToLoad
Dim NewTypedRow = SupportTable.NewRow()
For Each col In Columns
"Load every column
Next
SupportTable.AddTypedRow(NewTypedRow)
Next
TypedTable.Merge(SupportTable)
TypedTable.AcceptChanges()
"Load to database