Позвольте мне начать с того, что взаимодействие с ODBC datetime2 было ужасно задокументировано в MSDN.После чрезмерных усилий методом проб и ошибок, поиска в MSDN (вплоть до документов SQL Server Denali CTP), множества форумов и т. Д., Вот способ правильно связать параметр DATETIME2 (7) вODBC:
// This is a sample SQL_TIMESTAMP_STRUCT object, representing:
// 1987-06-05T12:34:45.1234567
// Notice the two zeroes at the end of the fractional part?
// These _must_ be zeroes, because the fractional part is in nanoseconds!
// If you put non-zeroes in this part, you _will_ get a binding error.
SQL_TIMESTAMP_STRUCT ts=
{1987,6,5,12,34,45,123456700};
SQLRETURN result=::SQLBindParameter(hStmt,
2, // Parameter idx in my original question
SQL_PARAM_INPUT,
SQL_C_TIMESTAMP,
SQL_TYPE_TIMESTAMP,
// Next is the length of the _string_ repr. of the DATETIME2(7) type! WTF???
// It should be 20 + {the value of the precision of the DATETIME2}
// Remember that we are using: 1987-06-05T12:34:45.1234567 for this example
27,
7, // This is the precision of the DATETIME2
&ts,
sizeof(ts),
NULL);
if (result!=SQL_SUCCESS)
...
Я надеюсь, что это поможет следующему человеку перенести гнев ODBC и DATETIME2
.