2011-02-16 11 views
18

Mam DataTable, który chcę nacisnąć do DB. Chcę być w stanie powiedzieć, jakNajlepszy sposób, aby wstawić luzem z C# DataTable

myDataTable.update(); 

Ale po przeczytaniu MSDN docs, najwyraźniej to nie wstawia wiersz po wierszu.

Należy zauważyć, że oświadczenia te nie są wykonywane jako proces wsadowy; każdy wiersz jest aktualizowany indywidualnie.

Jakie są moje alternatywy?

Edycja: używam SQL Server 2005

+0

Twoje opcje zależą od używanego serwera. – Yetti

Odpowiedz

43

przypadku korzystania z SQL Server, SqlBulkCopy.WriteToServer(DataTable)

Albo też z SQL Server, można zapisać go do pliku .csv i używać BULK INSERT

przypadku MySQL, można zapisać go do pliku .csv i używać LOAD DATA INFILE

Jeśli używasz Oracle, you can use the array binding feature of ODP.NET

Jeśli SQLite :

+0

Łącze do rozwiązania ODP.NET jest zepsute. –

+0

To, co JohnB powiedział było niesamowite, oto dobra próbka z wyjaśnieniem. http://www.jarloo.com/c-bulk-upsert-to-sql-server-tutorial/ –

4

To będzie w dużej mierze zależy od RDBMS używasz, i czy w ogóle istnieje opcja .NET dla tego RDBMS.

Jeśli używasz programu SQL Server, użyj klasy SqlBulkCopy.

W przypadku innych dostawców baz danych, spróbuj użyć Google specjalnie dla nich. Na przykład po wyszukaniu ".NET Bulk insert into Oracle" pojawiły się interesujące wyniki, w tym ten link z powrotem do Stack Overflow: Bulk Insert to Oracle using .NET.

2

Oto jak to zrobić przy użyciu DataTable. Jest to działający fragment kodu TEST.

using (SqlConnection con = new SqlConnection(connStr)) 
{ 
    con.Open(); 

    // Create a table with some rows. 
    DataTable table = MakeTable(); 

    // Get a reference to a single row in the table. 
    DataRow[] rowArray = table.Select(); 

    using (SqlBulkCopy bulkCopy = new SqlBulkCopy(con)) 
    { 
     bulkCopy.DestinationTableName = "dbo.CarlosBulkTestTable"; 

     try 
     { 
      // Write the array of rows to the destination. 
      bulkCopy.WriteToServer(rowArray); 
     } 
     catch (Exception ex) 
     { 
      Console.WriteLine(ex.Message); 
     } 

    } 

}//using 
+4

Dlaczego dokonujesz konwersji na DataRow []? SqlBulkCoopy może pobrać samą DataTable jako parametr, więc wydaje się to bezsensownym krokiem. – SeeMoreGain

6
string connectionString= ServerName + DatabaseName + SecurityType; 
using (SqlConnection connection = new SqlConnection(connectionString)) 
using (SqlBulkCopy bulkCopy = new SqlBulkCopy(connection)) { 
    connection.Open(); 
    bulkCopy.DestinationTableName = "TableName"; 
    try { 
     bulkCopy.WriteToServer(dataTableName); 
    } catch (Exception e) { 
     Console.Write(e.Message); 
    } 
} 

Należy pamiętać, że struktura tabeli bazy danych i nazwa tabeli powinna być taka sama, czy będzie to wyjątek.

+0

fajnie działa – user3098137

+0

+1 na przykład :). Zamiast mówić "struktura powinna być taka sama", a może dołączyć SqlBulkCopy.ColumnMappings w przykładzie –

Powiązane problemy