/ / Wstaw / Zaktualizuj wiersze w DataTable, VB.NET - serwer sql, baza danych, vb.net, datatable

Wstaw / Aktualizuj wiersze w DataTable, VB.NET - sql-server, database, vb.net, datatable

Mam problemy z fragmentem kodu, który powinien załadować tabelę bazy danych na TypedTable i wstawić (lub zaktualizować, jeśli klucz jest już obecny), w części aktualizacyjnej, chociaż mój kod działa bardzo wolno.

Teraz większość obsługiwanych przeze mnie tabel wymaga pełnego odświeżenia, więc czyściłem dane i dodawałem wszystko z innej tabeli w tabeli typed za pomocą prostego AddTableRow(row) procedura, która działa dobrze, ale kiedy muszę zaktualizować dane, używam LoadDataRow(row, fAcceptChanges) funkcja, a nawet z .BeginLoadData() -> .EndLoadData() robi się bardzo wolno (aktualizacja 2/3 na sekundę) z tabelą zawierającą około 500 tys. wierszy danych (każdy wiersz ma około 15 kol.).

Jestem całkiem nowy na vb.net, więc nie wiem wiele o alternatywach, muszę zaktualizować dane, ale jeśli ktoś wie, jak to przyspieszyć, z przyjemnością usłyszę wszystko.

Niektóre dodatkowe informacje:

Głównie z tego powodu, że wstawiam danerząd po rzędzie, ponieważ muszę sprawdzić ograniczenia dla mojej tabeli, aby móc obsłużyć wyjątki podniesione z części wstawionej, a także automatyczną kontrolę ograniczeń TypedDataTable jest całkiem dobry, biorąc pod uwagę, że muszę obsłużyć więcej niż 10 tabel db.

Mój kod aktualizacji działa następująco:

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()

Odpowiedzi:

0 dla odpowiedzi № 1

Znalazłem dobre rozwiązanie mojego konkretnego problemu;używając tabeli typedtable, mam większą kontrolę nad ograniczeniami tabeli, ponieważ moje źródło danych jest powiązane z tabelą DB, więc utworzyłem nową pustą tabelę z typami, aby załadować nowe dane, a następnie ładuję bieżące dane z bazy danych i Table1.Merge(Table2) połączyć dane.

W moim przypadku jest to możliwe, ponieważ kwota oddane, które obsługuję, nie są zbyt duże (około 500 000 rekordów), jeśli pamięć stanie się problemem, myślę, że realnym rozwiązaniem może być utworzenie tabeli obsługi i scalanie bezpośrednio za pomocą SQL, ale „jestem początkującym DB, więc zaprzeczajcie mi, jeśli” mylę się tutaj

Kod tego, co zrobiłem:

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