2015-12-08 12 views
1

我知道我需要用方括號內的空格來包裝任何列名稱[]。我在建立我的DataTable列時會這樣做。SqlBulkCopy在其中有空格的列上失敗

for (int i = 0; i < columns.Count; i++) 
{ 
    string colname = columns[i].ToString(); 

    if (colname.Contains(" ")) 
    { 
     colname = "[" + colname + "]"; 
    } 

    dt.Columns.Add(colname); 
} 

然後,一旦我添加了所有數據行的在我的DataTable,我稱之爲插入功能,它使用下面的代碼來映​​射列。列名稱在DataTable和數據庫表中都是相同的。

using (var connection = new SqlConnection(ConnectionString)) 
{ 
    SqlTransaction transaction = null; 
    connection.Open(); 

    try 
    { 
     transaction = connection.BeginTransaction(); 

     using (var sqlBulkCopy = new SqlBulkCopy(connection, SqlBulkCopyOptions.TableLock, transaction)) 
     { 
      sqlBulkCopy.DestinationTableName = "DBTableName"; 

      foreach (DataColumn col in dataTable.Columns) 
      { 
       sqlBulkCopy.ColumnMappings.Add(col.ColumnName, col.ColumnName); 
      } 

      sqlBulkCopy.WriteToServer(dataTable); 
     } 

     transaction.Commit(); 
    } 
    catch (Exception) 
    { 
     transaction.Rollback(); 
    } 
} 

如果我設置斷點,當它是做ColumnMapping中,col.ColumName正確含有大約帶空格的名稱的方括號。

但是當它試圖調用WriteToServer方法,失敗和異常說

給定的ColumnName「名稱與空間,」不與數據源的任何列匹配。

爲什麼/它在哪裏去掉方括號,以及如何解決這個問題?

+0

我可能是錯的,但我認爲括號的價值是防止與保留名稱的衝突。對於帶空格的名稱,我想知道是否將它們包含在引號中(無論是單引號還是雙引號)都可以起作用? –

+0

嘗試在添加ColumnMappings時刪除方括號。 – cubrr

+0

是的,不添加括號似乎已修復它。我認爲SQL總是需要他們來處理空間。我試圖寫我的代碼之前,我已經搜索並找到了下面的帖子,證實了我。這只是新系統自動正確處理的東西嗎? http://stackoverflow.com/questions/23335920/how-to-add-column-mapping-in-sqlbulkcopy-in-c-sharp-where-column-names-contains – wham12

回答

0

不知道這是否與我打.NET或SQL Server的版本做的,但我錯了,也無需添加前後的方括號我列名稱。無論如何它都能正確處理它們中的空間。

0

如果你想插入所有列,那麼你不需要映射。您可以刪除此:

foreach (DataColumn col in dataTable.Columns) 
    { 
      sqlBulkCopy.ColumnMappings.Add(col.ColumnName, col.ColumnName); 
    } 
+0

我沒有插入所有列在數據庫表(我也沒有按照相同的順序)。 – wham12

+0

啊,我不能告訴你有什麼問題,但我可以給你解決方法。創建一個臨時表或者讓暫存表與您的數據表具有完全相同的結構。然後在那裏進行批量插入,然後調用存儲過程,將數據從該臨時表(臨時表)移動到原始表。 –