SQL Server - вызов хранимых процедур с использованием C ++ ODBC

0

Я пытаюсь вызвать хранимую процедуру для вставки данных в таблицу и возврата значения. Я получаю код возврата 99, который говорит SQL_NEED_DATA. Я использую драйвер Visual Studio 2008 и SQL Server Native Client 11. Вывод кода:

rc=SQL_SUCCESS; 
SQLINTEGER exID;
SQLINTEGER cdexFolderName = SQL_NTS;
SQLINTEGER cbexRootPath = SQL_NTS;
SQL_DATE_STRUCT dsOrderDate ;
SQLINTEGER cbOrderDate = 0;
rc=SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &hEnv);

if(rc==SQL_SUCCESS)
rc=SQLSetEnvAttr(hEnv, SQL_ATTR_ODBC_VERSION,(SQLPOINTER)SQL_OV_ODBC3, 0); 
if(rc==SQL_SUCCESS)
rc=SQLAllocHandle(SQL_HANDLE_DBC, hEnv, &hConn);
rc = SQLDriverConnect (hConn, NULL, (SQLCHAR*) "DSN=TWPDEV;Trusted_Connection=yes;", 
                SQL_NTS, retconstring, 1024, NULL,SQL_DRIVER_NOPROMPT);
rc = SQLAllocHandle(SQL_HANDLE_STMT, hConn, &hStmt);

if (!(rc==0 || rc==1))
show_error(SQL_HANDLE_DBC, hConn);
rc = SQLBindParameter(hStmt, 1, SQL_PARAM_OUTPUT, SQL_C_SLONG, 
                SQL_INTEGER, 0, 0, &exID, 0, &cbexID);
if (!(rc==0 || rc==1))
show_error(SQL_HANDLE_STMT, hStmt); 
rc = SQLBindParameter(hStmt, 2, SQL_PARAM_INPUT, SQL_C_CHAR, 
        SQL_LONGVARCHAR, sizeof(dsOrderDate), 0, &dsOrderDate, 0, &cbOrderDate);
if (!(rc==0 || rc==1))
show_error(SQL_HANDLE_STMT, hStmt); 
rc = SQLBindParameter(hStmt, 3, SQL_PARAM_INPUT, SQL_C_CHAR, 
                SQL_LONGVARCHAR, 50, 0, (SQLPOINTER) ExtractionFolderName.c_str(), ExtractionFolderName.length(), &cdexFolderName);
if (!(rc==0 || rc==1))
show_error(SQL_HANDLE_STMT, hStmt); 

rc = SQLBindParameter(hStmt, 4, SQL_PARAM_INPUT, SQL_C_CHAR, 
                SQL_LONGVARCHAR, 50, 0, (SQLPOINTER) ExtractionRootPath.c_str(), ExtractionRootPath.length(), &cbexRootPath);
if (!(rc==0 || rc==1))
show_error(SQL_HANDLE_STMT, hStmt); 


rc = SQLBindParameter(hStmt, 5, SQL_PARAM_INPUT, SQL_C_SLONG, 
                SQL_INTEGER, 0, 0, (SQLPOINTER) &NoOfItemsExtracted, 0, &cbnumItemsExtracted);
if (!(rc==0 || rc==1))
show_error(SQL_HANDLE_STMT, hStmt); 
rc = SQLBindParameter(hStmt, 6, SQL_PARAM_INPUT, SQL_C_SLONG, 
                SQL_INTEGER, 0, 0, (SQLPOINTER) &Status, 0, &cbstatus);
if (!(rc==0 || rc==1))
show_error(SQL_HANDLE_STMT, hStmt); 
rc = SQLBindParameter(hStmt, 7, SQL_PARAM_INPUT, SQL_C_SLONG, 
                SQL_INTEGER, 0, 0, (SQLPOINTER) &instanceID, 0, NULL);
if (!(rc==0 || rc==1))
show_error(SQL_HANDLE_STMT, hStmt); 

rc = SQLBindParameter(hStmt, 8, SQL_PARAM_INPUT, SQL_C_SLONG, 
                SQL_INTEGER, 0, 0, (SQLPOINTER) &sourceID, 0,NULL);
if (!(rc==0 || rc==1))
show_error(SQL_HANDLE_STMT, hStmt); 

rc = SQLBindParameter(hStmt, 9, SQL_PARAM_INPUT, SQL_C_SLONG, 
                SQL_INTEGER, 0, 0, (SQLPOINTER) &migrationSts, 0, &cbmigStatus);
if (!(rc==0 || rc==1))
show_error(SQL_HANDLE_STMT, hStmt);     

rc = SQLPrepare (hStmt, (SQLCHAR*) "{? = call dbo.procInsertExtraction(?,?,?,?,?,?,?,?)}", SQL_NTS);
if (!(rc==0 || rc==1))
show_error(SQL_HANDLE_STMT, hStmt);

rc = SQLExecute(hStmt);
        if (!(rc==0 || rc==1))
            show_error(SQL_HANDLE_STMT, hStmt);

Все утверждения до выполнения SQL Execute возвращают rc = 0. Я попытался подключиться к db и выполнил простой оператор SQL для вставки данных, это было успешно. Но сбой при выполнении процедуры. Пожалуйста, помогите мне в разрешении этого.

Теги:
odbc

1 ответ

0

Я считаю, что это может произойти из-за вашего второго связывания параметров:

rc = SQLBindParameter(hStmt, 2, SQL_PARAM_INPUT, SQL_C_CHAR, 
    SQL_LONGVARCHAR, sizeof(dsOrderDate), 0, &dsOrderDate, 0, &cbOrderDate);

Чтобы лучше понять это, я предлагаю обратиться к справочному руководству ODBC из SDK Microsoft Data Access SDK, но в основном эта конкретная строка кода соответствует условиям, необходимым для указания того, что вы планируете отправлять данные для этого параметра через SQLPutData ().

Ключевыми компонентами в этом случае являются аргумент parameterType - SQL_LONGVARCHAR, а код указывает указатель на значение (0).

Если вы не собираетесь отправлять данные параметров с помощью вызовов SQLPutData(), попробуйте установить cbOrderDate = SQL_NTS; в верхней части кода вместо установки его значения (0).

Тони Холл

  • 0
    Спасибо за ответ Тони. Я установил для cbOrderDate значение SQL_NTS, но проблема все еще существует. Выходным параметром, который я пытаюсь получить, является столбец Identity Primary key в базе данных SQL-сервера.
  • 0
    Можете ли вы сказать мне, что тип столбца таблицы? Я пробовал быстрый тест вставки для текстового столбца, но это сработало. Мне интересно, если он ведет себя в зависимости от типа внутреннего столбца.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню