Как избежать потери точности при использовании неявного преобразования (SqlParameter) с DateTime (C #), даже если я использую DateTime2 в моем SQL Server? - PullRequest
0 голосов
/ 18 июня 2019

Это мой столбец определения в моей базе данных.

enter image description here

У меня проблема с DateTime в C # и значением, которое сохраняется в моей базе данных SQL Server.

При отправке заявок: 2019-06-14 17:10:39.0192950

Сохраняет в SQL Server это: 2019-06-14 17:10:39.0200000.

И когда мне нужно проверить, существует ли файл в моей базе данных, используя следующую функцию:

protected Func<DateTime?, DateTime?, bool> TimeEquals = (x, y) => 
  x.Value.Hour == y.Value.Hour 
     && x.Value.Minute == y.Value.Minute
        && x.Value.Second == y.Value.Second && x.Value.Millisecond == y.Value.Millisecond;

Это мой код, когда я вставляю значения в базу данных SQL Server:

            foreach (var parameter in parameters)
            {
               command.Parameters.Add(new SqlParameter(
                        parameter.Label,
                        parameter.Value
                    ));
            }

У меня возникают проблемы с потерей точности. Каков наилучший способ не потерять точность при работе с датами между C# и SQL Server?

1 Ответ

3 голосов
/ 18 июня 2019

Обновление

После установления факта, что вы используете DateTime2(7) для хранения данных в вашей базе данных, следующие гипотезы, естественно, заключались в том, что где-то в вашем коде данные сохраняютсяв SQL Server DateTime.

Поскольку приоритет типа данных ставит DateTime2 в более высокий приоритет, чем DateTime, ясно, что это неявное преобразование внутри SQL.

Это оставляет нам единственную возможность неявного преобразования в DateTime SQL Server где-то между кодом c # и кодом SQL Server - и, конечно же, вот оно:

command.Parameters.Add(new SqlParameter(
    parameter.Label,
    parameter.Value
));

проблема с этим кодом - та же проблема , что и у метода AddWithValue - поскольку мы не предоставляем тип данных, драйвер ADO.Net должен его угадать - и, как написано в статье, - онугадал

Правильный способ добавить параметры в команду - это использовать одну из перегрузок Add, которая принимает как имя параметра, так и тип данных:

command.Parameters.Add("@ParamName", SqlDbType.DateTime2).Value = CSDateTimeInstance;

Из-за отсутствияВ этом контексте я не уверен, как вы можете включить это в свой код, но это правильное решение для этого случая.

Первая версия

В Sql Server,используйте DateTime2.
Возможно, вы используете DateTime с точностью до 1/300 секунды, в то время как DateTime2 имеет точность 100 нс.

из DateTime страница:

Точность С округлением до .000, .003 или .007 секунд.

От DateTime2 страница:

Точность, масштаб от 0 до 7 цифр, с точностью до 100 нс.Точность по умолчанию составляет 7 цифр.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...