SqlBulkCopy 构造函数

定义

重载

SqlBulkCopy(SqlConnection)

使用 指定的打开实例 SqlBulkCopy 初始化 类的新实例 SqlConnection

SqlBulkCopy(String)

根据提供的 初始化并打开 的新实例SqlConnectionconnectionString . 该构造函数使用 SqlConnection 来初始化 SqlBulkCopy 类的新实例。

SqlBulkCopy(String, SqlBulkCopyOptions)

根据提供的 初始化并打开 的新实例SqlConnectionconnectionString . 此构造函数使用此 SqlConnection 来初始化 SqlBulkCopy 类的新实例。 实例 SqlConnection 的行为取决于 中提供的选项copyOptions 参数一起使用的多个参数集的序列。

SqlBulkCopy(SqlConnection, SqlBulkCopyOptions, SqlTransaction)

使用 提供的现有打开实例 SqlBulkCopy 初始化 类的新实例 SqlConnection 。 实例 SqlBulkCopy 的行为取决于 中提供的选项copyOptions 参数一起使用的多个参数集的序列。 如果提供非空 SqlTransaction,则复制操作将在该事务中执行。

SqlBulkCopy(SqlConnection)

使用 指定的打开实例 SqlBulkCopy 初始化 类的新实例 SqlConnection

public:
 SqlBulkCopy(Microsoft::Data::SqlClient::SqlConnection ^ connection);
public SqlBulkCopy (Microsoft.Data.SqlClient.SqlConnection connection);
new Microsoft.Data.SqlClient.SqlBulkCopy : Microsoft.Data.SqlClient.SqlConnection -> Microsoft.Data.SqlClient.SqlBulkCopy
Public Sub New (connection As SqlConnection)

参数

connection
SqlConnection

将用于执行批量复制操作的已经打开的 SqlConnection 实例。 如果连接字符串未使用Integrated Security = true ,可以使用 SqlCredential 比将用户 ID 和密码指定为连接字符串中的文本更安全地传递用户 ID 和密码。

示例

以下控制台应用程序演示如何使用已打开的连接批量加载数据。 在此示例中,SqlDataReader 用于将数据从 SQL Server AdventureWorks 数据库的 Production.Product 表复制到相同数据库的一个类似的表中。 此示例只为了方便演示。 不会使用 SqlBulkCopy 将数据从生产应用程序的同一数据库中的一个表移到另一个表。 请注意,源数据不必位于 SQL Server;可以使用可读取到 或加载到 IDataReader 的任何DataTable数据源。

重要

除非已按批量复制示例设置中所述创建了工作表,否则此示例不会运行。 提供此代码是为了演示仅使用 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();

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

注解

由于初始化实例时 SqlBulkCopy 连接已打开,因此在实例关闭后 SqlBulkCopy ,连接将保持打开状态。 connection如果参数为 null,ArgumentNullException则引发 。

适用于

SqlBulkCopy(String)

根据提供的 初始化并打开 的新实例SqlConnectionconnectionString . 该构造函数使用 SqlConnection 来初始化 SqlBulkCopy 类的新实例。

public:
 SqlBulkCopy(System::String ^ connectionString);
public SqlBulkCopy (string connectionString);
new Microsoft.Data.SqlClient.SqlBulkCopy : string -> Microsoft.Data.SqlClient.SqlBulkCopy
Public Sub New (connectionString As String)

参数

connectionString
String

定义将打开的且由 SqlBulkCopy 实例使用的连接的字符串。 如果连接字符串未使用Integrated Security = true ,可以使用 SqlBulkCopy(SqlConnection)SqlBulkCopy(SqlConnection, SqlBulkCopyOptions, SqlTransaction)SqlCredential 来更安全地传递用户 ID 和密码,而不是将用户 ID 和密码指定为连接字符串中的文本。

例外

如果 connectionString 是空字符串, ArgumentException 则引发 。

示例

以下控制台应用程序演示如何使用指定为字符串的连接批量加载数据。 实例关闭时, SqlBulkCopy 连接会自动关闭。 在此示例中,源数据首先从SQL Server表读取到SqlDataReader实例。 源数据不必位于 SQL Server;可以使用可读取到 或加载到 IDataReader 的任何DataTable数据源。

重要

除非已按批量复制示例设置中所述创建了工作表,否则此示例不会运行。 提供此代码是为了演示仅使用 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;";
    }
}

注解

在大容量复制操作结束时,连接会自动关闭。 如果 connectionString 为 null, ArgumentNullException 则引发 。 如果 connectionString 是空字符串, ArgumentException 则引发 。

适用于

SqlBulkCopy(String, SqlBulkCopyOptions)

根据提供的 初始化并打开 的新实例SqlConnectionconnectionString . 此构造函数使用此 SqlConnection 来初始化 SqlBulkCopy 类的新实例。 实例 SqlConnection 的行为取决于 中提供的选项copyOptions 参数一起使用的多个参数集的序列。

public:
 SqlBulkCopy(System::String ^ connectionString, Microsoft::Data::SqlClient::SqlBulkCopyOptions copyOptions);
public SqlBulkCopy (string connectionString, Microsoft.Data.SqlClient.SqlBulkCopyOptions copyOptions);
new Microsoft.Data.SqlClient.SqlBulkCopy : string * Microsoft.Data.SqlClient.SqlBulkCopyOptions -> Microsoft.Data.SqlClient.SqlBulkCopy
Public Sub New (connectionString As String, copyOptions As SqlBulkCopyOptions)

参数

connectionString
String

定义将打开的且由 SqlBulkCopy 实例使用的连接的字符串。 如果连接字符串未使用Integrated Security = true ,可以使用 SqlBulkCopy(SqlConnection)SqlBulkCopy(SqlConnection, SqlBulkCopyOptions, SqlTransaction)SqlCredential 来更安全地传递用户 ID 和密码,而不是将用户 ID 和密码指定为连接字符串中的文本。

copyOptions
SqlBulkCopyOptions

SqlBulkCopyOptions 枚举中的值的组合,可确定将哪些数据源行复制到目标表中。

示例

以下控制台应用程序演示如何使用指定为字符串的连接执行大容量加载。 将选项设置为在加载目标表时使用源表的标识列中的值。 在此示例中,源数据首先从SQL Server表读取到SqlDataReader实例。 源表和目标表各包含一个 Identity 列。 默认情况下,在目标表中为添加的每一行生成 标识 列的新值。 在此示例中,打开连接时会设置一个选项,该选项强制批量加载进程改用源表中的 Identity 值。 若要查看 选项如何更改大容量加载的工作方式,请使用 dbo 运行示例。BulkCopyDemoMatchingColumns 表为空。 从源加载所有行。 然后再次运行示例,而不清空表。 引发异常,代码会向控制台写入一条消息,通知你由于主键约束冲突而未添加行。

重要

除非已按批量复制示例设置中所述创建了工作表,否则此示例不会运行。 提供此代码是为了演示仅使用 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();

            // Create the SqlBulkCopy object using a connection string 
            // and the KeepIdentity option. 
            // 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, SqlBulkCopyOptions.KeepIdentity))
            {
                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;";
    }
}

注解

可以获取有关主题中 SqlBulkCopyOptions 所有大容量复制选项的详细信息。

适用于

SqlBulkCopy(SqlConnection, SqlBulkCopyOptions, SqlTransaction)

使用 提供的现有打开实例 SqlBulkCopy 初始化 类的新实例 SqlConnection 。 实例 SqlBulkCopy 的行为取决于 中提供的选项copyOptions 参数一起使用的多个参数集的序列。 如果提供非空 SqlTransaction,则复制操作将在该事务中执行。

public:
 SqlBulkCopy(Microsoft::Data::SqlClient::SqlConnection ^ connection, Microsoft::Data::SqlClient::SqlBulkCopyOptions copyOptions, Microsoft::Data::SqlClient::SqlTransaction ^ externalTransaction);
public SqlBulkCopy (Microsoft.Data.SqlClient.SqlConnection connection, Microsoft.Data.SqlClient.SqlBulkCopyOptions copyOptions, Microsoft.Data.SqlClient.SqlTransaction externalTransaction);
new Microsoft.Data.SqlClient.SqlBulkCopy : Microsoft.Data.SqlClient.SqlConnection * Microsoft.Data.SqlClient.SqlBulkCopyOptions * Microsoft.Data.SqlClient.SqlTransaction -> Microsoft.Data.SqlClient.SqlBulkCopy
Public Sub New (connection As SqlConnection, copyOptions As SqlBulkCopyOptions, externalTransaction As SqlTransaction)

参数

connection
SqlConnection

将用于执行批量复制操作的已经打开的 SqlConnection 实例。 如果连接字符串未使用Integrated Security = true ,可以使用 SqlCredential 比将用户 ID 和密码指定为连接字符串中的文本更安全地传递用户 ID 和密码。

copyOptions
SqlBulkCopyOptions

SqlBulkCopyOptions 枚举中的值的组合,可确定将哪些数据源行复制到目标表中。

externalTransaction
SqlTransaction

现有的 SqlTransaction 实例,批量复制操作将在该实例下进行。

注解

如果选项包含 UseInternalTransaction 并且 externalTransaction 参数不为 null,则会引发 InvalidArgumentException

有关演示如何在事务中使用 SqlBulkCopy 的示例,请参阅 事务和大容量复制操作

另请参阅

适用于