Я использую этот код для отправки запроса SQL:
SqlBulkCopy bulkCopy = new SqlBulkCopy(Connection);
foreach (DataColumn column in dt.Columns)
{
bulkCopy.ColumnMappings.Add(column.ColumnName, column.ColumnName);
}
bulkCopy.DestinationTableName = "nsi." + classifierData.Info.TableName;
bulkCopy.WriteToServer(dt);
и получить это исключение:
Получена недопустимая длина столбца из клиента bcp для colid
Есть ли способ определить, какая строка вызывает ошибку?
Я пытался использовать это, но он не работает (значения всегда одинаковые):
FieldInfo currentRow = typeof(SqlBulkCopy).GetField("_currentRowLength", BindingFlags.NonPublic | BindingFlags.GetField | BindingFlags.Instance);
var currentRowNumber = currentRow.GetValue(bulkCopy);
FieldInfo _rowsCopiedField = typeof(SqlBulkCopy).GetField("_rowsCopied", BindingFlags.NonPublic | BindingFlags.GetField | BindingFlags.Instance);
var currentRowN = _rowsCopiedField.GetValue(bulkCopy);
Пожалуйста, помогите мне ...
Я считаю , что единственным способом определить строку ошибки чисто SqlBulkCopy
использует NotifyAfter свойства + SqlRowsCopied события + BATCHSIZE = 1.
Из этого теперь вы можете легко получить свойство Index
которое вы увеличиваете для каждой успешно скопированной строки, и вы сможете найти индекс по ошибке.
Например, NotifyAfter = 1
ошибка, и вы повторно пытаетесь использовать NotifyAfter = 1
bulkCopy.SqlRowsCopied += new SqlRowsCopiedEventHandler(OnSqlRowsCopied);
bulkCopy.NotifyAfter = 1;
bulkCopy.BatchSize = 1;
Очевидно, что это не лучшее решение с высокой эффективностью, но вы найдете свою информацию.
EDIT : ответьте комментарий
Извините, но могу ли я получить значение row-column с ошибкой?
Я так не думаю. Мы не знаем точно, в каком столбце есть проблема с сообщением об ошибке.