无法使用 Oracle ODBC 执行查询

fails to execute a query using Oracle ODBC

本文关键字:ODBC 执行 查询 Oracle      更新时间:2023-10-16

我正在尝试执行查询"从双胞胎中选择 1"。但是在 SQLFetch 之后,ColumnData 中没有任何内容出现,因此分配了内存,函数返回成功。如果查询返回 varchar 类型,则效果很好。刚开始使用 ODBC,我真的很困惑,因为这个......

下面的代码

{
    bool isDone = true;     
    Connect();
    if(isConnected)
    {
        m_retcode = SQLExecDirect(m_hStmt, _queryText, SQL_NTS);
        if (m_retcode == SQL_SUCCESS || m_retcode == SQL_SUCCESS_WITH_INFO)
        { 
            m_retcode = SQLNumResultCols(m_hStmt, &numCols);
            if (m_retcode == SQL_SUCCESS || m_retcode == SQL_SUCCESS_WITH_INFO)
            {                           
                for (i=0;i<numCols;i++) 
                {
                    ColumnName[i] = new SQLWCHAR[MAX_COL_NAME_LEN]; 
                    m_retcode = SQLDescribeCol(m_hStmt, i+1, ColumnName[i], MAX_COL_NAME_LEN, &ColumnNameLen[i], &ColumnDataType[i], &ColumnDataSize[i], &ColumnDataDigits[i], &ColumnDataNullable[i]);
                    if (m_retcode < 0 || m_retcode > 1)
                    {
                        ShowError(DESCRIBECOL);
                    }                   
                    printf("Column Name : %Sn SQL Data Type : %in  Data Size : %inn", ColumnName[i], (int)ColumnDataType[i], (int)ColumnDataSize[i]);           
                    ColumnData[i] = new SQLCHAR[ColumnDataSize[i]+2]; 
                    switch(ColumnDataType[i]) 
                    {                       
                        case SQL_VARCHAR:
                            ColumnDataType[i]=SQL_C_CHAR;                           
                            m_retcode = SQLBindCol(m_hStmt, i+1, ColumnDataType[i], ColumnData[i], ColumnDataSize[i]*2, &ColumnDataLen[i]);
                            if (m_retcode < 0 || m_retcode > 1)
                            {
                                ShowError(DESCRIBECOL);
                            }
                            break;                     
                        case SQL_DECIMAL:
                            ColumnDataType[i]=SQL_C_CHAR; 
                            m_retcode = SQLBindCol(m_hStmt, i+1, ColumnDataType[i], ColumnData[i], sizeof(double)*sizeof(double), &ColumnDataLen[i]); 
                            if (m_retcode < 0 || m_retcode > 1)
                            {
                                ShowError(DESCRIBECOL);
                            }
                            break;
                        case SQL_FLOAT:
                            ColumnDataType[i]=SQL_C_DOUBLE;                             
                            m_retcode = SQLBindCol(m_hStmt, i+1, ColumnDataType[i], ColumnData[i], ColumnDataSize[i], &ColumnDataLen[i]); 
                            if (m_retcode < 0 || m_retcode > 1)
                            {
                                ShowError(DESCRIBECOL);
                            }
                            break;
                    }                   
                }                   
                printf ("Data Recordsn------------n");
                for (i=0; ; i++) 
                {
                    m_retcode = SQLFetch(m_hStmt);
                    if (m_retcode == SQL_NO_DATA) 
                    {
                        break;
                    }                   
                    printf ("nRecord %i n", i+1);
                    for (j=0; j<numCols; j++) 
                    {
                        printf("Column %S : ", ColumnName[j]);
                        if (ColumnDataType[j]==SQL_C_CHAR || ColumnDataType[j]==SQL_C_DOUBLE) 
                        {
                             SQLGetData(m_hStmt, j, ColumnDataType[j], ColumnData[j], MAX_LEN, 0);
                             printf("%sn", ColumnData[j]);
                        }
                    }
                }
            }
            else
            {
                ShowError(NUMRESULTCOLS);
                isDone = false;
            }   
        }       
        else
        {
            ShowError(EXECDIRECT);
            isDone = false;
        }
    }
    else
    {
        printf("FAILED TO CONNECT");
    }
    Disconnect();
    return isDone;             
}

我没有详细查看您的代码,但我可以看到一些未声明的变量。从 dual 中选择 1 可能会返回整数的列类型,而您的 switch 语句没有涵盖这一点。我建议您在切换到您尚未涵盖的陷阱列类型中添加默认值(无论如何,这都是很好的编程实践)。