2014-10-29 159 views
0

我不知道爲什麼數據沒有進入SQL。有人可以檢查一下,看看我的代碼有什麼問題嗎?我最下面的代碼從和MSDN頁:http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlbulkcopy(v=vs.110).aspx使用SqlBulkCopy插入到SQL

Dim connectionString As String = "Server= "<servername>"; integrated security=true" 

    Using sourceConnection As SqlConnection = _ 

     New SqlConnection(connectionString) 
     sourceConnection.Open() 

     Dim commandSourceData As SqlCommand = New SqlCommand(<TSQL>), sourceConnection) 
     Dim reader As SqlDataReader = commandSourceData.ExecuteReader 

     Using destinationConnection As SqlConnection = _ 
      New SqlConnection(connectionString) 
      destinationConnection.Open() 

      Using bulkcopy As SqlBulkCopy = _ 
       New SqlBulkCopy(destinationConnection) 
       bulkcopy.DestinationTableName = _ 
        "<tableName>" 

       Try 
        bulkcopy.WriteToServer(reader) 
       Catch ex As Exception 
        Console.WriteLine(ex.Message) 
       Finally 
        reader.Close() 
       End Try 

      End Using 
     End Using 
     sourceConnection.Close() 
    End Using 
+1

是否有錯誤訊息?源查詢是否導致任何記錄?這應該不重要,但爲了以防萬一在bulkcopy.WriteToServer(reader)之前添加'bulkcopy.BatchSize = 500'和'bulkcopy.BulkCopyTimeout = 2400'。批量優化運行,但在這種情況下應該不會有太大影響,您可以使用值來查看哪個編號最適合您。如果您遇到超時情況,'bulkCopy.BulkCopyTimeout'實際上可能會有所幫助。 – George 2014-10-29 18:34:19

+0

您是批量複製到新表還是已經存在的表?如果有新表,它確實存在嗎?如果不存在,我不相信批量複製會創建一個表。如果已經存在,那麼遵循Tim的建議。我不會在你的邏輯中看到任何特定的錯誤,你的代碼實際上非常接近我的,並且在批量複製到臨時表時我沒有使用'ColumnMappings'。 PS:爲了統治我們愚蠢而明顯的東西,「」不是真正的目的地名稱,是嗎? – George 2014-10-29 19:19:53

+0

沒有錯誤信息。我正在複製到我的數據庫中的現有表。並且,不,ha,僅用於此發佈。我正在閱讀更多關於ColumnMappings的內容,但還沒有多少運氣。 – 2014-10-29 20:04:05

回答

3

在我做了BulkCopy系統,我設置的列映射爲文檔Column Mapping - SQL Bulk Copy

的映射成立解釋與源和目標列名稱。這個例子是從文檔:

Dim mapID As New _ 
       SqlBulkCopyColumnMapping("ProductID", "ProdID") 
      bulkCopy.ColumnMappings.Add(mapID) 

當我第一次設置這個,我記得有麻煩,沒有明確地設置我的環境中的列映射。

1

如果數據源的字段類型,字段順序,字段計數與目標表不相同。您的批量複製將返回失敗。

在上面的情況下,您應該將datasoruce中每個字段的ColumnMappings指定給sqlbulkcopy對象。

  SqlBulkCopy copy = new SqlBulkCopy(MySqlConn); 
      copy.BulkCopyTimeout = 6000; 
      copy.DestinationTableName = TableName; 
      for (int i = 0; i < this.lstBulkFields.Count; i++) { 
       // if the source fields name are the same with the targets. 
       copy.ColumnMappings.Add(this.lstBulkFields[i], this.lstBulkFields[i]); 
      } 
      copy.BatchSize = BatchSize; 
      copy.WriteToServer(MyDataSource); 
相關問題