2015-11-07 4 views
1

Я пытаюсь связать Datetime2 параметр, используя SQLBindParameter для SQL_TYPE_TIMESTAMP типа данных, как показано нижеКак связать datetime2 (SQL_C_TYPE_TIMESTAMP) с помощью SQLBindParameter?

SQLBindParameter(hStmt, 7, SQL_PARAM_INPUT, SQL_C_TYPE_TIMESTAMP, SQL_TYPE_TIMESTAMP, 0, 0, &datetime2, 0, NULL);

также попытался это:

rc = SQLBindParameter(hStmt, 8, SQL_PARAM_INPUT, SQL_C_TYPE_TIMESTAMP, SQL_TYPE_TIMESTAMP, SQL_TIMESTAMP_LEN + 1, 7, &rec.datetime2, 0, NULL);

гс 0

когда я exceute запрос (INSERT) SQLExecDirect(hStmt, const_cast<wchar_t*>(query.c_str()), SQL_NTS); Я получаю 2 2008 sqlstate ошибка, указывающая переполнение поля Datetime;

Я искал какой-либо пример кода для этого типа данных и не смог найти какой-либо рабочий пример, есть ли у него ниндзя, у которого есть решение для этого типа? он отлично подходит для SQL_TYPE_TIME с точностью 7.

+0

Сначала я подумал, что существует специальное расширение для Datetime2 (например, есть время2), но его нет - https://msdn.microsoft.com/en-us/library/bb677267.aspx Можете ли вы показать значения, которые вы заполняете в 'SQL_TIMESTAMP_STRUCT', который связан как входной параметр? – erg

+0

@верно, это значение 'SQL_TIMESTAMP_STRUCT datetime2; datetime2.year = 1999; datetime2.month = 2; datetime2.day = 3; datetime2.hour = 8; datetime2.minute = 20; datetime2.second = 30; datetime2.fraction = 123; ' – Genjutsu

ответ

1

я получаю ту же ошибку в SQL Server 2014: Если я связываю с помощью nResult = SQLBindParameter(hstmt, 1, SQL_PARAM_INPUT, SQL_C_TYPE_TIMESTAMP, SQL_TIMESTAMP, 0, 0, &ts, sizeof(ts), &cbValue); , я получаю:

ERROR; native: 0; state: 22008; msg: [Microsoft][ODBC Driver 11 for SQLerver]Datetime field overflow. Fractional second precision exceeds the scale specified in the parameter binding.

Итак, я попытался разобраться, что сервер на самом деле ожидает, с кодом, как это:

nResult = SQLPrepare(hstmt, (SQLWCHAR*)L"INSERT INTO tTestTable (myTestCol, d2) VALUES(100, ?)", SQL_NTS); 

SQLSMALLINT DataType, DecimalDigits, Nullable; 
SQLUINTEGER ParamSize; 

nResult = SQLDescribeParam(hstmt, 1, &DataType, &ParamSize, &DecimalDigits, &Nullable); 
if (!SQL_SUCCEEDED(nResult)) 
{ 
    printErrStmt(hstmt); 
} 
std::wcout << L"ParamSize: " << ParamSize << L"; DecimalDigits: " << DecimalDigits << std::endl; 

Это печатает:

ParamSize: 27; DecimalDigits: 7

Итак, давайте попробуем с 27 и 7 и фракция 123 - и я все еще получаю ошибку:

ERROR; native: 0; state: 22008; msg: [Microsoft][ODBC Driver 11 for SQL erver]Datetime field overflow. Fractional second precision exceeds the scale specified in the parameter binding.

Но потом я нашел образец здесь Microsoft: https://msdn.microsoft.com/de-de/library/ff878122%28v=sql.120%29.aspx Этот пример делает вещи еще более запутанной, как они делают то же самое? Подождите - разница в том, что они используют значение фракции только 100 - может это изменить? Да. Изменение доли до 100 заставляет все работать. Зачем?

Посмотрите на SQL Server 2014 напрямую. Если я вставил строку (из ODBC) с долей 100, это будет отображаться (в SQL Server Management Studio) как: 1999-02-03 08:20:30.0000001. Помните, что фракция именно: Из документов в MS: https://msdn.microsoft.com/en-us/library/ms714556%28v=vs.85%29.aspx

[b] The value of the fraction field is the number of billionths of a second and ranges from 0 through 999,999,999 (1 less than 1 billion). For example, the value of the fraction field for a half-second is 500,000,000, for a thousandth of a second (one millisecond) is 1,000,000, for a millionth of a second (one microsecond) is 1,000, and for a billionth of a second (one nanosecond) is 1.

Итак: Фракцию 100 бы 100 миллиардных долей секунды, это 000,000,100. Но поле Datetime2 имеет точность 7. В последней части 00 ошибок округления нет. Но если вы перейдете в 123, это будет 000,000,123. Это невозможно сохранить в datetime с точностью 7.. Если мы изменим 123 на 12300, вещь может быть сохранена: она соответствует 000,012,300, это соответствует дате времени с точностью 7, и SQL Server наконец отображает: 1999-02-03 08:20:30.0000123.

Надеюсь, это поможет, и я надеюсь, что я понял и объяснил правду.

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