2010-06-29 24 views
4

我正在使用SqlBulkCopy從外部數據庫導入。當導入到nvarchar列時,如果該列不夠大以容納傳入字符串,則該列失敗:如何獲取SqlBulkCopy來告訴我哪個列有截斷錯誤

InvalidOperationException:數據源中String類型的給定值無法轉換爲類型nvarchar指定的目標列。字符串或二進制數據將被截斷。

我確定希望能夠告訴用戶什麼目標列有問題。我已經梳理了這個例外,但沒有看到它的任何地方。有沒有辦法設置事件,以便列的名稱或索引在異常中返回?

這裏是我的批量複製的僞代碼:

using (DbConnection source = DataTableProviderAssists.GetTypedDbConnection(package.ImportSourceType, package.UnencryptedConnectionString)) 
{ 
    using (DbCommand cmd = GetCommand(package, source)) 
    { 
     source.Open(); 

     reader = cmd.ExecuteReader(CommandBehavior.CloseConnection); 

     using (SqlBulkCopy bulkCopy = new SqlBulkCopy(RequestContext.ConnectionString, SqlBulkCopyOptions.TableLock)) 
     { 
      bulkCopy.DestinationTableName = temporaryTableName; 
      bulkCopy.BatchSize = 40000; 
      bulkCopy.BulkCopyTimeout = 60000; 

      foreach (ImportField field in package.Fields) 
      { 
       bulkCopy.ColumnMappings.Add(field.Name, field.Name); 
      } 

      bulkCopy.WriteToServer(reader); 
     } 
    } 
} 

感謝

回答

3

我不知道有。
您可能需要以不同的方式解決這個問題。
嘗試使用Microsoft.SqlServer.Management.Smo API查詢目標表,並找出表中列的最大長度。
一旦你有了這些,你可以預先讀取你的源數據,並立即觸發異常。
玩得開心。

+0

在這一點上,我會說你是對的。我處於ETL導入的上下文中,所以我不想在正常情況下放慢速度。所以,我最終選擇了「預覽模式」,可以慢慢導入,我可以自己進行驗證。 – ryanman 2010-07-21 17:10:21

0

我已經投票通過了批准的答案,因爲它對我有點幫助。

我決定使用SSIS來調查問題,雖然我花了30分鐘纔得到它的工作,但現在我有一個工具可以在未來解決同樣的問題。