Как привязать значение к хранимому параметру proc типа DATETIME2 (7), используя ODBC - PullRequest
1 голос
/ 06 июня 2011

Как правильно связать значение с сохраненным параметром proc типа DATETIME2(7), используя ODBC. Я хочу сделать что-то вроде:

{CALL myproc (?,?)}

Итак, давайте предположим, что первый аргумент - это int, а второй - DATETIME2. Я могу сделать:

// Bind parameter 1, which is an INT
int val=5;
SQLLEN len=sizeof(val);
SQLBindParameter(hstmt, 1, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 4, 0, 
                 &val, sizeof(val), &len);

// Bind parameter 2, a DATETIME2(7) value
// How do I do this??? How do I store the DATETIME2(7) value so that it can be
// bound and is not a string or degenerate DATETIME type

Спасибо за любую помощь!

1 Ответ

3 голосов
/ 07 июня 2011

Позвольте мне начать с того, что взаимодействие с 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...