2009-04-22 14 views
1

Wir haben eine im Speicher befindliche DataTable in einer CLR-Prozedur. Nach einer signifikanten Verarbeitung enthält die DataTable viele Daten, die wir in eine Tabelle in der Datenbank laden müssen. Leider, da wir eine context connection SqlBulkCopy verwenden, wird nicht funktionieren (wirft Fehler: Der angeforderte Vorgang ist nicht verfügbar für die Kontextverbindungoutline of context restrictions).SQL CLR SqlBulkCopy von DataTable

Wir denken darüber nach, eine zusätzliche reguläre Verbindung aufzubauen und sie zur Ausführung von SQLBulkCopy zu verwenden. Dies scheint ziemlich dumm angesichts der Overhead der Verwendung eines regular connection over a context connection. Wir haben darüber nachgedacht, über die Zeilen in der DataTable zu iterieren und für jeden einen Datensatz einzufügen, aber er ist von großer Größe und SQLBulkCopy scheint besser zu passen.

Wir sind nicht mit der DataTable verheiratet und suchen nur nach der besten Methode zum Einfügen einer großen Menge von Daten in eine Datenbank aus einem CLR-Verfahren. Eine letzte Notiz in der DataTable ist repräsentativ für eine zugrunde liegende Datenbanktabelle, ist aber nicht über DataSet oder TableAdapter an die Tabelle gebunden. Die Mittel dafür in einem CLR-Verfahren waren nicht sofort offensichtlich. Dies zu tun und die AcceptChanges- oder Update-Methode zu verwenden wäre eine akzeptable Lösung.

Antwort

2

Ich würde schätzen, dass SQLBulkCopy 10-100 Mal schneller ist als das Einfügen von Einträgen abhängig von der Tabellengröße, also lohnt sich der Kompromiss.

Da Sie eine 'signifikante Verarbeitung' Ihrer DataTable durchführen, was ohne Zweifel Zeit und Ressourcen kostet, ist der kleine zusätzliche Aufwand, entweder eine vollständige Verbindung anstelle einer Kontextverbindung zu verwenden, oder eine vollständig neue Verbindung zu öffnen kleiner Preis zu zahlen.

+0

Wirklich fungiert die DataTable nur als ein bequemes Objekt für die Speicherung von Datensätzen nach einer erheblichen Verarbeitung. Die Möglichkeit, eine rohe DataTable an SqlBulkCopy zur Datensatzeinfügung zu senden, schien ein Slam Dunk zu sein, bis wir auf das Problem mit unserem Verbindungstyp stießen. Je mehr ich darüber nachdenke, desto mehr stimme ich zu, dass das Öffnen einer normalen Verbindung wahrscheinlich der richtige Weg ist. – ahsteele

Verwandte Themen