http://gambaswiki.org/bugtracker/edit?object=BUG.1013&from=L21haW4-
Comment #3 by Christian FAURE: Thanks for review this problem, this is the test code: Print "-----------" FBConnect() ' connect to database Db.Debug = True ' enable debug messages Try rs = fb.Exec("select current_date from RDB$DATABASE") 'this select always return one row with current date If Error.Code Then Print "Error";; Error.Text;; Error.Code Endif If rs.Available Then Print "Result Available!" Print rs[0] Else 'when GetRecordCount give 0 rows, then rs.Available is false Print "Result not Available" Endif Print "-----------" with unmodified source (gambas 3.9.1 - 2.11 from openSuse 42.1) the console show: ----------- gb.db.odbc: 0xb6da38: select current_date from RDB$DATABASE gb.db.odbc.GetRecordCount: Success, count=0 gb.db.odbc: -> 0 rows Result not Available ----------- i'm sure this select return one row. then i've modified the odbc component (source from gambas site, v 3.9.1), function do_query like this /* Internal function to implement the query execution */ static int do_query(DB_DATABASE *db, const char *error, ODBC_RESULT ** res, const char *qtemp, int nsubst, ...) { #ifdef ODBC_DEBUG_HEADER fprintf(stderr,"[ODBC][%s][%d]\n",__FILE__,__LINE__); fprintf(stderr,"\tdo_query db %p, ODBC_result res %p, db->handle %p, query = '%s'\n", db, res, db->handle, query); fflush(stderr); #endif va_list args; ODBC_CONN *handle = (ODBC_CONN *)db->handle; SQLRETURN retcode= SQL_SUCCESS; SQLRETURN retcodecnt= SQL_SUCCESS; ODBC_RESULT * odbcres; const char *query; int i; if (nsubst) { va_start(args, nsubst); if (nsubst > 3) nsubst = 3; for (i = 0; i < nsubst; i++) query_param[i] = va_arg(args, char *); query = DB.SubstString(qtemp, 0, query_get_param); } else query = qtemp; if (DB.IsDebug()) fprintf(stderr, "gb.db.odbc: %p: %s\n", handle, query); GB.AllocZero(POINTER(&odbcres), sizeof(ODBC_RESULT)); /* Allocate the space for the result structure */ retcode = SQLAllocHandle(SQL_HANDLE_STMT, handle->odbcHandle, &odbcres->odbcStatHandle); if ((retcode != SQL_SUCCESS) && (retcode != SQL_SUCCESS_WITH_INFO)) { GB.Error("Cannot allocate statement handle"); return retcode; } retcode = SQLSetStmtAttr(odbcres->odbcStatHandle, SQL_ATTR_CURSOR_SCROLLABLE, (SQLPOINTER) SQL_SCROLLABLE, 0); if ((retcode != SQL_SUCCESS) && (retcode != SQL_SUCCESS_WITH_INFO)) { odbcres->Cursor_Scrollable = SQL_FALSE; } else odbcres->Cursor_Scrollable = SQL_TRUE; odbcres->Function_exist = handle->FetchScroll_exist; /* Execute the query */ retcode = SQLExecDirect(odbcres->odbcStatHandle, (SQLCHAR *) query, SQL_NTS); if ((retcode != SQL_SUCCESS) && (retcode != SQL_SUCCESS_WITH_INFO)) { SQLFreeHandle(SQL_HANDLE_STMT, odbcres->odbcStatHandle); GB.Error("Error while executing the statement"); return retcode; } if (res) { /*retcode = SQLRowCount(odbcres->odbcStatHandle, &odbcres->count); if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO) { SQLFreeHandle(SQL_HANDLE_STMT, odbcres->odbcStatHandle); GB.Error("Unable to retrieve row count"); return retcode; }*/ retcodecnt = SQLRowCount(odbcres->odbcStatHandle, &odbcres->count); if (retcodecnt != SQL_SUCCESS && retcodecnt != SQL_SUCCESS_WITH_INFO) { SQLFreeHandle(SQL_HANDLE_STMT, odbcres->odbcStatHandle); GB.Error("Unable to retrieve row count"); return retcodecnt; } //odbcres->count = GetRecordCount(odbcres->odbcStatHandle, odbcres->Cursor_Scrollable); if (DB.IsDebug()) fprintf(stderr, "gb.db.odbc: -> %d rows\n", (int)odbcres->count); *res = odbcres; } else { SQLFreeHandle(SQL_HANDLE_STMT, odbcres->odbcStatHandle); GB.Free(POINTER(&odbcres)); } return retcode; } then the same gambas code print this on the console: ----------- gb.db.odbc: 0x889a28: select current_date from RDB$DATABASE gb.db.odbc: -> 1 rows Result Available! 10/13/2016 00:00:00 ----------- maybe we can add some flag in database driver like "enable_optimizations" to enable the new GetRecordCount and/or other non odbc compliant tuned features? Best regards. ------------------------------------------------------------------------------ Check out the vibrant tech community on one of the world's most engaging tech sites, SlashDot.org! http://sdm.link/slashdot _______________________________________________ Gambas-user mailing list Gambas-user@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/gambas-user