Класс SqlBulkCopy в C# меняет значение numeri c - PullRequest
0 голосов
/ 10 июля 2020

Я использую SqlBulkCopy.WriteToServer -метод для вставки большого количества данных в таблицу базы данных. Когда я передаю datatable в качестве параметра метода WriteToServer, некоторые числовые c значения (numeric(17,6)) вычитаются на .000001, пока они вставляются в таблицу базы данных. Но не все значения меняются, это происходит случайно, не удалось определить закономерность. eg- 10068.121 заменяется на 10068.120999

Теперь, когда я передаю datareader в качестве параметра метода WriteToServer, он работает нормально, значения numeri c остаются неизменными.

Есть идеи, почему это происходит для datatable, а не для datareader? Мое приложение - это консольное приложение C#.

Вот мой код ... если я передаю данные (_dt) методу _sqlBulkCopy.WriteToServer, тогда у меня возникнет проблема. Но когда я конвертирую datatable (_dt) в DataTableReader (_Reader), он работает нормально.

DataTable _dt = new DataTable();
_odbCDA.Fill(_dt);
DataTableReader _Reader = new DataTableReader(_dt);

using (SqlBulkCopy _sqlBulkCopy = new SqlBulkCopy(_sqlConnectionString)) 
{
     _sqlBulkCopy.BulkCopyTimeout = 3600;
     _sqlBulkCopy.DestinationTableName = _tableName;
     _sqlBulkCopy.WriteToServer(_Reader); //This works
     //_sqlBulkCopy.WriteToServer(dt); //This is having the issue
     _sqlBulkCopy.Close();
}

1 Ответ

0 голосов
/ 10 июля 2020

Трудно быть уверенным без примера воспроизведения, но если бы мне пришлось угадывать, когда вы используете DataReader, вы копируете данные между двумя таблицами, которые имеют одинаковое определение / точность для типа numeri c, но при использовании DataTable столбец не имеет точности совпадения. Предположительно это потому, что DataReader не отображает вещи в типы. NET, а DataTable - это.

I think (но не тестировал). NET типы отображаются примерно так (по крайней мере, на SQL сервере):

  • C# float -> SQL real
  • C# double -> SQL float
  • C# decimal -> SQL money или numeric

SQL позволяет указать точность в способов C# не работает, поэтому, если вы работаете со встроенными типами C#, существует вероятность solid, что вы выполняете преобразования в numeric(17,6) и обратно, что может привести к потере точности.

Если мое предположение верно, то DataType на затронутом DataColumn в DataTable будет примерно таким: System.Double, System.Single или System.Decimal.

...