2011-06-19 20 views
11

Chcę wstawić wiele wierszy (skonstruowanych z obiektów Entity Framework) do programu SQL Server. Problem polega na tym, że niektóre właściwości ciągów mają długość przekraczającą długość kolumny w bazie danych, co powoduje wyjątek, a następnie wszystkie wiersze nie będą mogły zostać wstawione do bazy danych.Jak automatycznie obcinać ciąg po wstawieniu luzem?

Zastanawiam się, czy istnieje sposób, aby powiedzieć SqlBulkCopy, aby automatycznie skracać dowolne wiersze o większej długości? Oczywiście, mogę sprawdzić i podciąć każdą właściwość, jeśli przekracza ona ograniczoną długość, zanim wstawi się ją do DataTable, ale spowolni cały program.

Odpowiedz

7

Niestety, nie ma sposobu, abybezpośredni sposób to zrobić z SqlBulkCopy. SQL Bulk Inserts są z natury niemal "głupie", ale dlatego są tak szybkie. Nie są nawet rejestrowane (z wyjątkiem przechwytywania zdarzenia SqlRowsCopied), więc jeśli coś zawiedzie, nie ma zbyt wielu informacji. Co szukasz to w pewien sposób być sprzeczne z celem tej klasy

Ale nie może być 2 sposoby:

  • można spróbować użyć SqlBulkCopyOptions wyliczania (przekazany do SqlBulkCopy() Constructor) oraz użyj SqlBulkCopyOptions.CheckConstraints (Sprawdź ograniczenia podczas wstawiania danych Domyślnie ograniczenia nie są sprawdzane.).

  • Albo można użyć SqlBulkCopyOptions.FireTriggers wyliczania (Gdy określony, spowoduje, że serwer na ogień wkładka wyzwala za wiersze są wstawiane do bazy danych.) I obsłużyć wyjątek w SQL Server Insert Trigger.

+1

-1 Wyzwalacz zostanie uruchomiony zbyt późno: nastąpi obcięcie przed uruchomieniem kodu. Kontrola nadal daje wyjątek. Op jest z powrotem tam, gdzie zaczęli. – gbn

+1

+0,5? Za pomocą wyzwalacza INSTEAD OF INSERT można przyciąć dane do wstawienia, ale tabela pomostowa jest lepszą ścieżką. – SqlACID

9

W przypadku działań zbiorczych należy zawsze używać tabeli pomostów/obciążeń.

Następnie można przetwarzać, czyścić, szorować itd. Danych przed opróżnieniem do rzeczywistego stołu. Obejmuje to, lewicowcy, wyszukiwań DE-powielania itp

Więc:

  1. obciążenia stół inscenizacja z szerokich kolumn
  2. Flush od inscenizacji na "prawdziwe" tabeli przy użyciu INSERT realtable (..) SELECT LEFT(..), .. FROM Staging
-1

Spróbuj użyć klasy SQLTransaction podczas korzystania z klasy SQLBulkCopy

Powiązane problemy