// Выделить память для идентификатора окружения //
if (SQL_SUCCESS != SQLAllocHandle(SQL_HANDLE_ENV, SQL_HANDLE_NULL, &m_hEnv))
return FALSE;
// Выбрать версию ODBC //
if (SQL_SUCCESS != SQLSetEnvAttr(m_hEnv, SQL_ATTR_ODBC_VERSION, (SQLPOINTER) SQL_OV_ODBC3, NULL))
return FALSE;
// Выделить память для идентификатора подключения Fancy //
if (SQL_SUCCESS != SQLAllocHandle(SQL_HANDLE_DBC, m_hEnv, &m_hFancyConnect))
return FALSE;
// Выделить память для идентификатора подключения Subscriebe //
if (SQL_SUCCESS != SQLAllocHandle(SQL_HANDLE_DBC, m_hEnv, &m_hSubscriebeConnect))
return FALSE;
// Подключиться к источнику данных Fancy //
if (SQL_SUCCESS != SQLDriverConnect(m_hFancyConnect, NULL,
(SQLTCHAR *) cszFANCY_DSN , SQL_NTS, (SQLTCHAR *) szoutDSN, MAX_DSN_SIZE, &dwOutStringLength, SQL_DRIVER_COMPLETE))
return FALSE;
if (SQL_SUCCESS != SQLAllocHandle(SQL_HANDLE_STMT, m_hFancyConnect, &m_hStmtFancy))
return FALSE;
ret = SQLSetStmtAttr(m_hStmtFancy, SQL_ATTR_CURSOR_TYPE, (SQLPOINTER) SQL_CURSOR_STATIC, SQL_IS_INTEGER);
if (SQL_SUCCESS != ret && SQL_SUCCESS_WITH_INFO != ret)
return FALSE;
if (SQL_SUCCESS != SQLBindCol(m_hStmtFancy, 1, SQL_C_LONG, &m_Fancy.dwid_Fancy, 4, &dwDataLength))
return FALSE;
if (SQL_SUCCESS != SQLBindCol(m_hStmtFancy, 2, SQL_C_CHAR, m_Fancy.szTitle, MAX_TITLE_SIZE, &dwDataLength))
return FALSE;
if (SQL_SUCCESS != SQLBindCol(m_hStmtFancy, 3, SQL_C_CHAR, m_Fancy.szDescr, MAX_DESCR_SIZE, &dwDataLength))
return FALSE;
if (SQL_SUCCESS != SQLBindCol(m_hStmtFancy, 4, SQL_C_CHAR, m_Fancy.szComnt, MAX_COMNT_SIZE, &dwDataLength))
return FALSE;
if (SQL_SUCCESS != SQLBindCol(m_hStmtFancy, 5, SQL_C_LONG, &m_Fancy.dwTLong, 4, &dwDataLength))
return FALSE;
if (SQL_SUCCESS != SQLBindCol(m_hStmtFancy, 6, SQL_C_LONG, &m_Fancy.dwDatTim, 4, &dwDataLength))
return FALSE;
if (SQL_SUCCESS != SQLBindCol(m_hStmtFancy, 7, SQL_C_LONG, &m_Fancy.dwPeriod, 4, &dwDataLength))
return FALSE;
if (SQL_SUCCESS != SQLBindCol(m_hStmtFancy, 8, SQL_C_LONG, &m_Fancy.dwTLast, 4, &dwDataLength))
return FALSE;
if (SQL_SUCCESS != SQLPrepare(m_hStmtFancy, (SQLTCHAR *) cszSTMT_FANCY, SQL_NTS))
return FALSE;
if (SQL_SUCCESS != SQLExecute(m_hStmtFancy))
return FALSE;
---
Вот такой код. Я понимаю, что здесь без SQLPrepare обойтись можно, но для единообразия с остальными запросами сделал так. Если в конец добавить ещё один SQLExecute, то образуется ошибка 24000.
Если между вызовами SQLExecute вставить SQLCloseCursor, то всё отлично. Это как раз та функция что мне была нужна, спасибо за помощь.
Получается, перед каждым выполнением запроса я вызываю SQLCloseCursor. Так делать правильно, или что-то умнее есть?
|