[Gambas-devel] Change to gb.db.odbc to use ODBC Connection Strings.

ML d4t4full at ...176...
Thu Sep 24 18:01:19 CEST 2015


Benoît,

Revision 7334 did the trick.
It affects *.Available* and *.MoveNext* as desired/expected.

Regards,
zxMarce.

On 2015-09-23 21:23, Benoît Minisini wrote:
> Is it better with revision #7334?
>
> Le 21/09/2015 15:08, zxMarce a écrit :
>> Benoît,
>>
>> First off, with ODBC all .MoveXXX methods fail with "Result is forward only"
>> as expected, except .MoveFirst() and .MoveNext(). That is OK.
>>
>> Second, I got the low level driver to return -1 as record count by
>> specifying different "TDS_Version" values in the connection string. For
>> example, "TDS_Version=7.2" returns zero, other versions return the expected
>> -1 (4.2, 7, 7.1, 7.3, etc). This is also OK, because it is
>> user-controllable.
>>
>> But now that I have tested your mods, I must report the bad news: Both
>> .MoveNext and .Available properties always return FALSE, so there is no way
>> to cleanly exit a data retrieval loop.
>>
>> I think the problem is in CResult.c at around line 145. That particular line
>> calls the driver's query_fill function but disregards the return value, so
>> the DB_ERROR, DB_OK and DB_NO_DATA return values are ignored.
>>
>> If it helps, I cooked this mod in CResult.c, which made it work as expected
>> with ODBC, adjusting the return values of .MoveNext and .Available:
>>
>>     //Next original line does not store the FILL call result,
>>     //therefore any call will be assumed OK even when the
>>     //ODBC driver says it failed.
>>     /*THIS->driver->Result.Fill(&THIS->conn->db,
>>                                 THIS->handle,
>>                                 pos,
>>                                 THIS->buffer,
>>                                 (pos > 0) && (pos ==
>> (DELETE_MAP_virtual_to_real(THIS->dmap, THIS->pos) + 1))
>>                                );*/
>>
>>     //This next replacement line stores the FILL call result
>>     //in fillFailed so it can be checked later.
>>     int fillFailed = THIS->driver->Result.Fill(&THIS->conn->db,
>>                                            THIS->handle,
>>                                            pos,
>>                                            THIS->buffer,
>>                                            (pos > 0) && (pos ==
>> (DELETE_MAP_virtual_to_real(THIS->dmap, THIS->pos) + 1))
>>                                           );
>>
>>     //Next, check whether the FILL above succeeded or failed and
>>     //return proper states in Result.MoveNext and Result.Available.
>>     if (fillFailed)
>>     {
>>       THIS->available = FALSE;
>>       return TRUE;
>>     }
>>
>> Finally, if I misinterpreted your intentions (yet again), please disregard
>> my suggestions.
>>
>> Regards,
>> zxMarce.
>>
>

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.gambas-basic.org/pipermail/devel/attachments/20150924/10ebd6d5/attachment.html>


More information about the Devel mailing list