/ / Inserisci / Aggiorna righe in un DataTable, VB.NET - sql-server, database, vb.net, datatable

Inserisci / Aggiorna righe in un DataTable, VB.NET - sql-server, database, vb.net, datatable

Sto avendo problemi con un pezzo di codice che dovrebbe caricare una tabella di database su una TypedTable e inserire (o aggiornare se la chiave è già presente), sulla parte di aggiornamento anche se il mio codice viene eseguito estremamente lento.

Ora, la maggior parte delle tabelle che gestisco richiedono un aggiornamento completo, quindi pulisco i dati e riaggiungi tutto da un'altra tabella in typedtable utilizzando un semplice AddTableRow(row) procedura che funziona bene, ma quando ho bisogno di aggiornare i dati che uso il LoadDataRow(row, fAcceptChanges) funzione, e anche con il .BeginLoadData() -> .EndLoadData() diventa estremamente lento (2/3 di aggiornamento al secondo) con una tabella contenente circa 500k righe di dati (ogni riga ha come 15 colonne).

Sono abbastanza nuovo a vb.net quindi non so molto di alternative che devo aggiornare datatable, ma se qualcuno sa come accelerarlo sarò davvero lieto di sapere tutto.

Altre informazioni:

Principalmente la ragione perché sto inserendo i datiriga per riga è perché ho bisogno di controllare i vincoli per la mia tabella in modo da poter gestire le eccezioni sollevate dalla parte di inserimento, oltre al controllo automatico dei vincoli del TypedDataTable è abbastanza buono, considerando che devo gestire più di 10 tabelle db.

Il mio codice per l'aggiornamento funziona come questo atm:

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

risposte:

0 per risposta № 1

Ho trovato una buona soluzione al mio particolare problema;utilizzando un typedtable significa che ho più controllo sui vincoli della tabella, perché la mia origine dati è correlata alla tabella DB, quindi ho creato una nuova tabella vuota digitata per caricare i nuovi dati, quindi carico i dati correnti dal db e Table1.Merge(Table2) per unire i dati.

Nel mio caso questo è possibile perché l'importo odi dati che gestisco non sono troppo grandi (circa 500k di record), se la memoria diventa un problema, penso che una soluzione praticabile possa essere quella di creare una tabella di supporto e unire direttamente usando SQL, ma io "ma un principiante di DB mi contraddice se mi" m sbagliato qui

Codice di ciò che ho fatto:

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