Browse Source

fcl-db: odbc: go to first selectable result. issue #38664

git-svn-id: trunk@49049 -
ondrej 4 years ago
parent
commit
fa0b053b21
2 changed files with 14 additions and 4 deletions
  1. 9 4
      packages/fcl-db/src/sqldb/odbc/odbcconn.pas
  2. 5 0
      packages/odbc/src/odbcsql.inc

+ 9 - 4
packages/fcl-db/src/sqldb/odbc/odbcconn.pas

@@ -873,10 +873,15 @@ begin
 
 
     if (Res<>SQL_NO_DATA) then ODBCCheckResult( Res, SQL_HANDLE_STMT, ODBCCursor.FSTMTHandle, 'Could not execute statement.' );
     if (Res<>SQL_NO_DATA) then ODBCCheckResult( Res, SQL_HANDLE_STMT, ODBCCursor.FSTMTHandle, 'Could not execute statement.' );
 
 
-    if ODBCSuccess(SQLNumResultCols(ODBCCursor.FSTMTHandle, ColumnCount)) then
-      ODBCCursor.FSelectable:=ColumnCount>0
-    else
-      ODBCCursor.FSelectable:=False;
+    // go to first selectable result - see issue #38664
+    ODBCCursor.FSelectable:=False;
+    while not ODBCCursor.FSelectable and ODBCSuccess(Res) and
+      ODBCSuccess(SQLNumResultCols(ODBCCursor.FSTMTHandle, ColumnCount)) do
+      begin
+      ODBCCursor.FSelectable:=ColumnCount>0;
+      if not ODBCCursor.FSelectable then
+        Res:=SQLMoreResults(ODBCCursor.FSTMTHandle);
+      end;
 
 
   finally
   finally
     // free parameter buffers
     // free parameter buffers

+ 5 - 0
packages/odbc/src/odbcsql.inc

@@ -1217,6 +1217,7 @@ type   TSQLFetch=function (StatementHandle:SQLHSTMT):SQLRETURN;{$ifdef fpc} extd
 
 
 type   TSQLNumResultCols=function (StatementHandle:SQLHSTMT;
 type   TSQLNumResultCols=function (StatementHandle:SQLHSTMT;
            var ColumnCount:SQLSMALLINT):SQLRETURN;{$ifdef fpc} extdecl {$else} stdcall {$endif};
            var ColumnCount:SQLSMALLINT):SQLRETURN;{$ifdef fpc} extdecl {$else} stdcall {$endif};
+type   TSQLMoreResults=function (StatementHandle:SQLHSTMT):SQLRETURN;{$ifdef fpc} extdecl {$else} stdcall {$endif};
 
 
 type   TSQLDescribeCol=function (StatementHandle:SQLHSTMT;
 type   TSQLDescribeCol=function (StatementHandle:SQLHSTMT;
            ColumnNumber:SQLUSMALLINT;ColumnName:PSQLCHAR;
            ColumnNumber:SQLUSMALLINT;ColumnName:PSQLCHAR;
@@ -1444,6 +1445,7 @@ var    SQLCloseCursor:TSQLCloseCursor;
 var    SQLExecute:TSQLExecute;
 var    SQLExecute:TSQLExecute;
 var    SQLFetch:TSQLFetch;
 var    SQLFetch:TSQLFetch;
 var    SQLNumResultCols:TSQLNumResultCols;
 var    SQLNumResultCols:TSQLNumResultCols;
+var    SQLMoreResults:TSQLMoreResults;
 var    SQLDescribeColA:TSQLDescribeCol;
 var    SQLDescribeColA:TSQLDescribeCol;
        SQLDescribeColW:TSQLDescribeColW;
        SQLDescribeColW:TSQLDescribeColW;
 var    SQLFetchScroll:TSQLFetchScroll;
 var    SQLFetchScroll:TSQLFetchScroll;
@@ -1608,6 +1610,8 @@ var
    function SQLNumResultCols(
    function SQLNumResultCols(
                StatementHandle:SQLHSTMT;
                StatementHandle:SQLHSTMT;
                var ColumnCount:SQLSMALLINT):SQLRETURN;{$ifdef fpc} extdecl {$else} stdcall {$endif};external odbclib;
                var ColumnCount:SQLSMALLINT):SQLRETURN;{$ifdef fpc} extdecl {$else} stdcall {$endif};external odbclib;
+   function SQLMoreResults(
+               StatementHandle:SQLHSTMT):SQLRETURN;{$ifdef fpc} extdecl {$else} stdcall {$endif};external odbclib;
    function SQLDescribeCol(
    function SQLDescribeCol(
                StatementHandle:SQLHSTMT;
                StatementHandle:SQLHSTMT;
                ColumnNumber:SQLUSMALLINT;
                ColumnNumber:SQLUSMALLINT;
@@ -1918,6 +1922,7 @@ begin
     pointer(SQLExecute) := GetProcedureAddress(ODBCLibraryHandle,'SQLExecute');
     pointer(SQLExecute) := GetProcedureAddress(ODBCLibraryHandle,'SQLExecute');
     pointer(SQLFetch) := GetProcedureAddress(ODBCLibraryHandle,'SQLFetch');
     pointer(SQLFetch) := GetProcedureAddress(ODBCLibraryHandle,'SQLFetch');
     pointer(SQLNumResultCols) := GetProcedureAddress(ODBCLibraryHandle,'SQLNumResultCols');
     pointer(SQLNumResultCols) := GetProcedureAddress(ODBCLibraryHandle,'SQLNumResultCols');
+    pointer(SQLMoreResults) := GetProcedureAddress(ODBCLibraryHandle,'SQLMoreResults');
     pointer(SQLFetchScroll) := GetProcedureAddress(ODBCLibraryHandle,'SQLFetchScroll');
     pointer(SQLFetchScroll) := GetProcedureAddress(ODBCLibraryHandle,'SQLFetchScroll');
     pointer(SQLExtendedFetch) := GetProcedureAddress(ODBCLibraryHandle,'SQLExtendedFetch');
     pointer(SQLExtendedFetch) := GetProcedureAddress(ODBCLibraryHandle,'SQLExtendedFetch');
     pointer(SQLGetData) := GetProcedureAddress(ODBCLibraryHandle,'SQLGetData');
     pointer(SQLGetData) := GetProcedureAddress(ODBCLibraryHandle,'SQLGetData');