2015-12-08 2 views
1

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

Зачем/где он удаляет квадратные скобки и как исправить эту проблему?

+0

Возможно, я ошибаюсь, но я думаю, что значение скобок заключается в защите от столкновения с зарезервированными именами. Для имен с пробелами, интересно, работали ли их в кавычках (одно или два)? –

+0

Попробуйте удалить квадратные скобки при добавлении ColumnMappings. – cubrr

+0

Да, не добавляя скобки, похоже, исправил это. Я думал, что SQL всегда нуждался в них, чтобы иметь дело с пробелами. Я искал и нашел следующее сообщение, которое подтвердило это, прежде чем пытаться написать мой код. Это только то, что новые системы автоматически обрабатывают правильно? http://stackoverflow.com/questions/23335920/how-to-add-column-mapping-in-sqlbulkcopy-in-c-sharp-where-column-names-contains – wham12

ответ

0

Не уверен, если это имеет отношение к версии .net или SQL-сервера я ударяя, но я был неправ, и не нужно добавлять квадратные скобки вокруг моего имена столбцов. В любом случае, они правильно обрабатывают пробелы.

0

Если вы хотите вставить все столбцы, вам не нужно иметь сопоставление. Вы можете удалить это:

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

Я не вставляю все столбцы, которые находятся в таблицу базы данных (и я не имею их в том же порядке). – wham12

+0

А, я не могу сказать вам, в чем проблема, но я могу дать вам обход. Создайте один временной интервал или скажем, что таблица промежуточного уровня будет иметь ту же структуру, что и ваша таблица данных. Затем добавьте туда массу и после этого храните процедуру, которая будет перемещать данные из этой таблицы temp (staging) в исходную таблицу. –

Смежные вопросы