Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
SQL Server toplu kopyalama işlemi gerçekleştirmenin en basit yaklaşımı, veritabanında tek bir işlem gerçekleştirmektir. Varsayılan olarak, toplu kopyalama işlemi yalıtılmış bir işlem olarak gerçekleştirilir: Kopyalama işlemi işlem yapılmamış bir şekilde gerçekleşir ve geri döndürme fırsatı yoktur.
Uyarı
Hata oluştuğunda toplu kopyanın tamamını veya bir bölümünü geri almanız gerekiyorsa, yönetilen bir işlem kullanabilir veya mevcut bir SqlBulkCopyişlem içinde toplu kopyalama işlemini gerçekleştirebilirsiniz. Bağlantı bir System.Transactions işlemine (örtük veya açıkça) dahil edilirse System.Transactions ile de çalışır.
Daha fazla bilgi için bkz. İşlem ve toplu kopyalama işlemleri.
Toplu kopyalama işlemi gerçekleştirmeye yönelik genel adımlar şunlardır:
Kaynak sunucuya bağlanın ve kopyalanacak verileri alın. Veriler bir veya IDataReader nesnesinden alınabiliyorsa diğer kaynaklardan DataTable da gelebilir.
Hedef sunucuya bağlanın ( SqlBulkCopy'nin sizin için bir bağlantı kurmasını istemiyorsanız).
Gerekli özellikleri ayarlayarak bir SqlBulkCopy nesne oluşturun.
DestinationTableName özelliğini, toplu ekleme işleminin hedef tablosunu gösterecek şekilde ayarlayın.
WriteToServer yöntemlerinden birini çağırın.
İsteğe bağlı olarak, özellikleri güncelleyin ve gerektiğinde WriteToServer'ı yeniden çağırın.
çağrısı gerçekleştirin Closeveya toplu kopyalama işlemlerini bir
Usingdeyim içinde sarmalayın.
Dikkat
Kaynak ve hedef sütun veri türlerinin eşleşmesini öneririz. Veri türleri eşleşmiyorsa , SqlBulkCopy tarafından Valuekullanılan kuralları kullanarak her kaynak değeri hedef veri türüne dönüştürmeyi dener. Dönüştürmeler performansı etkileyebilir ve beklenmeyen hatalara neden olabilir. Örneğin, bir Double veri türü çoğu zaman bir Decimal veri türüne dönüştürülebilir, ancak her zaman dönüştürülemez.
Example
Aşağıdaki konsol uygulaması, sınıfını kullanarak verilerin nasıl yükleneceklerini SqlBulkCopy gösterir. Bu örnekte, SQL Server SqlDataReader veritabanındaki Production.Product tablosundaki verileri aynı veritabanındaki benzer bir tabloya kopyalamak için kullanılır.
Önemli
Bu örnek, toplu kopyalama örneği kurulumu bölümünde açıklandığı gibi iş tablolarını oluşturmadığınız sürece çalışmaz. Bu kod, yalnızca SqlBulkCopy'yi kullanmaya yönelik söz dizimini göstermek için sağlanır. Kaynak ve hedef tablolar aynı SQL Server örneğinde bulunuyorsa, verileri kopyalamak için Transact-SQL INSERT ... SELECT deyimi kullanmak daha kolay ve daha hızlıdır.
using Microsoft.Data.SqlClient;
class Program
{
static void Main()
{
string connectionString = GetConnectionString();
// Open a sourceConnection to the AdventureWorks database.
using (SqlConnection sourceConnection =
new SqlConnection(connectionString))
{
sourceConnection.Open();
// Perform an initial count on the destination table.
SqlCommand commandRowCount = new SqlCommand(
"SELECT COUNT(*) FROM " +
"dbo.BulkCopyDemoMatchingColumns;",
sourceConnection);
long countStart = System.Convert.ToInt32(
commandRowCount.ExecuteScalar());
Console.WriteLine("Starting row count = {0}", countStart);
// Get data from the source table as a SqlDataReader.
SqlCommand commandSourceData = new SqlCommand(
"SELECT ProductID, Name, " +
"ProductNumber " +
"FROM Production.Product;", sourceConnection);
SqlDataReader reader =
commandSourceData.ExecuteReader();
// Open the destination connection. In the real world you would
// not use SqlBulkCopy to move data from one table to the other
// in the same database. This is for demonstration purposes only.
using (SqlConnection destinationConnection =
new SqlConnection(connectionString))
{
destinationConnection.Open();
// Set up the bulk copy object.
// Note that the column positions in the source
// data reader match the column positions in
// the destination table so there is no need to
// map columns.
using (SqlBulkCopy bulkCopy =
new SqlBulkCopy(destinationConnection))
{
bulkCopy.DestinationTableName =
"dbo.BulkCopyDemoMatchingColumns";
try
{
// Write from the source to the destination.
bulkCopy.WriteToServer(reader);
// Print the number of rows processed using the
// RowsCopied property.
Console.WriteLine("{0} rows were processed.",
bulkCopy.RowsCopied);
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
finally
{
// Close the SqlDataReader. The SqlBulkCopy
// object is automatically closed at the end
// of the using block.
reader.Close();
}
}
// Perform a final count on the destination
// table to see how many rows were added.
long countEnd = System.Convert.ToInt32(
commandRowCount.ExecuteScalar());
Console.WriteLine("Ending row count = {0}", countEnd);
Console.WriteLine("{0} rows were added.", countEnd - countStart);
Console.WriteLine("Press Enter to finish.");
Console.ReadLine();
}
}
}
private static string GetConnectionString()
// To avoid storing the sourceConnection string in your code,
// you can retrieve it from a configuration file.
{
return "Data Source=(local); " +
" Integrated Security=true;" +
"Initial Catalog=AdventureWorks;";
}
}
Transact-SQL ve komut sınıfını kullanarak toplu kopyalama işlemi gerçekleştirme
Aşağıdaki örnekte BULK INSERT deyimini ExecuteNonQuery yürütmek için yönteminin nasıl kullanılacağı gösterilmektedir.
Uyarı
Veri kaynağının dosya yolu sunucuya göredir. Toplu kopyalama işleminin başarılı olması için sunucu işleminin bu yola erişimi olmalıdır.
using (SqlConnection connection = New SqlConnection(connectionString))
{
string queryString = "BULK INSERT Northwind.dbo.[Order Details] " +
"FROM 'f:\mydata\data.tbl' " +
"WITH ( FORMATFILE='f:\mydata\data.fmt' )";
connection.Open();
SqlCommand command = new SqlCommand(queryString, connection);
command.ExecuteNonQuery();
}