Я знаю, что мне нужно обернуть имена столбцов пробелами в квадратных скобках []
. Я делаю это, когда создаю столбцы 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
и таблицы базы данных.
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
останова при выполнении ColumnMapping
, col.ColumName
правильно содержит квадратные скобки вокруг имен с пробелами в них.
Однако, когда он пытается вызвать метод WriteToServer
, он терпит неудачу и исключение говорит
Данное имя столбца «Имя с пространством» не соответствует ни одному столбцу в источнике данных.
Почему / где он удаляет квадратные скобки и как я могу исправить эту проблему?
Не уверен, что это связано с версией .net или sql-сервера, на которую я нажимаю, но я был не прав, и мне не нужно было добавлять квадратные скобки вокруг имен моих столбцов. В любом случае, они правильно обрабатывают пробелы.
Если вы хотите вставить все столбцы, вам не нужно иметь сопоставление. Вы можете удалить это:
foreach (DataColumn col in dataTable.Columns)
{
sqlBulkCopy.ColumnMappings.Add(col.ColumnName, col.ColumnName);
}