Обсуждение: Fetch absolute returns OK when fetching a nonexistent row

Поиск
Список
Период
Сортировка

Fetch absolute returns OK when fetching a nonexistent row

От
BGoebel
Дата:
Hi All,

Once again i need your help.

The attached example shows an error using a simple ODBC SELECT + FETCH.
Fetching the (non existing) 100th row results in 0 (=ok) instead of 100(no
data).

The error seems to be depend on the FETCH parameter of the connection
string:
When using ...;Fetch=3 in the connection string i get the right resultcode
100.
A previous FETCH NEXT seems to help too, but i think we can not rely on
this.

any help would be appreciated

best regards


Tested with pg 9.1 / odbcDriver 9.00.0310 / Delphi7.0
-----------------------------------------------

PROCEDURE FetchAbsoluteTest;

    Var aRes:Integer;
        hStmtSelect,hstmtUpdate,fEnvHandle,fConnectHandle:SQLHandle;
        szName:ShortString;
        cbName:SQLInteger;
        aScroll,aSQLSmallInt:SQLSmallInt;
        aConnectString:String;
        aRow:Cardinal;
    Begin

     (*
     tabledefinition and data used in this case:

    drop table if exists customers;
    create table customers(nr integer, name varchar(100));
    insert into customers(nr, name) VALUES(1, 'Mayers');
    insert into customers(nr, name) VALUES(2, 'Miller');
    insert into customers(nr, name) VALUES(3, 'Smith');
     *)

     fEnvHandle := 0;
     fConnectHandle := 0;

     aRes := SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, fEnvHandle);
     aRes := SQLAllocHandle(SQL_HANDLE_DBC, fEnvHandle, fConnectHandle);

     aSqlSmallint := 0;
     aConnectString :=
'Driver={PostgreSQL};Server=127.0.0.1;Port=5432;Database=postgres' +

';Uid=postgres;Pwd=mypwd;UpdatableCursors=1;usedeclarefetch=1;fetch=1';

     aRes := SQLDriverConnect(fConnectHandle,
                              GetDesktopWindow,
                              @aConnectString[1],
                              length(aConnectString),
                              nil,
                              0,
                              aSqlSmallint,
                              0);
       //switchin AUTOCOMMIT off
      aRes := SQLSetConnectAttr(fConnectHandle,
                                      SQL_ATTR_AUTOCOMMIT,
                                      pointer(SQL_AUTOCOMMIT_OFF),
                                      sizeof(SQL_AUTOCOMMIT_OFF));
       aRes:= SQLAllocHandle(SQL_HANDLE_STMT, fConnectHandle, hStmtSelect);

      //  Cursor : KeySetDriven + SQL_CONCUR_ROWVER(=updatable)
     aRes:= sqlSetStmtAttr(hStmtSelect,
                            SQL_ATTR_CONCURRENCY,
                                    pointer(SQL_CONCUR_ROWVER),
                                    sizeof(SQLSmallint));
     aRes:= sqlSetStmtAttr(hStmtSelect,
                            SQL_ATTR_CURSOR_TYPE,
                                    pointer(SQL_CURSOR_KEYSET_DRIVEN),
                                    sizeof(SQLSmallint));
      // Select ...
      aRes := SQLExecDirect(hstmtSelect,
              pchar('SELECT name FROM customers'),
              SQL_NTS);
      // fetch will read the column "name"
      aRes:= SQLBindCol(hstmtSelect, 1, SQL_C_CHAR, @szName[1], 50, cbName);

      //fetching absolute a nonexisting row
      aRes := SQLFetchScroll(hStmtSelect, SQL_FETCH_ABSOLUTE, 100);
      Assert(aRes = 100);
    END;



--
View this message in context:
http://postgresql.1045698.n5.nabble.com/Fetch-absolute-returns-OK-when-fetching-a-nonexistent-row-tp4971382p4971382.html
Sent from the PostgreSQL - odbc mailing list archive at Nabble.com.

Re: Fetch absolute returns OK when fetching a nonexistent row

От
Hiroshi Inoue
Дата:
Hi,

(2011/11/08 0:11), BGoebel wrote:
> Hi All,
>
> Once again i need your help.
>
> The attached example shows an error using a simple ODBC SELECT + FETCH.
> Fetching the (non existing) 100th row results in 0 (=ok) instead of 100(no
> data).
>
> The error seems to be depend on the FETCH parameter of the connection
> string:
> When using ...;Fetch=3 in the connection string i get the right resultcode
> 100.
> A previous FETCH NEXT seems to help too, but i think we can not rely on
> this.
>
> any help would be appreciated

Could you please try the drivers on testing for 9.0.0311 at
   http://www.ne.jp/asahi/inocchichichi/entrance/psqlodbc/
?

regards,
Inoue, Hiroshi

> best regards
>
>
> Tested with pg 9.1 / odbcDriver 9.00.0310 / Delphi7.0
> -----------------------------------------------
>
> PROCEDURE FetchAbsoluteTest;
>
>      Var aRes:Integer;
>          hStmtSelect,hstmtUpdate,fEnvHandle,fConnectHandle:SQLHandle;
>          szName:ShortString;
>          cbName:SQLInteger;
>          aScroll,aSQLSmallInt:SQLSmallInt;
>          aConnectString:String;
>          aRow:Cardinal;
>      Begin
>
>       (*
>       tabledefinition and data used in this case:
>
>      drop table if exists customers;
>      create table customers(nr integer, name varchar(100));
>      insert into customers(nr, name) VALUES(1, 'Mayers');
>      insert into customers(nr, name) VALUES(2, 'Miller');
>      insert into customers(nr, name) VALUES(3, 'Smith');
>       *)
>
>       fEnvHandle := 0;
>       fConnectHandle := 0;
>
>       aRes := SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, fEnvHandle);
>       aRes := SQLAllocHandle(SQL_HANDLE_DBC, fEnvHandle, fConnectHandle);
>
>       aSqlSmallint := 0;
>       aConnectString :=
> 'Driver={PostgreSQL};Server=127.0.0.1;Port=5432;Database=postgres' +
>
> ';Uid=postgres;Pwd=mypwd;UpdatableCursors=1;usedeclarefetch=1;fetch=1';
>
>       aRes := SQLDriverConnect(fConnectHandle,
>                                GetDesktopWindow,
>                                @aConnectString[1],
>                                length(aConnectString),
>                                nil,
>                                0,
>                                aSqlSmallint,
>                                0);
>         //switchin AUTOCOMMIT off
>        aRes := SQLSetConnectAttr(fConnectHandle,
>                                        SQL_ATTR_AUTOCOMMIT,
>                                        pointer(SQL_AUTOCOMMIT_OFF),
>                                        sizeof(SQL_AUTOCOMMIT_OFF));
>         aRes:= SQLAllocHandle(SQL_HANDLE_STMT, fConnectHandle, hStmtSelect);
>
>        //  Cursor : KeySetDriven + SQL_CONCUR_ROWVER(=updatable)
>       aRes:= sqlSetStmtAttr(hStmtSelect,
>                              SQL_ATTR_CONCURRENCY,
>                                      pointer(SQL_CONCUR_ROWVER),
>                                      sizeof(SQLSmallint));
>       aRes:= sqlSetStmtAttr(hStmtSelect,
>                              SQL_ATTR_CURSOR_TYPE,
>                                      pointer(SQL_CURSOR_KEYSET_DRIVEN),
>                                      sizeof(SQLSmallint));
>        // Select ...
>        aRes := SQLExecDirect(hstmtSelect,
>                pchar('SELECT name FROM customers'),
>                SQL_NTS);
>        // fetch will read the column "name"
>        aRes:= SQLBindCol(hstmtSelect, 1, SQL_C_CHAR, @szName[1], 50, cbName);
>
>        //fetching absolute a nonexisting row
>        aRes := SQLFetchScroll(hStmtSelect, SQL_FETCH_ABSOLUTE, 100);
>        Assert(aRes = 100);
>      END;

Re: Fetch absolute returns OK when fetching a nonexistent row

От
BGoebel
Дата:
Hi Hiroshi,

thanks a lot for the Info!

The error seems to be fixed.

We have tested the new version of the driver.
Unfortunately this error still exists:
http://postgresql.1045698.n5.nabble.com/Error-Retrieving-Catalog-Info-tt4598955.html

Also i have found a new (?) issue with Cursor Update / SQLEndTran / Fetch
Last. I will have a closer look on that and open a new topic.


regards
BGoebel

--
View this message in context:
http://postgresql.1045698.n5.nabble.com/Fetch-absolute-returns-OK-when-fetching-a-nonexistent-row-tp4971382p4978053.html
Sent from the PostgreSQL - odbc mailing list archive at Nabble.com.