SqlBulkCopy 在其中包含空格的列上失败

SqlBulkCopy fails on columns with spaces in them

我知道我需要用方括号 [] 中包含空格的所有列名称。我在构建 DataTable 专栏时这样做。

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

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

   dt.Columns.Add(colname);
}

然后,一旦我将所有数据作为行添加到我的 DataTable 中,我调用一个插入函数,它使用下面的代码来映​​射列。 DataTable 和数据库 table.

中的列名相同
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 方法时,它失败了,异常显示

The given ColumnName 'Name With Space' does not match up with any column in data source.

Why/where 是否去掉了方括号,我该如何解决这个问题?

如果您想插入所有列,则不需要映射。你可以删除这个:

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

不确定这是否与我访问的 .net 或 sql 服务器的版本有关,但我错了,不需要在我的列名称周围添加方括号。它无论如何都能正确处理其中的空格。