Я пытаюсь связать значение SQL_TYPE_TIMESTAMP с использованием столбцов ODBC для DATETIME и/или TIMESTAMP в базе данных MS SQL Server и не работает со следующими ошибка:Невозможно связать значение SQL_TYPE_TIMESTAMP с использованием ODBC с сервером MS SQL (значение HY104: недопустимое значение точности)
[HY104] (native 0): [Microsoft][ODBC Driver 11 for SQL Server]Invalid precision value
Кто-нибудь знает, в чем проблема? Я связывание значения, как это:
TIMESTAMP_STRUCT* tval = getTimestampFromSomewhere();
SQLRETURN ret = SQLBindParameter(stmt, column, SQL_PARAM_INPUT, SQL_C_TYPE_TIMESTAMP, SQL_TYPE_TIMESTAMP, 29, 9, tval, sizeof(TIMESTAMP_STRUCT), 0);
ColSize устанавливается на 29, потому что согласно Column Size docs, для TIMESTAMP типа должен быть:
20+s (the number of characters in the yyyy-mm-dd hh:mm:ss[.fff...] format, where s is the seconds precision)
и секунду точности (точность поля фракции) является 9, потому что:
The value of the fraction field is the number of billionths of a second and ranges from 0 through 999,999,999. (source)
ДесятичныеЦифры установлен на 9, потому что для всех типов даты и времени, за исключением SQL_TYP E_DATE это
The number of digits to the right of the decimal point in the seconds part of the value (fractional seconds). (source)
Согласно ответа на this question, это не должно быть возможным, чтобы вставить значение в столбец TIMESTAMP, но он не работает с колонкой DATETIME для меня тоже. И ИМО проблема с TIMESTAMP должна произойти при фактическом выполнении команды, а не только при привязке значений. Поэтому я думаю, что это что-то еще.
Тот же самый код работает для TIMESTAMP колонки + SQL_TYPE_TIMESTAMP с PostgreSQL 9.2.15 (драйвер "PostgreSQL Unicode" 9.3.300),
и DATETIME и TIMESTAMP столбцов + SQL_TYPE_TIMESTAMP с MySQL 5.5.50 (драйвер " MySQL ODBC 5.3 Unicode Driver "5.3.6).
Кстати, я запускаю Xubuntu 16.04 64bit, версия SQL Server 12.0.2569 (работает в Windows 10), и я использую «ODBC Driver 11 для SQL Server» версии 11.0.2270.
Означает ли это, что мне нужно установить дробную часть «SQL_TIMESTAMP_STRUCT» на номера в диапазоне 0-999 или я могу всегда отправлять номер в полном диапазоне 0-999,999,999, и сервер сам его преобразует? – omusil
Благодарим за разъяснения. – omusil