2009-10-22 20 views
14

Czy można użyć SqlBulkcopy z Sql Compact Edition np. Pliki (* .sdf)?sqlbulkcopy przy użyciu sql CE

Wiem, że działa z SQL Server 200 w górę, ale chciałem sprawdzić kompatybilność CE.

Jeśli tak, to czy ktoś jeszcze nie zna najszybszego sposobu pobrania pliku typu CSV do SQL Server CE bez korzystania z DataSets (puke tutaj)?

Odpowiedz

0

Nie, nie sądzę, że obsługiwana jest obsługa SqlBulkCopy (patrz MSDN). Być może wyrzuć dane w formacie xml i rozebraj je na serwerze? SQL/XML jest całkiem niezły w 2005/2008.

Możesz również chcieć spojrzeć na parametry wartości tabeli, ale wątpię, że CE je obsługuje.

22

BULKCOPY nie jest obsługiwany w SQL CE. Oto najszybszy sposób, jeśli masz ogromną liczbę rzędów w swoim stole; insert jest za wolny!

using (SqlCeConnection cn = new SqlCeConnection(yourConnectionString)) 
{ 
    if (cn.State == ConnectionState.Closed) 
     cn.Open(); 

    using (SqlCeCommand cmd = new SqlCeCommand()) 
    { 
     cmd.Connection = cn; 
     cmd.CommandText = "YourTableName"; 
     cmd.CommandType = CommandType.TableDirect; 

     using (SqlCeResultSet rs = cmd.ExecuteResultSet(ResultSetOptions.Updatable | ResultSetOptions.Scrollable)) 
     { 
      SqlCeUpdatableRecord record = rs.CreateRecord(); 

      using (var sr = new System.IO.StreamReader(yourTextFilePath)) 
      { 
       string line; 
       while ((line = sr.ReadLine()) != null) 
       { 
        int index = 0; 
        string[] values = line.Split('\t'); 

        //write these lines as many times as the number of columns in the table... 
        record.SetValue(index, values[index++] == "NULL" ? null : values[index - 1]); 
        record.SetValue(index, values[index++] == "NULL" ? null : values[index - 1]); 
        record.SetValue(index, values[index++] == "NULL" ? null : values[index - 1]); 

        rs.Insert(record); 
       } 
      } 
     } 
    } 
} 

Benchmark: stół z 34370 wierszy

  • z wkładkami: 38 wierszy pisanych za drugim

  • ten sposób: 260 wierszy pisanych za drugim

+0

Interesujące, dzięki :) – leppie

+0

Ta metoda nie obsługuje typów kolumn Identity i Rowversion –

+2

Wow, zmagał się z Insert i uzyskiwanie 20 - 30 wierszy na sekundę, jestem pewien, że to właśnie zrobił wszystkie 35.774 wiersze w mniej niż 1 po drugie (wszystkie moje dane znajdowały się w tablicy w pamięci), więc nie ma wąskich gardeł od źródła. – Matt

1

jest możliwe znacznie zwiększyć ten rodzaj operacji. Aby ta operacja była użyteczna (mam na myśli szybki i całkiem bezpieczny), możesz użyć CE DataAdapter.

Przez próbkę, nie troska o klucze, kroki wymienione poniżej mogą pomóc u:

  1. upewnić się, że sorce i docelowe tabele mają taką samą strukturę boiska;
  2. Klonowanie wirtualnego zbioru danych z datatownikiem ze źródłowej bazy danych (Twój wybór);
  3. Utwórz polecenie CE z nazwą tabeli jako tekst polecenia (TableDirect jako typ polecenia);
  4. Utwórz zestaw danych CE z polecenia CE;
  5. Utwórz program budujący polecenia CE z modułu danych CE;
  6. Przekaż polecenie wstawiania z edytora poleceń CE do rejestru danych CE;
  7. Kopiuj „n” wierszy wsadowych ze źródła DataTable do docelowego elementu datatable (the clone) robi coś takiego:

    '... previous codes 
    For Each currentRow In sourceTable.Rows 
        'u can do RaiseEvent Processing(currentRow, totalRows) here with DoEvents 
        If targetTable.Rows.Count < 100 Then 
         targetTable.InportRow(currentRow) 
         targetTable.Rows(targetTable.Rows.Count - 1).SetAdded 
        Else 
         '...Here you wll call the CE DataAdapter's Update method (da.Update(targetTable)) 
         '...and then be sure you clone the targetTable again, erasing all previous rows. 
         '...Do a clone again, don't do just a "clear" in the Rows collection. 
         '...If u have an Autoincrement it will break all Foreign Keys. 
        End If 
        Next 
        '... next codes 
    

W ten sposób u może zaktualizować kilka wierszy bez dużo czasu .

Mam niektóre aplikacje korzystające z tej metody, a średnia stawka wynosi około 1500 wierszy na sekundę w tabeli z 5 NTEXT pola (powolny) i 800000 wierszy.

Oczywiście wszystko zależy od struktury stołu. IMAGE i NTEXT są powolnymi typami danych.

P.S .: Tak jak powiedziałem, ta metoda nie przywiązuje wagi do kluczy, więc należy zachować ostrożność.

7

Mam tutaj bibliotekę SqlCeBulkCopy: http://sqlcebulkcopy.codeplex.com - nawet wsparcie IEnumerable.

+0

Czy obsługuje on Visual Studio 2008? – soclose

+0

Tak - jest to rozwiązanie VS 2008. – ErikEJ

+0

Aby użyć tego, czy muszę dodać wszystkie pięć .DLL do mojego projektu? A może tylko niektóre? Czy są one zamiennikami dla "ogólnych" SqlCe .DLLs, czy są one dodatkowe do tych? –

Powiązane problemy