2014-09-10 1 views
0

저장 프로 시저를 호출하여 테이블에 데이터를 삽입하고 값을 반환하려고합니다. 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 도움말 설명서를보고 제안이 더 잘 이해하기 위해,하지만 기본적으로,이 특정 :

답변

0

나는이 때문에 두 번째 매개 변수 바인딩의 일이 될 수 있다고 생각 코드 줄이 SQLPutData() 호출을 통해이 매개 변수에 대한 데이터를 보낼 계획을 지정하기 위해 필요한 조건을 충족시키는 것으로 보입니다.

이 경우의 주요 구성 요소는 parameterType 인수가 SQL_LONGVARCHAR이고 코드가 (0) 값에 대한 포인터를 지정한다는 것입니다.

SQLPutData() 호출을 통해 매개 변수 데이터를 전송하지 않으려면 cbOrderDate = SQL_NTS를 설정하십시오. (0) 값으로 설정하는 대신 코드 맨 위에 표시됩니다.

토니 홀

+0

답장을 보내 주셔서 감사합니다. 나는 cbOrderDate를 SQL_NTS로 설정했지만 문제는 여전히 존재합니다. 검색하려는 출력 매개 변수는 SQL 서버 db의 Identity Primary 키 열입니다. – user3886886

+0

테이블 열 유형이 무엇인지 말해 줄 수 있습니까? 텍스트 열에 대해 빠른 삽입 테스트를 시도했지만 작동했습니다. 백엔드 열 유형을 기반으로 동작하는지 궁금합니다. – PRGSTony