我知道我需要用方括號內的空格來包裝任何列名稱[]
。我在建立我的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「名稱與空間,」不與數據源的任何列匹配。
爲什麼/它在哪裏去掉方括號,以及如何解決這個問題?
我可能是錯的,但我認爲括號的價值是防止與保留名稱的衝突。對於帶空格的名稱,我想知道是否將它們包含在引號中(無論是單引號還是雙引號)都可以起作用? –
嘗試在添加ColumnMappings時刪除方括號。 – cubrr
是的,不添加括號似乎已修復它。我認爲SQL總是需要他們來處理空間。我試圖寫我的代碼之前,我已經搜索並找到了下面的帖子,證實了我。這只是新系統自動正確處理的東西嗎? http://stackoverflow.com/questions/23335920/how-to-add-column-mapping-in-sqlbulkcopy-in-c-sharp-where-column-names-contains – wham12