Я знаю, что мне нужно обернуть имена столбцов пробелами в квадратных скобках []
. Я делаю это, когда создаю свои колонки 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