저장 프로 시저를 호출하여 테이블에 데이터를 삽입하고 값을 반환하려고합니다. SQL_NEED_DATA라고하는 리턴 코드 99가 표시됩니다. Visual Studio 2008 및 SQL Server Native Client 11 드라이버를 사용하고 있습니다. 코드 추출물 : SQL까지SQL Server - C++ ODBC를 사용하여 저장 프로 시저 호출
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);
모든 문은 RC = 0을 반환하는 실행합니다. 나는 db에 연결을 시도하고 간단한 SQL 문을 실행하여 데이터를 삽입했다. 그러나 프로 시저를 실행하는 경우 실패합니다. 이 문제를 해결하는 데 협조 해주십시오.
rc = SQLBindParameter(hStmt, 2, SQL_PARAM_INPUT, SQL_C_CHAR,
SQL_LONGVARCHAR, sizeof(dsOrderDate), 0, &dsOrderDate, 0, &cbOrderDate);
, 나는 Microsoft 데이터 액세스 SDK에서 ODBC 도움말 설명서를보고 제안이 더 잘 이해하기 위해,하지만 기본적으로,이 특정 :
답장을 보내 주셔서 감사합니다. 나는 cbOrderDate를 SQL_NTS로 설정했지만 문제는 여전히 존재합니다. 검색하려는 출력 매개 변수는 SQL 서버 db의 Identity Primary 키 열입니다. – user3886886
테이블 열 유형이 무엇인지 말해 줄 수 있습니까? 텍스트 열에 대해 빠른 삽입 테스트를 시도했지만 작동했습니다. 백엔드 열 유형을 기반으로 동작하는지 궁금합니다. – PRGSTony