2013-08-29 51 views

回答

1

最佳方法是使用table-valued parameters(TVP)批量傳遞數據作爲SQL Server存儲過程的參數。

次要的是在.NET中使用SQlBulkCopy class,它也可以接受DataTable作爲參數。

0

大容量複製將是一個不錯的選擇。

Bulk Copy Reference

using System.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;"; 
    } 
} 
相關問題