Я пытаюсь использовать SqlBulkCopy для копирования данных в таблицу базы данных SQL, но он (ошибочно) говорит о том, что столбцы не совпадают. Они подходят. Если я использую точку останова, чтобы увидеть имена отображаемых столбцов, они верны. В сообщении об ошибке отображается имя столбца, и оно является правильным.
Это мой метод. У меня есть идентичный метод, который работает, и единственная разница в том, откуда он получает имена столбцов. Однако строки, содержащие имена столбцов, являются ТОЧНО одинаковыми.
public static bool ManualMapImport(DataTable dataTable, string table)
{
if(dataTable != null)
{
SqlConnection connection = new SqlConnection(connectionString);
SqlBulkCopy import = new SqlBulkCopy(connection);
import.DestinationTableName = "[" + table + "]";
foreach (string s in Global.SelectedColumns)
{
/* The s string variable here is the EXACT same as
the c.ToString() in the other method below */
if (ColumnExists(table, s))
import.ColumnMappings.Add(s, s);
else
return false;
}
connection.Open();
import.WriteToServer(dataTable); //Error happens on this line
connection.Close();
return true;
}
else
{
return false;
}
}
Это почти идентичный рабочий метод:
public static bool AutoMapImport(DataTable dataTable, string table)
{
if (dataTable != null)
{
SqlConnection connection = new SqlConnection(connectionString);
SqlBulkCopy import = new SqlBulkCopy(connection);
import.DestinationTableName = "[" + table + "]";
foreach (DataColumn c in dataTable.Columns)
{
if (ColumnExists(table, c.ToString()))
import.ColumnMappings.Add(c.ToString(), c.ToString());
else
return false;
}
connection.Open();
import.WriteToServer(dataTable);
connection.Close();
return true;
}
else
{
return false;
}
}
Если это помогает, имена столбцов: ACT_Code, ACT_Paid, ACT_Name, ACT_Terminal_Code, ACT_TCustom1, ACT_TCustom2. Они абсолютно одинаковы в самой базе данных. Я знаю, что отображения SqlBulkCopy чувствительны к регистру, а имена столбцов действительно правильны.
Это сообщение об ошибке:
Необработанное исключение типа «System.InvalidOperationException» произошло в System.Data.dll
Дополнительная информация: данное ColumnName 'ACT_Code' не соответствует ни одному столбцу в источнике данных.
Надеюсь, я просто пропустил что-то очевидное здесь, но я хорошо и по-настоящему потерял.
Большое спасибо.
EDIT: для тех, у кого есть такая же проблема, как и я, вот как я ее исправил.
Вместо того, чтобы метод
ManualMapImport()
был почти клонирован вAutoMapImport()
, яAutoMapImport()
его через столбцы данных и изменил имена, а затем вызвалAutoMapImport()
с измененным datatable, исключая необходимость попробовать и сопоставить с обычными строками.
Согласно MSDN ( здесь ), метод DataColumn.ToString()
возвращает значение « Expression», если свойство установлено, в противном случае - свойство ColumnName. ».
Я всегда находил метод ToString()
для того, чтобы быть неустойчивым в любом случае (может измениться в зависимости от текущего состояния / условий), поэтому я бы рекомендовал вместо этого использовать свойство ColumnName
, поскольку именно вы пытаетесь выйти из ToString()
,
ОК, в противном случае я должен угадать, что это проблема с чувствительностью к регистру в именах столбцов в исходном datatable, поскольку SQLBulkCopy
очень чувствителен к регистру, даже если SQL DB нет. Чтобы решить эту проблему, я бы сказал, что когда вы проверяете, существует ли этот столбец, вы должны возвратить / использовать фактическую строку из самого списка столбцов datatable, вместо того, чтобы использовать любую строку, которая была передана. Это должно быть в состоянии исправить в любом случае или различий акцента, которые могут игнорироваться в вашей процедуре ColumnsExist.