2009-10-07 12 views
9

VB.NET'te bir SQLClient.DataSet'i var ve aşağıdakileri yapmak zorunda kalmadan tüm şeyi bir SQL Server tablosuna eklemek istiyorum :Tüm bir VB.NET DataTable'ı bir SQL Server'a aynı anda eklemek mümkün mü

bir milyon satır yakın var (oldukça sıska bütün, bu yüzden fazla yer yok) bu yana
For Each dr as Datarow in MyDataset 
    Dim sc As New SqlCommand("INSERT INTO MyNewTable " & _ 
          "VALUES (@column1, @column2)", MyDBConnection) 
    sc.Parameters.AddWithValue("@column1", dr.Item(0)) 
    sc.Parameters.AddWithValue("@column2", dr.Item(1)) 
    sc.ExecuteNonQuery() 
Next 

, ben açıkçası bu döngü çalıştırmak ve bir milyon INSERT deyimleri oluşturmak istemiyoruz.

Başka bir SQL Server'dan geldiğinden ve onu buradan INSERT'ye aldığımdan, verileri ilk başta getirdiğimde, bir sunucunun bağlantılı bir sunucu kullanmak olduğunu biliyorum. Bununla birlikte, zaten veriyi uygulamamda varsa, toplu olarak eklemek için daha verimli bir yol var mı? DataTable'ı bir şekilde SQL Server'a bir parametre olarak iletebilir ve onu sıralayıp satırları ekleyebilir miyim?

cevap

14

Sen DataSet üzerinde .WriteXML() arayıp bir ilavenin veritabanına o atardım SqlBulkCopy

+0

Bu tam olarak ne istediğini olarak görünüyor. Bu sınıfın bile var olduğunu bilmiyordum - teşekkürler! – SqlRyan

+0

Tüm bir milyon kayıt yaklaşık dört saniyede eklendi - bu mükemmel. Tekrar teşekkürler! – SqlRyan

3

Ekle sorgunuzu tanımlamak için SqlDataAdapter 'ın InsertCommand değerini kullanın. Ardından, DataAdapter'ın Güncelleme Yöntemini veri kümenizi kullanarak verileri itmesi için bir parametre olarak çağırın. gibi

şey:

Dim DA As SqlDataAdapter = New SqlDataAdapter 
Dim Parm As New SqlParameter 

DA.InsertCommand = New SqlCommand("Insert Into tbl1(fld0, fld1, fld2) Values(@fld0, @fld1, @fld2)", conn) 
Parm = DA.InsertCommand.Parameters.Add(New SqlParameter ("@fld0", NVarChar, 50, "fld0")) 
Parm = sqlDA.InsertCommand.Parameters.Add(New SqlParameter ("@fld1", SqlDbType.NVarChar, 50, "fld1")) 
Parm = sqlDA.InsertCommand.Parameters.Add(New SqlParameter ("@fld2", SqlDbType.NVarChar, 50, "fld2")) 
DA.Update(dataset1, "tbl1") 
+0

Bu fikri düşündüm, ancak yine de her satır için bir INSERT deyimi oluşturuyor. En azından, arka planda bunu yapıyor, bu yüzden emin olmak için temiz. – SqlRyan

+1

Bunun eski bir yayın olduğunu biliyorum, ancak bu MSDN makalesi performansla ilgili olarak görünür ... Kaynak ve hedef tabloların aynı SQL Server örneğinde olması durumunda, Transact-SQL INSERT… SELECT deyimini kullanmak daha kolay ve hızlıdır verileri kopyalamak için http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlbulkcopy(v=vs.90).aspx – htm11h

6

SQL Server 2008 ile Table-Valued Parameters kullanabilirsiniz:

Dim sc As New SqlCommand(
    "INSERT INTO MyNewTable (field1, field2,...)"& 
    "SELECT field1, field2,... FROM @MyTable;", MyDBConnection) 
sc.Parameters.AddWithValue("@MyTable", MyDataset) 
sc.ExecuteNonQuery() 
+0

2008'i kullanıyorum ve bu harika bir fikir! Performansın SQLBulkCopy ile nasıl karşılaştırıldığını merak ediyorum - şu anda bir gigabit LAN üzerinden yapıyorum, ancak daha yavaş bir WAN bağlantısı üzerinden, herhangi bir kıyaslama fikri var mı? – SqlRyan

+0

Performans aktarım hızı (istemciden sunucuya) tarafından yönlendirilecek ve toplu kopyalama ile TVP arasındaki veri miktarının minimum olması, benzer şekilde davranmaları gerekir. Daha iyi ölçü. –

İlgili konular