1

我知道我需要用方括号中的空格将任何列名括起来[]。当我建立我的DataTable专栏时,我会这样做。

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

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

   dt.Columns.Add(colname);
}

然后,一旦我将所有数据作为行添加到 my 中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 'Name With Space' 与数据源中的任何列都不匹配。

为什么/在哪里去掉方括号,我该如何解决这个问题?

4

2 回答 2

2

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

于 2015-12-11T19:50:34.157 回答
0

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

    foreach (DataColumn col in dataTable.Columns)
    {
            sqlBulkCopy.ColumnMappings.Add(col.ColumnName, col.ColumnName);
    }
于 2015-12-08T21:01:10.963 回答