Bagikan melalui


Operasi penyalinan massal tunggal

Mengunduh ADO.NET

Pendekatan paling sederhana untuk melakukan operasi penyalinan massal SQL Server adalah dengan melakukan satu operasi terhadap database. Secara default, operasi penyalinan massal dilakukan sebagai operasi yang terisolasi: operasi penyalinan terjadi dengan cara tanpa transaksi, tanpa peluang untuk memutarnya kembali.

Catatan

Jika Anda perlu memutar kembali semua atau sebagian salinan massal saat terjadi kesalahan, Anda dapat menggunakan SqlBulkCopy-transaksi terkelola, atau melakukan operasi penyalinan massal dalam transaksi yang ada. SqlBulkCopy juga akan bekerja dengan System.Transactions jika koneksi terdaftar (secara implisit atau eksplisit) ke dalam transaksi System.Transactions.

Untuk informasi selengkapnya, lihat Operasi transaksi dan penyalinan massal.

Langkah-langkah umum untuk melakukan operasi penyalinan massal adalah sebagai berikut:

  1. Hubungkan ke server sumber dan dapatkan data yang akan disalin. Data juga dapat berasal dari sumber lain, jika dapat diambil dari objek IDataReader atau DataTable.

  2. Sambungkan ke server tujuan (kecuali jika Anda ingin SqlBulkCopy membuat sambungan untuk Anda).

  3. Buat objek SqlBulkCopy, mengatur semua properti yang diperlukan.

  4. Atur properti DestinationTableName untuk menunjukkan tabel target untuk operasi penyisipan massal.

  5. Panggil salah satu metode WriteToServer.

  6. Opsional, perbarui properti dan panggil WriteToServer lagi seperlunya.

  7. Panggil Close, atau bungkus operasi penyalinan massal dalam pernyataan Using.

Perhatian

Sebaiknya tipe data kolom sumber dan target cocok. Jika tipe data tidak cocok, SqlBulkCopy mencoba mengonversi setiap nilai sumber ke tipe data target, menggunakan aturan yang digunakan oleh Value. Konversi dapat memengaruhi kinerja, dan juga dapat mengakibatkan kesalahan yang tidak terduga. Misalnya, tipe data Double dapat dikonversi ke tipe data Decimal hampir sepanjang waktu, tetapi tidak selalu.

Contoh

Aplikasi konsol berikut menunjukkan cara memuat data menggunakan kelas SqlBulkCopy. Dalam contoh ini, SqlDataReader digunakan untuk menyalin data dari tabel Production.Product di database SQL Server AdventureWorks ke tabel serupa di database yang sama.

Penting

Sampel ini tidak akan berjalan kecuali Anda telah membuat tabel kerja seperti yang dijelaskan dalam penyiapan contoh penyalinan massal. Kode ini disediakan untuk mendemonstrasikan sintaks untuk menggunakan SqlBulkCopy saja. Jika tabel sumber dan tujuan terletak di instans SQL Server yang sama, akan lebih mudah dan lebih cepat untuk menggunakan pernyataan INSERT ... SELECT Transact-SQL untuk menyalin data.

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;";
    }
}

Melakukan operasi penyalinan massal menggunakan Transact-SQL dan kelas perintah

Contoh berikut mengilustrasikan cara menggunakan metode ExecuteNonQuery untuk mengeksekusi pernyataan PENYISIPAN MASSAL.

Catatan

Jalur file sumber data bergantung pada server. Proses server harus memiliki akses ke jalur itu agar operasi penyalinan massal berhasil.

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();  
}  

Langkah berikutnya