2014-12-08 100 views
0

我試圖執行查詢「從雙重選擇1」。 但是在SQLFetch之後,ColumnData中沒有任何內容出現,因此分配了內存並且函數返回成功。如果查詢返回varchar類型,它工作正常。剛開始用ODBC的工作,我真的糊塗becouse這...無法使用Oracle 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 : %S\n SQL Data Type : %i\n Data Size : %i\n\n", 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 Records\n------------\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("%s\n", ColumnData[j]); 
         } 
        } 
       } 
      } 
      else 
      { 
       ShowError(NUMRESULTCOLS); 
       isDone = false; 
      } 
     }  
     else 
     { 
      ShowError(EXECDIRECT); 
      isDone = false; 
     } 
    } 
    else 
    { 
     printf("FAILED TO CONNECT"); 
    } 
    Disconnect(); 
    return isDone;    
} 

回答

0

的代碼中,我沒有看過您的詳細代碼,但我可以看到一些變量不聲明。對偶中的select 1可能會返回一個列類型的整數,並且您的switch語句不會覆蓋該列。我建議你在交換機上添加一個默認值,以捕獲你沒有涉及的列類型(無論如何,這是很好的編程習慣)。

+0

所有變量都在頭中聲明。從雙重返回SQL_FLOAT中選擇1,然後我切換到 – Infated 2014-12-10 05:47:44

+0

但是您將列綁定爲SQL_C_DOUBLE,稍後嘗試對其調用SQLGetData。當您調用SQLFetch時,應該填充所有綁定列。我有點驚訝,司機甚至允許你在你綁定的列上調用SQLGetData。 – bohica 2014-12-10 09:09:20

+0

此外,您不能期望以SQL_C_DOUBLE形式綁定(或調用SQLGetData),並將返回的內容視爲字符串 - 它不是字符串(它是雙精度型),除非將其綁定爲SQL_C_CHAR。 – bohica 2014-12-10 09:41:55

相關問題