[freetds] MS SQL Server 2005 and FreeTDS
Jeff Dahl
jddahl at micron.com
Tue Feb 14 11:08:46 EST 2006
ZIGLIO, Frediano, VF-IT wrote:
>>>Il giorno ven, 10/02/2006 alle 18.01 -0700, Jeff Dahl ha scritto:
>>>
>>>
>>>
>>>
>>>>Why does this query
>>>>
>>>> CREATE TABLE #data( myID varchar( 25 ))
>>>> INSERT into #data select myID from myTable where myID = 'data1'
>>>> INSERT into #data select myID from myTable where myID = 'data2'
>>>> CREATE index myindex on #data (myID)
>>>> SELECT myID
>>>> FROM #data, myTable
>>>> WHERE ( #data.myID = myTable.myID )
>>>> DROP TABLE #data
>>>>
>>>>generate this error:
>>>>
>>>> SQL_STATE: 24000
>>>> NATIVE_ERROR: 0
>>>> MSG: [FreeTDS][SQL Server]Invalid cursor state
>>>> MSG_LEN: 41
>>>>
>>>>I've tried this with both 0.63 and the latest CVS version.
>>>>
>>>>
>>Only the CVS
>>
>>
>>>>version gives the error. Version 0.63 doesn't return anything.
>>>>
>>>>Thanks,
>>>>Jeff Dahl
>>>>
>>>>
>>>>
>>>>
>>>>
>>>Is difficult do reply to your question without knowing the
>>>
>>>
>>tool you are
>>
>>
>>>using... I suppose is a ODBC tool like isql. Or is it a program you
>>>wrote?
>>>
>>>
>>>
>>I wrote the program using the ODBC API. However, if I run the same
>>query with with tsql (v0.63 and CVS), the data is returned
>>correctly.
>>Looks like the problem is in the ODBC layer.
>>
>>
>>
>>>Does myTable contain 'data1' and 'data2' ?
>>>
>>>
>>>
>>>
>>Yes.
>>
>>
>>
>
>Mmm... did you use SQLExecDirect and then SQLFetch return this "24000"
>error ?
>Which is the call sequence?
>
>
1. SQLExecDirect
2. SQLBindCol
3. SQLFetch
ret = SQLExecDirect( <command above> );
if( ret == SQL_ERROR )
{
throw SQLException( SQL_HANDLE_STMT, cmd );
}
unsigned char buffer[300];
SQLLEN indicator;
ret = SQLBindCol( cmd, 1, SQL_C_CHAR, buffer, 300, &indicator );
if( ret == SQL_SUCCESS_WITH_INFO )
{
warning( SQL_HANDLE_STMT, cmd );
}
else if( ret == SQL_ERROR )
{
throw SQLException( SQL_HANDLE_STMT, cmd );
}
cerr << "FETCHING" << endl;
while(( ret = SQLFetch( cmd )) != SQL_NO_DATA )
{
if(( ret == SQL_SUCCESS_WITH_INFO ) || ( ret == SQL_ERROR ))
{
SQLCHAR SqlState[6], Msg[MAX_MESSAGE_LEN];
SQLINTEGER NativeError;
SQLSMALLINT i = 1, MsgLen;
while ((ret = SQLGetDiagRec(SQL_HANDLE_STMT, cmd, i,
SqlState, &NativeError,
Msg, sizeof(Msg), &MsgLen)) != SQL_NO_DATA) {
cerr << "SQL_STATE: " << SqlState << endl;
cerr << "NATIVE_ERROR: " << NativeError << endl;
cerr << "MSG: " << Msg << endl;
cerr << "MSG_LEN: " << MsgLen << endl;
i++;
}
}
cerr << "[" << buffer << "]" << "\t" << indicator << endl;
}
More information about the FreeTDS
mailing list