Come posso copiare i contenuti DataTable su una tabella SQL mentre sto riempiendolo

datatable sqlbulkcopy sql-server

Domanda

Ho definito un DataTable aggiungendo colonne digitate. Mi aspetto che DataTable sia compreso tra 1 milione e 3 milioni di righe.

Sto usando il TextFieldParser di Microsoft (perché supporta più formati a larghezza fissa, benissimo, tramite un metodo Peek), per popolare le righe del DataTable.

Mi piacerebbe avere una sorta di operazione che copia le righe da DataTable in una tabella SQL con mirroring.

Se popolgo l'intero DataTable e quindi uso SqlAdapter e SqlCommandBuilder per aggiornare la tabella SQL come menzionato qui esaurisco la memoria.

Come posso realizzare questo?

Risposta accettata

Non è consigliabile utilizzare DataTable per 1 M di righe, è sufficiente creare nuovo SqlComand per INSERT e rendere tutti i campi della tabella come parametri ed eseguire questo comando nel ciclo.

Ma se hai già scritto molto codice con DataTable, puoi considerarlo come un buffer e avere la seguente soluzione:

1) per quanto riguarda la lettura delle righe di dati, verificare quante sono state già lette finora

2) non appena ottieni 10K righe esegui DataTable.Update ();

(puoi chiamare questo parametro come buffer_size e metterlo da qualche parte nella configurazione per evitare hardcoding)

3) quindi si puliscono tutti i dati nel DataTable, chiamando

DataTable.Clear(); 
DataTable.AcceptChanges();

4) continui a leggere i dati dal file, ripetizioni del ciclo


Inoltre, è difficile fare un suggerimento generale senza conoscere la struttura del file e lo scopo dell'applicazione, ho solo risposto alla domanda su come evitare "memoria insufficiente" quando si utilizzano dataset molto grandi. Ma consiglio anche di prendere in considerazione tutte le opzioni possibili per evitare l'uso di tabelle di dati .NET come memoria intermedia di dati e file di processo direttamente con tutti i possibili mezzi forniti dal server SQL, come

1) BULK INSERT - http://msdn.microsoft.com/en-us/library/ms188365.aspx

2) utilità bcp - http://msdn.microsoft.com/en-us/library/ms162802.aspx

3) MS SQL Intergartion Services - http://msdn.microsoft.com/en-us/library/ms141026.aspx

le operazioni di inserimento di massa utilizzando uno qualsiasi di questi comandi e strumenti possono essere avviate da .NET.



Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché