Поделиться через


SqlBulkCopy.WriteToServer Метод

Определение

Перегрузки

WriteToServer(DbDataReader)

Копирует все строки из предоставленного массива DbDataReader в целевую таблицу, заданную свойством DestinationTableName объекта SqlBulkCopy.

WriteToServer(DataRow[])

Копирует все строки из предоставленного массива DataRow в целевую таблицу, заданную свойством DestinationTableName объекта SqlBulkCopy.

WriteToServer(DataTable)

Копирует все строки в предоставленном DataTable в целевую таблицу, заданную свойством DestinationTableName объекта SqlBulkCopy.

WriteToServer(IDataReader)

Копирует все строки в предоставленном IDataReader в целевую таблицу, заданную свойством DestinationTableName объекта SqlBulkCopy.

WriteToServer(DataTable, DataRowState)

Копирует только те строки, которые соответствуют предоставленному состоянию строки в предоставленной таблице DataTable, в целевую таблицу, заданную свойством DestinationTableName объекта SqlBulkCopy.

WriteToServer(DbDataReader)

Копирует все строки из предоставленного массива DbDataReader в целевую таблицу, заданную свойством DestinationTableName объекта SqlBulkCopy.

public:
 void WriteToServer(System::Data::Common::DbDataReader ^ reader);
public void WriteToServer (System.Data.Common.DbDataReader reader);
member this.WriteToServer : System.Data.Common.DbDataReader -> unit
Public Sub WriteToServer (reader As DbDataReader)

Параметры

reader
DbDataReader

Объект DbDataReader, строки которого будут скопированы в таблицу назначения.

Исключения

Параметр SqlBulkCopyColumnOrderHint не указал допустимое имя целевого столбца.

Применяется к

WriteToServer(DataRow[])

Копирует все строки из предоставленного массива DataRow в целевую таблицу, заданную свойством DestinationTableName объекта SqlBulkCopy.

public:
 void WriteToServer(cli::array <System::Data::DataRow ^> ^ rows);
public void WriteToServer (System.Data.DataRow[] rows);
member this.WriteToServer : System.Data.DataRow[] -> unit
Public Sub WriteToServer (rows As DataRow())

Параметры

rows
DataRow[]

Массив объектовDataRow, подлежащих копированию в целевую таблицу.

Исключения

Параметр SqlBulkCopyColumnOrderHint не указал допустимое имя целевого столбца.

Примеры

В следующем консольном приложении показано, как выполнить массовую загрузку данных из массива DataRow . Целевая таблица — это таблица в базе данных AdventureWorks .

В этом примере DataTable создается во время выполнения. Для копирования DataTable в целевую таблицу выбирается одна строка.

Важно!

Этот пример не будет выполняться, если вы не создали рабочие таблицы, как описано в разделе Пример установки массового копирования. Этот код предназначен только для демонстрации синтаксиса использования SqlBulkCopy. Если исходная и целевая таблицы находятся в одном экземпляре SQL Server, проще и быстрее использовать инструкцию Transact-SQL INSERT … SELECT для копирования данных.

Комментарии

Пока выполняется операция массового копирования, связанное назначение SqlConnection занято ее обслуживанием, и другие операции с подключением выполнять нельзя.

Коллекция ColumnMappings сопоставляется со столбцами DataRow с целевой таблицей базы данных.

Применяется к

WriteToServer(DataTable)

Копирует все строки в предоставленном DataTable в целевую таблицу, заданную свойством DestinationTableName объекта SqlBulkCopy.

public:
 void WriteToServer(System::Data::DataTable ^ table);
public void WriteToServer (System.Data.DataTable table);
member this.WriteToServer : System.Data.DataTable -> unit
Public Sub WriteToServer (table As DataTable)

Параметры

table
DataTable

Объект DataTable, строки которого будут скопированы в таблицу назначения.

Исключения

Параметр SqlBulkCopyColumnOrderHint не указал допустимое имя целевого столбца.

Примеры

В следующем консольном приложении показано, как выполнить массовую загрузку DataTableданных из . Целевая таблица — это таблица в базе данных AdventureWorks .

В этом примере DataTable создается во время выполнения и является источником SqlBulkCopy операции.

Важно!

Этот пример не будет выполняться, если вы не создали рабочие таблицы, как описано в разделе Пример установки массового копирования. Этот код предназначен только для демонстрации синтаксиса использования SqlBulkCopy. Если исходная и целевая таблицы находятся в одном экземпляре SQL Server, проще и быстрее использовать инструкцию Transact-SQL INSERT … SELECT для копирования данных.

using Microsoft.Data.SqlClient;

class Program
{
    static void Main()
    {
        string connectionString = GetConnectionString();
        // Open a connection to the AdventureWorks database.
        using (SqlConnection connection =
                   new SqlConnection(connectionString))
        {
            connection.Open();

            // Perform an initial count on the destination table.
            SqlCommand commandRowCount = new SqlCommand(
                "SELECT COUNT(*) FROM " +
                "dbo.BulkCopyDemoMatchingColumns;",
                connection);
            long countStart = System.Convert.ToInt32(
                commandRowCount.ExecuteScalar());
            Console.WriteLine("Starting row count = {0}", countStart);

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

            // Create the SqlBulkCopy object. 
            // Note that the column positions in the source DataTable 
            // match the column positions in the destination table so 
            // there is no need to map columns. 
            using (SqlBulkCopy bulkCopy = new SqlBulkCopy(connection))
            {
                bulkCopy.DestinationTableName =
                    "dbo.BulkCopyDemoMatchingColumns";

                try
                {
                    // Write from the source to the destination.
                    bulkCopy.WriteToServer(newProducts);
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.Message);
                }
            }

            // 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 DataTable MakeTable()
    // Create a new DataTable named NewProducts. 
    {
        DataTable newProducts = new DataTable("NewProducts");

        // Add three column objects to the table. 
        DataColumn productID = new DataColumn();
        productID.DataType = System.Type.GetType("System.Int32");
        productID.ColumnName = "ProductID";
        productID.AutoIncrement = true;
        newProducts.Columns.Add(productID);

        DataColumn productName = new DataColumn();
        productName.DataType = System.Type.GetType("System.String");
        productName.ColumnName = "Name";
        newProducts.Columns.Add(productName);

        DataColumn productNumber = new DataColumn();
        productNumber.DataType = System.Type.GetType("System.String");
        productNumber.ColumnName = "ProductNumber";
        newProducts.Columns.Add(productNumber);

        // Create an array for DataColumn objects.
        DataColumn[] keys = new DataColumn[1];
        keys[0] = productID;
        newProducts.PrimaryKey = keys;

        // Add some new rows to the collection. 
        DataRow row = newProducts.NewRow();
        row["Name"] = "CC-101-WH";
        row["ProductNumber"] = "Cyclocomputer - White";

        newProducts.Rows.Add(row);
        row = newProducts.NewRow();
        row["Name"] = "CC-101-BK";
        row["ProductNumber"] = "Cyclocomputer - Black";

        newProducts.Rows.Add(row);
        row = newProducts.NewRow();
        row["Name"] = "CC-101-ST";
        row["ProductNumber"] = "Cyclocomputer - Stainless";
        newProducts.Rows.Add(row);
        newProducts.AcceptChanges();

        // Return the new DataTable. 
        return newProducts;
    }
    private static string GetConnectionString()
    // To avoid storing the connection string in your code, 
    // you can retrieve it from a configuration file. 
    {
        return "Data Source=(local); " +
            " Integrated Security=true;" +
            "Initial Catalog=AdventureWorks;";
    }
}

Комментарии

Все строки в копируются в DataTable целевую таблицу, за исключением тех, которые были удалены.

Пока выполняется операция массового копирования, связанное назначение SqlConnection занято ее обслуживанием, и другие операции с подключением выполнять нельзя.

Коллекция ColumnMappings сопоставляется со столбцами DataTable с целевой таблицей базы данных.

См. также раздел

Применяется к

WriteToServer(IDataReader)

Копирует все строки в предоставленном IDataReader в целевую таблицу, заданную свойством DestinationTableName объекта SqlBulkCopy.

public:
 void WriteToServer(System::Data::IDataReader ^ reader);
public void WriteToServer (System.Data.IDataReader reader);
member this.WriteToServer : System.Data.IDataReader -> unit
Public Sub WriteToServer (reader As IDataReader)

Параметры

reader
IDataReader

Объект IDataReader, строки которого будут скопированы в таблицу назначения.

Исключения

Параметр SqlBulkCopyColumnOrderHint не указал допустимое имя целевого столбца.

Примеры

В следующем консольном приложении показано, как выполнить массовую загрузку SqlDataReaderданных из . Целевая таблица — это таблица в базе данных AdventureWorks .

Важно!

Этот пример не будет выполняться, если вы не создали рабочие таблицы, как описано в разделе Пример установки массового копирования. Этот код предназначен только для демонстрации синтаксиса использования SqlBulkCopy. Если исходная и целевая таблицы находятся в одном экземпляре SQL Server, проще и быстрее использовать инструкцию Transact-SQL INSERT … SELECT для копирования данных.

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

            // Set up the bulk copy object using a connection string. 
            // In the real world you would not use SqlBulkCopy to move
            // data from one table to the other in the same database.
            using (SqlBulkCopy bulkCopy =
                       new SqlBulkCopy(connectionString))
            {
                bulkCopy.DestinationTableName =
                    "dbo.BulkCopyDemoMatchingColumns";

                try
                {
                    // Write from the source to the destination.
                    bulkCopy.WriteToServer(reader);
                }
                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;";
    }
}

Комментарии

Операция копирования начинается со следующей доступной строки в средстве чтения. В большинстве случаев средство чтения возвращалось с помощью ExecuteReader() или аналогичного вызова, поэтому следующей доступной строкой является первая строка. Чтобы обработать несколько результатов, вызовите NextResult() средство чтения данных и вызовите WriteToServer еще раз.

Обратите внимание, что использование WriteToServer изменяет состояние средства чтения. Метод вызывается Read() до тех пор, пока не будет возвращено значение false, операция не будет прервана или не возникнет ошибка. Это означает, что средство чтения данных будет находиться в другом состоянии, вероятно, в конце результирующих наборов WriteToServer после завершения операции.

Пока выполняется операция массового копирования, связанное назначение SqlConnection занято ее обслуживанием, и другие операции с подключением выполнять нельзя.

Коллекция ColumnMappings сопоставляется со столбцами средства чтения данных с целевой таблицей базы данных.

Применяется к

WriteToServer(DataTable, DataRowState)

Копирует только те строки, которые соответствуют предоставленному состоянию строки в предоставленной таблице DataTable, в целевую таблицу, заданную свойством DestinationTableName объекта SqlBulkCopy.

public:
 void WriteToServer(System::Data::DataTable ^ table, System::Data::DataRowState rowState);
public void WriteToServer (System.Data.DataTable table, System.Data.DataRowState rowState);
member this.WriteToServer : System.Data.DataTable * System.Data.DataRowState -> unit
Public Sub WriteToServer (table As DataTable, rowState As DataRowState)

Параметры

table
DataTable

Объект DataTable, строки которого будут скопированы в таблицу назначения.

rowState
DataRowState

Значение из перечисления DataRowState. В целевую таблицу копируются только строки, состояние которых соответствует заданному.

Исключения

Параметр SqlBulkCopyColumnOrderHint не указал допустимое имя целевого столбца.

Примеры

В следующем консольном приложении показано, как выполнить массовую загрузку только строк в объекте DataTable , которые соответствуют указанному состоянию. В этом случае добавляются только неизменяемые строки. Целевая таблица — это таблица в базе данных AdventureWorks .

В этом примере DataTable создается во время выполнения, и в него добавляются три строки. Перед выполнением WriteToServer метода редактируется одна из строк. Метод WriteToServer вызывается с аргументом DataRowState.UnchangedrowState , поэтому в место назначения массово копируются только две неизменимые строки.

Важно!

Этот пример не будет выполняться, если вы не создали рабочие таблицы, как описано в разделе Пример установки массового копирования. Этот код предназначен только для демонстрации синтаксиса использования SqlBulkCopy. Если исходная и целевая таблицы находятся в одном экземпляре SQL Server, проще и быстрее использовать инструкцию Transact-SQL INSERT … SELECT для копирования данных.

using Microsoft.Data.SqlClient;

class Program
{
    static void Main()
    {
        string connectionString = GetConnectionString();
        // Open a connection to the AdventureWorks database.
        using (SqlConnection connection =
                   new SqlConnection(connectionString))
        {
            connection.Open();

            // Perform an initial count on the destination table.
            SqlCommand commandRowCount = new SqlCommand(
                "SELECT COUNT(*) FROM " +
                "dbo.BulkCopyDemoMatchingColumns;",
                connection);
            long countStart = System.Convert.ToInt32(
                commandRowCount.ExecuteScalar());
            Console.WriteLine("Starting row count = {0}", countStart);

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

            // Make a change to one of the rows in the DataTable.
            DataRow row = newProducts.Rows[0];
            row.BeginEdit();
            row["Name"] = "AAA";
            row.EndEdit();

            // Create the SqlBulkCopy object. 
            // Note that the column positions in the source DataTable 
            // match the column positions in the destination table so 
            // there is no need to map columns. 
            using (SqlBulkCopy bulkCopy = new SqlBulkCopy(connection))
            {
                bulkCopy.DestinationTableName =
                    "dbo.BulkCopyDemoMatchingColumns";

                try
                {
                    // Write unchanged rows from the source to the destination.
                    bulkCopy.WriteToServer(newProducts, DataRowState.Unchanged);
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.Message);
                }
            }

            // 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 DataTable MakeTable()
    // Create a new DataTable named NewProducts. 
    {
        DataTable newProducts = new DataTable("NewProducts");

        // Add three column objects to the table. 
        DataColumn productID = new DataColumn();
        productID.DataType = System.Type.GetType("System.Int32");
        productID.ColumnName = "ProductID";
        productID.AutoIncrement = true;
        newProducts.Columns.Add(productID);

        DataColumn productName = new DataColumn();
        productName.DataType = System.Type.GetType("System.String");
        productName.ColumnName = "Name";
        newProducts.Columns.Add(productName);

        DataColumn productNumber = new DataColumn();
        productNumber.DataType = System.Type.GetType("System.String");
        productNumber.ColumnName = "ProductNumber";
        newProducts.Columns.Add(productNumber);

        // Create an array for DataColumn objects.
        DataColumn[] keys = new DataColumn[1];
        keys[0] = productID;
        newProducts.PrimaryKey = keys;

        // Add some new rows to the collection. 
        DataRow row = newProducts.NewRow();
        row["Name"] = "CC-101-WH";
        row["ProductNumber"] = "Cyclocomputer - White";

        newProducts.Rows.Add(row);
        row = newProducts.NewRow();
        row["Name"] = "CC-101-BK";
        row["ProductNumber"] = "Cyclocomputer - Black";

        newProducts.Rows.Add(row);
        row = newProducts.NewRow();
        row["Name"] = "CC-101-ST";
        row["ProductNumber"] = "Cyclocomputer - Stainless";
        newProducts.Rows.Add(row);
        newProducts.AcceptChanges();

        // Return the new DataTable. 
        return newProducts;
    }
    private static string GetConnectionString()
    // To avoid storing the connection string in your code, 
    // you can retrieve it from a configuration file. 
    {
        return "Data Source=(local); " +
            " Integrated Security=true;" +
            "Initial Catalog=AdventureWorks;";
    }
}

Комментарии

В целевую таблицу DataTable копируются только строки в , которые находятся в состояниях, указанных в rowState аргументе и не были удалены.

Примечание

Если Deleted указан параметр , все Unchangedстроки , Addedи Modified также будут скопированы на сервер. Исключение не будет создано.

Пока выполняется операция массового копирования, связанное назначение SqlConnection занято ее обслуживанием, и другие операции с подключением выполнять нельзя.

Коллекция ColumnMappings сопоставляется со столбцами DataTable с целевой таблицей базы данных.

Применяется к