Новый драйвер OLEDB (MSOLEDBSQL) не может сохранить дробную часть datetime (.fff) на сервере SQL - PullRequest
0 голосов
/ 14 февраля 2019

Я использую приложение dot net с c #.Поскольку я хочу отключить TLS 1.0. Я должен изменить старый драйвер OLEDB на новый (MSOLEDBSQL).

Но проблема в том, когда я собираюсь сохранить значение даты в миллисекундах на сервере sql.Новый драйвер хранит только yyyy-mm-dd HH:MM:SS.Я хочу yyyy-mm-dd HH:MM:SS.fff

Я пытаюсь использовать приведенный ниже код

OleDbCommand cmd = new OleDbCommand(query, m_conn, m_trans);
DataTable table = new DataTable();
DateTime dt = Convert.ToDateTime("2015-03-23 11:22:33.123");
OleDbParameter param = new OleDbParameter("", OleDbType.Date);
param.Value = dt;
param.Size = 16;
param.Precision = 23;
param.Scale = 3;
cmd.Parameters.Add(param);
cmd.CommandType = CommandType.StoredProcedure;

OleDbDataAdapter da = new OleDbDataAdapter(cmd);
da.Fill(table);
da.Dispose();
cmd.Dispose();

, новый драйвер пропускает дробную часть datetime?Какие изменения необходимы, если я хочу сохранить дату в миллисекундах.

1 Ответ

0 голосов
/ 10 апреля 2019

У нас похожая проблема, когда у нас с новым драйвером MSOLEDBSQL есть 'DataTypeCompatibility=80' в строке подключения.Это изменение в сочетании с отсутствием явного указания масштаба приводит к усечению секунд, а также долей секунды.

Таким образом, значение, представленное как

'1994-08-21 21:21:36.123'

, будет сохранено как

'1994-08-21 21:21:00.000'

Однако в вашем случае вы пытались изменить тип OLE DB параметра наDBTimeStamp?

Преобразование клиента в сервер из типа Date в DbTimeStamp (datetime / datetime2), по-видимому, использует следующую логику (https://docs.microsoft.com/en-us/sql/connect/oledb/ole-db-date-time/conversions-performed-from-client-to-server?view=sql-server-2017):

Сохраняется семантика преобразования до SQL Server 2008 для DBTYPE_DATE. Дробные секунды усекаются до нуля.

...