Обсуждение: What is the problem with this code?
Hi, ALL,
[code]
std::wstring query1 = L"SHOW log_directory";
std::wstring query2 = L"SHOW log_filename";
SQLWCHAR *qry1 = new SQLWCHAR[query1.length() + 2];
SQLWCHAR *qry2 = new SQLWCHAR[query2.length() + 2];
memset( qry1, '\0', query1.length() + 2 );
memset( qry2, '\0', query2.length() + 2 );
uc_to_str_cpy( qry1, query1 );
uc_to_str_cpy( qry2, query2 );
RETCODE ret = SQLAllocHandle( SQL_HANDLE_STMT, m_hdbc, &m_hstmt );
if( ret == SQL_SUCCESS || ret == SQL_SUCCESS_WITH_INFO )
{
ret = SQLPrepare( m_hstmt, qry1, SQL_NTS );
if( ret != SQL_SUCCESS && ret != SQL_SUCCESS_WITH_INFO )
{
GetErrorMessage( errorMsg, 1 );
result = 1;
}
else
{
ret = SQLDescribeCol( m_hstmt, 1, columnName, 256,
&columnNameLen, &columnDataType, &columnDataSize, &columnDataDigits,
&columnDataNullable );
if( ret != SQL_SUCCESS && ret != SQL_SUCCESS_WITH_INFO )
{
GetErrorMessage( errorMsg, 1 );
result = 1;
}
[/code]
The SQLDescribeCol() call fails with the error invalid column number".
Does anybody have any idea?
Thank you.
Igor Korot wrote: > SQLWCHAR *qry1 = new SQLWCHAR[query1.length() + 2]; > memset( qry1, '\0', query1.length() + 2 ); memset expects the length to be in bytes. > ret = SQLPrepare( m_hstmt, qry1, SQL_NTS ); > ret = SQLDescribeCol( m_hstmt, 1, columnName, 256, &columnNameLen, &columnDataType, &columnDataSize, &columnDataDigits,&columnDataNullable ); > > The SQLDescribeCol() call fails with the error invalid column number". Does SQLExecute work? Does SQLNumResultCols give 1? The specification says "for performance reasons, an application should not call SQLDescribeCol before executing a statement." But it should work anyway; if not, this would be a bug. What are the settings of "Parse Statements" and "Server side prepare" of the data source? Regards, Clemens