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;
}
所有變量都在頭中聲明。從雙重返回SQL_FLOAT中選擇1,然後我切換到 – Infated 2014-12-10 05:47:44
但是您將列綁定爲SQL_C_DOUBLE,稍後嘗試對其調用SQLGetData。當您調用SQLFetch時,應該填充所有綁定列。我有點驚訝,司機甚至允許你在你綁定的列上調用SQLGetData。 – bohica 2014-12-10 09:09:20
此外,您不能期望以SQL_C_DOUBLE形式綁定(或調用SQLGetData),並將返回的內容視爲字符串 - 它不是字符串(它是雙精度型),除非將其綁定爲SQL_C_CHAR。 – bohica 2014-12-10 09:41:55