| 

.NET C# Java Javascript Exception

1
Ich habe einige GB Daten die ich so schnell wie möglich in eine SQL-Datenbank inserten möchte. Ich habe schon gehört dass man das mit bulk copy machen kann. Ich habe aber nur das bcp.exe-Tool gefunden was nur Textdateien verarbeiten kann. Die Daten werden aber von meiner App generiert. Kann ich mit ADO.NET direkt einen Bulk-Insert machen oder muss ich jetzt extra Textdateien schreiben und dann bcp.exe aufrufen?
News:
05.10.2009
luser.der.user 21 2
1 Antwort
6
Ich hab mich mal auf die Suche gemacht und den passenden Code gefunden:

Bulk Insert into SQL Server using SqlBulkCopy

Der Code besteht aus 2 Teilen. 1. dem Import-Teil der eine beliebige Datei entgegen nehmen könnte. Z.B. XML, TXT, CSV, Excel, etc.

DataTable dt = new DataTable();
string line = null;
int i = 0;

using (StreamReader sr = File.OpenText(@"c:\temp\table1.csv"))
{
while ((line = sr.ReadLine()) != null)
{
string[] data = line.Split(',');
if (data.Length > 0)
{
if (i == 0)
{
foreach (var item in data)
{
dt.Columns.Add(new DataColumn());
}
i++;
}
DataRow row = dt.NewRow();
row.ItemArray = data;
dt.Rows.Add(row);
}
}
}


Der 2. Teil ist der Auruf der SqlBulkCopy-Classe die für dich den Import übernimmt:

using (SqlConnection cn = new SqlConnection(ConfigurationManager.ConnectionStrings["ConsoleApplication3.Properties.Settings.daasConnectionString"].ConnectionString))
{
cn.Open();
using (SqlBulkCopy copy = new SqlBulkCopy(cn))
{
copy.ColumnMappings.Add(0, 0);
copy.ColumnMappings.Add(1, 1);
copy.ColumnMappings.Add(2, 2);
copy.ColumnMappings.Add(3, 3);
copy.ColumnMappings.Add(4, 4);
copy.DestinationTableName = "Censis";
copy.WriteToServer(dt);
}
}


Den 1. Teil musst du je nach Datenquelle anpassen. Im 2. Teil musst du das Mapping je nach Datenquelle anpassen. Wobei es auch die Möglichkeit gibt, das Mapping anhant das Namens zu machen.

copy.ColumnMappings.Add(new SqlBulkCopyColumnMapping("OrderID", "ID"));


Zu beachten ist, das deine gesamt Datenquelle in den lokalen Arbeitsspeicher kopiert werden muss um die Datatable zu erzeugen. Erst im Anschluss kann der Bulkcopy-Vorgang erfolgen.
Eine mögliche Alternative wäre, aus deiner Datenquelle eine CSV oder Text-Datei zu erzeugen (basierend auf dem Quellcode aus Teil 1) und diese dann über den SQL-Serverbefehl BulkCopy zu importieren.
05.10.2009
Floyd 14,6k 3 9
Floyd 14,6k 3 9
Der SQL Server Befehl zum BulkCopy setzt aber voraus, dass die CSV Datei auch am Server selbst vorhanden ist. Das ist nicht immer von jedem Client aus gegeben, vor allem wenn wie so oft keine Domänenstruktur vorhanden ist, kann dies durchaus zum Problem werden. Der Client kommt nicht zwangsweise auf alle Netzwerkfreigaben des Servers so ohne weiteres drauf.
commänder 08.02.2011
1
SqlBulkCopy kann auch einen IDataReader akzeptieren, welcher sich ähnlich wie ein IEnumerable verhält, also die Daten streamt.
Marvin Steppat 08.02.2011

Stelle deine .net-Frage jetzt!
TOP TECHNOLOGIES CONSULTING GmbH