Получить номер строки, на которой запрос к базе данных завершился с ошибкой - PullRequest
0 голосов
/ 24 мая 2018

Я использую этот код для отправки запроса 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);

Пожалуйста, помогите мне кому-нибудь ...

1 Ответ

0 голосов
/ 25 мая 2018

Я считаю, что единственный способ идентифицировать строку по ошибке из чисто SqlBulkCopy - это использовать свойство NotifyAfter + SqlRowsCopied event + BatchSize = 1.

Из них теперь вы можете легко получить свойство Index, которое вы увеличиваете для каждой успешно скопированной строки, и вы сможете найти индекс по ошибке.

Например, выдается ошибка, и выПопробуйте с NotifyAfter = 1

bulkCopy.SqlRowsCopied += new SqlRowsCopiedEventHandler(OnSqlRowsCopied);
bulkCopy.NotifyAfter = 1;
bulkCopy.BatchSize = 1;

Очевидно, что это не лучшее решение с точки зрения производительности, но вы найдете вашу информацию.

РЕДАКТИРОВАТЬ : Ответить на комментарий

Извините, но можно ли получить значение строки-столбца с ошибкой?

Я так не думаю.Мы не знаем точно, в каком столбце возникла проблема с сообщением об ошибке.

...