A repeater in plain SQL would eliminate the possibility of it being a bug in your C++ code.
Alternatively, strip your code down to the barest minimum (aka just the first INSERT) and see if that works. Then keep adding a bit more code. Keep doing that until you find the failure point, or it succeeds. On Thu, Oct 1, 2026 at 7:06 PM Igor Korot <[email protected]> wrote: > Hi, > > Does anybody here know what could be the problem? > > Thank you. > > > ---------- Forwarded message --------- > From: Igor Korot <[email protected]> > Date: Thu, Oct 1, 2026 at 6:26 PM > Subject: SQL_NEED__DATA > To: PostgreSQL ODBC list <[email protected]> > > > Hi, > > Consider following table: > > CREATE TABLE IF NOT EXISTS abcatvld(abv_name char(30) NOT NULL, > abv_vald char(254), abv_type smallint, abv_cntr integer, abv_msg > char(254), PRIMARY KEY( abv_name )); > > the following code: > > [code] > int ODBCDatabase::CreateUpdateValidationRule(bool isNew, const > std::wstring &name, const std::wstring &rule, const int type, const > std::wstring &message, std::vector<std::wstring> &errorMsg) > { > int result = 0; > std::wstring errorMessage; > std::wstring query = L""; > SQLLEN val1, val2, val3, val4, val5; > if( isNew ) > query = L"INSERT INTO abcatvld( abv_name, abv_vald, abv_type, > abv_msg ) VALUES( ?, ?, ?, ?)"; > else > query = L"UPDATE abcatvld SET abv_name = ?, abv_vald = ?, > abv_type = ?, abv_msg = ? WHERE abv_name = ?"; > auto qry = new SQLWCHAR[query.length() + 2]; > memset( qry, '\0', query.length() + 2 ); > uc_to_str_cpy( qry, query ); > auto qryName = new SQLWCHAR[32]; > memset( qryName, '\0', 32 ); > uc_to_str_cpy( qryName, name ); > auto qryRule = new SQLWCHAR[258]; > memset( qryRule, '\0', 258 ); > uc_to_str_cpy( qryRule, rule ); > auto qryType = (int) type; > auto qryMessage = new SQLWCHAR[256]; > memset( qryMessage, '\0', 256 ); > uc_to_str_cpy( qryMessage, message ); > auto ret = SQLAllocHandle( SQL_HANDLE_STMT, m_hdbc, &m_hstmt ); > if( ret != SQL_SUCCESS && ret != SQL_SUCCESS_WITH_INFO ) > { > GetErrorMessage( errorMsg, CONN_ERROR ); > result = 1; > } > if( !result ) > { > ret = SQLPrepare( m_hstmt, qry, SQL_NTS ); > if( ret != SQL_SUCCESS && ret != SQL_SUCCESS_WITH_INFO ) > { > GetErrorMessage( errorMsg, STMT_ERROR ); > result = 1; > } > } > if( !result ) > { > ret = SQLBindParameter( m_hstmt, 1, SQL_PARAM_INPUT, > SQL_C_WCHAR, SQL_WCHAR, 32, 0, qryName, 0, &val1 ); > if( ret != SQL_SUCCESS && ret != SQL_SUCCESS_WITH_INFO ) > { > GetErrorMessage( errorMsg, STMT_ERROR ); > result = 1; > } > } > if( !result ) > { > ret = SQLBindParameter( m_hstmt, 2, SQL_PARAM_INPUT, > SQL_C_WCHAR, SQL_WCHAR, 258, 0, qryRule, 0, &val2 ); > if( ret != SQL_SUCCESS && ret != SQL_SUCCESS_WITH_INFO ) > { > GetErrorMessage( errorMsg, STMT_ERROR ); > result = 1; > } > } > if( !result ) > { > ret = SQLBindParameter( m_hstmt, 3, SQL_PARAM_INPUT, > SQL_C_SSHORT, SQL_INTEGER, 0, 0, &qryType, 0, &val3 ); > if( ret != SQL_SUCCESS && ret != SQL_SUCCESS_WITH_INFO ) > { > GetErrorMessage( errorMsg, STMT_ERROR ); > result = 1; > } > } > if( !result ) > { > ret = SQLBindParameter( m_hstmt, 4, SQL_PARAM_INPUT, > SQL_C_WCHAR, SQL_WCHAR, 254, 0, &qryMessage, 0, &val4 ); > if( ret != SQL_SUCCESS && ret != SQL_SUCCESS_WITH_INFO ) > { > GetErrorMessage( errorMsg, STMT_ERROR ); > result = 1; > } > } > if( !isNew && !result ) > { > ret = SQLBindParameter( m_hstmt, 5, SQL_PARAM_INPUT, > SQL_C_WCHAR, SQL_WCHAR, 32, 0, qryName, 0, &val5 ); > if( ret != SQL_SUCCESS && ret != SQL_SUCCESS_WITH_INFO ) > { > GetErrorMessage( errorMsg, STMT_ERROR ); > result = 1; > } > } > if( !result ) > { > ret = SQLExecute( m_hstmt ); > if( ret != SQL_SUCCESS && ret != SQL_SUCCESS_WITH_INFO ) > { > GetErrorMessage( errorMsg, STMT_ERROR ); > result = 1; > } > } > } > > returns 99 (SQL_NEED_DATA). > > What am I doing wrong? > > Thank you. > > > -- Death to <Redacted>, and butter sauce. Don't boil me, I'm still alive. <Redacted> lobster!
