2016-12-01 2 views
0

Я пытаюсь связать значение 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.

ответ

1

Попробуйте установить точность 3 для сервера Sql и столбцов datetime. У них только точность 3. Вы можете легко проверить это с помощью SQL Server Management Studio и попытаться установить значение с точностью выше 3 - вы не получите никакой ошибки, но будут сохранены только 3 цифры дроби.

Обратите внимание, что есть SQLDescribeParam функции, которая возвращает информацию о десятичных цифрах и точных значениях параметра в запросе: https://msdn.microsoft.com/en-us/library/ms710188(v=vs.85).aspx

Update, о вопросе от комментария: Вы должны указать дробную часть в полном диапазоне от 1 до 999'999'9999. Но, если я помню это право, Sql Server, например, с точностью до 3, будет принимать значения, в которых последние 6 цифр дробной части равны 0.

Образец: он будет работать нормально для частичной части 111'000'000 (что соответствовало бы 111'000'000/1'000'000'000 секунд), но установив дробную часть 111'100 '000 будет терпеть неудачу с ошибкой о недопустимой фракции или аналогичной.

+0

Означает ли это, что мне нужно установить дробную часть «SQL_TIMESTAMP_STRUCT» на номера в диапазоне 0-999 или я могу всегда отправлять номер в полном диапазоне 0-999,999,999, и сервер сам его преобразует? – omusil

+0

Благодарим за разъяснения. – omusil

Смежные вопросы