2010-11-25 9 views
1

Ich mache eine Konvertierung mit SqlBulkCopy. Ich habe zur Zeit eine IList-Sammlung von Klassen, die ich grundsätzlich zu einer DataTable für die Verwendung mit SqlBulkCopy konvertieren kann.3 Datensätze mit derselben ID, aber ändern Sie die verschiedenen Spalten mit SqlBulkCopy

Problem ist, dass ich 3 Datensätze mit der gleichen ID haben kann.

mich hier erklären lassen .. sind 3 Datensätze

ID  Name   Address 
1  Scott  London 
1  Mark   London 
1     Manchester 

Grundsätzlich muss ich sie nacheinander einzufügen .. also einfügen i Datensatz 1, wenn es der nächste Datensatz nicht vorhanden ist, dann, wenn es vorhanden ich brauche um den Datensatz zu aktualisieren, anstatt eine neue 1 einzufügen (beachte, dass die ID immer noch 1 ist), ersetze im Fall des zweiten Datensatzes beide Spalten Name und Adresse auf ID 1.

Endlich auf dem dritten Datensatz merkt man diesen Namen existiert nicht aber seine ID 1 und hat eine Adresse von Manchester, also muss ich den Rekord aber NICHT ÄNDERN aktualisieren, aber Manchester aktualisierend. folglich der 3. Rekord wou ld make die id1 =

Irgendwelche Ideen, wie kann ich das tun? Ich bin ratlos.

Danke.

EDIT

Ok ein kleines Update. Ich werde meine Datensätze verwalten und zusammenführen, bevor ich SQLbulkCopy verwende. Ist es möglich, eine Liste zu bekommen, was erfolgreich war und was gescheitert ist ... oder ist es ein Fall von ALL oder nichts? Ich nehme an, es gibt keine andere Alternative zu SQLbulkCopy, aber Updates zu machen?

wäre es ideal in der Lage sein, alles einzufügen und diejenigen, die fehlgeschlagen sind in eine temporäre Tabelle eingefügt ... daher muss ich nur sorgen, um die in meiner fehlgeschlagenen Tabelle zu korrigieren, da die anderen ich weiß, sind alle in Ordnung

+0

(wird Antwort aktualisieren re bearbeiten) –

Antwort

0

Da Sie benötigen diese Daten in ein DataTableohnehin zu verarbeiten (es sei denn, Sie eine benutzerdefinierte IDataReader schreiben), sollten Sie die Datensätze zusammenführen, bevor sie zu SqlBulkCopy geben; beispielsweise (in Pseudocode):

/* create empty data-table */ 
foreach(row in list) { 
    var row = /* try to get exsiting row from data-table based on id */ 
    if(row == null) { row = /* create and append row to data-table */ } 
    else { merge non-trivial properties into existing row */ 
} 

dann die DataTableSqlBulkCopy passieren, sobald die gewünschten Daten.


Re die Bearbeitung; In diesem Szenario würde ich in eine Zwischenspeichertabelle (nur eine reguläre Tabelle mit einem Schema wie den hochgeladenen Daten, aber in der Regel keine Fremdschlüssel usw.) hochladen und dann mithilfe von regulärem TSQL die Daten in die Transaktionstabellen verschieben. Zusätzlich zur vollen TSQL-Unterstützung ermöglicht dies auch eine bessere Protokollierung von Vorgängen. Schauen Sie sich insbesondere die OUTPUT-Klausel von INSERT an, die komplexe Massenoperationen unterstützen kann.

+0

Vielen Dank, ich habe meine Frage aktualisiert – Martin

0

Sie können keine Aktualisierungen mit Massenkopieren (Masseneinfügung) durchführen, nur einfügen. Daher der Name.

Sie müssen die Daten korrigieren, bevor Sie sie einfügen. Wenn das bedeutet, dass Sie Updates für bereits vorhandene Zeilen haben, können Sie diese nicht einfügen, da dies den Schlüsselkonflikt erzeugt.

Sie können entweder in eine temporäre Tabelle einfügen und die entsprechenden Einfüge- oder Aktualisierungsanweisungen ausführen, nur die neuen Zeilen einfügen und Aktualisierungsanweisungen für den Rest ausgeben oder die bereits vorhandenen Zeilen nach dem Abrufen und Fixieren der Daten löschen vor dem Wiedereinsetzen.

Aber es gibt keine Möglichkeit, Massenkopie zu überzeugen, eine vorhandene Zeile zu aktualisieren.

+0

danke, ich habe meine Frage aktualisiert – Martin