Изменение поставщика в строке подключения на TLS1.2-совместимый приводит к сбою параметров с указанием даты и времени - PullRequest
0 голосов
/ 23 октября 2018

У меня есть существующее приложение, которое использует oledb через приложение, теперь требуется обновление для совместимости с TLS1.2.Поэтому я скачал Microsoft® OLE DB Driver 18 для SQL Server®, чтобы он работал, мне нужно было изменить провайдера в строке подключения с

Provider=SQLOLEDB; Server={0}; Database={1}; {2}; Connection Timeout=60;

на

Provider=SQLNCLI11; Server={0}; Database={1}; {2}; Connection Timeout=60;

Это привело к тому, что мои предыдущие запросы с параметрами были добавлены следующим образом:

cmd.Parameters.AddWithValue("@lastRun", lastRun.ToUniversalTime)

столбец, с которым я пытаюсь запросить параметр, имеет тип datetime

, когда я выполняю запросы с такими параметрами, каквсе они терпят неудачу с сообщением об ошибке, подобным этому:

"Преобразование не удалось для параметра команды [0] '', потому что значение данных превысило тип, используемый поставщиком."

с внутренним исключением:

"Дробная часть предоставленного значения времени переполняет масштаб соответствующего параметра или столбца SQL Server. Увеличьте bScale в DBPARAMBINDINFO или масштаб столбца, чтобы исправить эту ошибку."

, а вот трассировка стека: в System.Data.OleDb.OleDbCommand.ExecuteCommandTextErrorHandling (OleDbHResult hr) в System.Data.OleDb.OleDbCommand.ExecuteCommandTextForSingleResARDaseMaseDesultStateStateStateStateStateStateStateState)OleDb.OleDbCommand.ExecuteCommandText (Object & executeResult) в System.Data.OleDb.OleDbCommand.ExecuteReaderInternal (поведение CommandBehavior, метод String) в System.Data.OleDb.OleDbCommand.ExecuteReader (Command)(Набор данных DataSet, DataTable [] datatables, Int32 startRecord, Int32 maxRecords, String srcTable, команда IDbCommand, поведение CommandBehavior) в System.Data.Common.DbDataAdapter.Fill (DataTable [] dataTables, Int32 startRecord, Int32 maxRecords, команда IDbCommand, поведение CommandBehavior) в System.Data.Common.DbDataAdapter.Fill (DataTable dataTable)

, если я верну провайдера обратно в SQLOLEDB, тогда он будет работать нормально.До сих пор я обнаружил только проблему с полем даты.Я не проводил подробного тестирования, чтобы убедиться, что другие поля тоже могут иметь эту проблему.Кто-нибудь знает, что является причиной этого и возможных решений без изменения десятков тысяч запросов, которые были ранее написаны?

1 Ответ

0 голосов
/ 14 ноября 2018

Я столкнулся с той же проблемой.Кажется, есть 2 решения, оба меняют код

(1) Управляйте миллисекундами самостоятельно вместо использования DateTime.Now.Следующий код получит текущую дату без миллисекунд

DateTime currentDate = System.DateTime.Now;
currentDate = new DateTime(currentDate.Year, currentDate.Month, currentDate.Day, currentDate.Hour, currentDate.Minute, currentDate.Second);  // removes milliseconds & ticks

(2) Установите шкалу OleDbParameter

OleDbParameter parameter = new OleDbParameter("Price", OleDbType.Decimal); 
parameter.Value = 3.1416; 
parameter.Precision = 8; 
parameter.Scale = 4; 
...