Только как прототип - развлечение на досуге.
Код: Выделить всё
    program
DWORD       EQUATE(ULONG)
HANDLE      EQUATE(UNSIGNED)
WORD        EQUATE(SIGNED)
LPCSTR      EQUATE(CSTRING)
   MAP
   module('ODBC32.lib')
! proc - все равно как вызывать - процедура \ функция
! ВСе прототипы из MS SDK ODBC
        SQLAllocHandle(SHORT, LONG, *LONG), SHORT, RAW, PASCAL, NAME('SQLAllocHandle'),proc,DLL(1)
        SQLSetEnvAttr(LONG, LONG, LONG , LONG), SHORT, RAW, PASCAL, NAME('SQLSetEnvAttr'),proc,DLL(1)
        SQLConnect(LONG, *CSTRING, SHORT, *CSTRING, SHORT, *CSTRING, SHORT), SHORT, RAW, PASCAL, NAME('SQLCONNECT'),proc,DLL(1)
        SQLEXECDirect(LONG, *CSTRING, LONG), SHORT, RAW, PASCAL, NAME('SQLEXECDIRECT'),proc,DLL(1)
        SQLPrepare(LONG, *CSTRING, LONG), SHORT, RAW, PASCAL, NAME('SQLPREPARE'), proc, DLL(1)
        SQLBindParameter(LONG,USHORT,SHORT, SHORT, SHORT, ULONG, SHORT, *?, LONG, *? ),SHORT,RAW,PASCAL,NAME('SQLBindParameter'),proc,DLL(1)
        SQLExecute(LONG), SHORT ,RAW, PASCAL, NAME('SQLEXECUTE'), PROC, DLL(1)
        SQLBindCol(LONG, USHORT, SHORT, LONG, LONG ,LONG),SHORT,RAW,PASCAL,NAME('SQLBINDCOL'),proc,DLL(1)
        SQLNumResultCols(LONG, *SHORT), SHORT, RAW, PASCAL, NAME('SQLNUMRESULTCOLS'),proc,DLL(1)
        SQLFetch(LONG), SHORT, RAW, PASCAL, NAME('SQLFETCH'),proc,DLL(1)
        SQLColAttribute(LONG, USHORT, USHORT, LONG, SHORT, *SHORT, *LONG), SHORT, RAW, PASCAL, NAME('SQLCOLATTRIBUTE'),proc,DLL(1)
        SQLDescribeCol(LONG, USHORT, *CSTRING, SHORT, *SHORT, *SHORT, *ULONG, *SHORT, *SHORT), SHORT, RAW, PASCAL, NAME('SQLDESCRIBECOL'),proc,DLL(1)
        SQLColAttributes(LONG, USHORT, USHORT, LONG, SHORT, *SHORT, *LONG), SHORT, RAW, PASCAL, NAME('SQLCOLATTRIBUTES'),proc,DLL(1)
        SQLCloseCursor(LONG),SHORT, RAW, PASCAL, NAME('SQLCloseCursor'),proc,DLL(1)
        SQLFreeHandle(SHORT, LONG),SHORT, RAW, PASCAL, NAME('SQLFreeHandle'),proc,DLL(1)
        SQLDisconnect(LONG),SHORT,RAW,PASCAL,NAME('SQLDISCONNECT'),proc,DLL(1)
        end
! и еще
        SelectFB(string, string , string, *string , *string ), long  !URL POST Data Server Data
   end
 
dsn   string(32)
uid   string(32)
pwd   string(32)
req   string(255)
rez   string(528000)
Window WINDOW('Firebird ODBC Access'),AT(,,395,264),FONT('MS Sans Serif',8,,FONT:regular),CENTER,GRAY
       TEXT,AT(12,7,373,187),USE(rez),BOXED,HVSCROLL
       BUTTON('Lookup'),AT(269,214,33,14),USE(?lookup)
       BUTTON('Exit'),AT(311,214,33,14),USE(?OkButton),LEFT,DEFAULT
       ENTRY(@s32),AT(11,215,191,10),USE(dsn)
       ENTRY(@s32),AT(11,228,191,10),USE(uid)
       ENTRY(@s100),AT(11,202,191,10),USE(pwd)
       ENTRY(@s100),AT(12,242,376,10),USE(req)
     END
      code
!
!     this code is only executed if linked as an .exe
!
      dsn = 'FireBird'
      uid = 'SYSDBA'
      pwd = 'masterkey'
      req = 'select * from Country'
      open (window)
      accept
!        if event() = event:openwindow then
!           rtn# = postadata(serv,pexe,bff,text1)
!           if rtn# <> 0 then message('It didnt work - ' & rtn#,'Error',icon:exclamation).
!           end
        if accepted() = ?okbutton then break.
        if accepted() = ?lookup then
           clear(rez)
           rtn# = SelectFB(dsn,uid,pwd,req,rez)
           if rtn# <> 0 then
                             message('It didnt work - ' & rtn#,'Error',icon:exclamation)
                        end
           display()
           end
      end ! accept loop
!----------------------------------------------------------------------------------------
SelectFB Procedure(string pstdsn, string pstuid, string pstpwd, *string pstreq, *string pstrez)
!----------------------------------------------------------------------------------------
      Include('ODBC_EQU.INC')
ZERO     DWORD
henv     handle
hdbc     handle
hstmt    handle
s0       long
s1       long
s2       long
doplong  long
buffpointer long
bufflen    long
FldBindType short
buff     cstring(255),DIM(30)
szuser   cstring(32)
szpass   cstring(32)
szdsn    cstring(32)
serchs   cstring(255)
qcols    short
      code
    henv = 0
!  Alloc env handle
    if SQLAllocHandle(SQL_HANDLE_ENV, 0, henv) <> 0   then
    message('AllocHandle on ENV failed.')
                                                              else                                ! 1
!    message('AllocHandle on ENV OK.')
    SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, SQL_OV_ODBC3, SQL_IS_INTEGER)
    hdbc = 0
    if SQLAllocHandle(SQL_HANDLE_DBC, henv, hdbc) <> 0 then
        message('AllocHandle on DBC failed.')
                                                              else                                 ! 2
!       message('AllocHandle on DBC OK.')
       szDsn   = clip(pstdsn)
       szuser  = clip(pstuid)
       szPass  = clip(pstpwd)
    if SQLConnect(hdbc,szDsn, len(szdsn), szuser, len(szUser), szPass, len(szPass)) <> 0 then
        message('Connect to ODBC failed.')
                                                                                         else      ! 3
!       message('Connect to ODBC OK.')
!   Get a statement handle
    if SQLAllocHandle(SQL_HANDLE_STMT, hdbc, hstmt) <>  0 then
        message('AllocHandle on STMT failed.')
                                                           else                                    ! 4
!        message('AllocHandle on STMT OK.')
!  Подготавливаем запрос, обратите внимание на знаки "?" вместо значений.
   serchs = clip(pstreq)
   s0 = SQLPrepare(hstmt, serchs, len(serchs))
   if s0 <> 0 then
   message('SQLPrepare on STMT failed.')
              end
! Связываем 1-й и 2-й параметры с переменными.
!   SQLBindParameter(hstmt, 1, SQL_PARAM_INPUT, SQL_C_FLOAT, SQL_REAL, 7, 0, Price, 0, &PriceInd);
!   SQLBindParameter(hstmt, 2, SQL_PARAM_INPUT, SQL_C_ULONG, SQL_INTEGER, 10, 0, PartID, 0, PartIDInd);
!   Запрос готов.
!   Инициализируем связанные переменные значениями и выполняем запрос.
!   while (GetPrice(&PartID, &Price))
!
    s0 = SQLExecute(hstmt)
    if s0 <> 0 then
     message('SQLExecute on STMT failed.')
              end
    s0 = SQLNumResultCols( hstmt, QCols )
    if s0 <> 0 then
     message('SQLNumResultCols on STMT failed.')
               end
    
    if Qcols > 30 then qcols = 30 .
    loop s2 = 1 to Qcols
    bufflen = 255
    s0 = SQLBindCol( hstmt, s2, SQL_C_CHAR , Address(buff[s2]), BuffLen, doplong )
    if s0 <> 0 then
     message('SQLBindCol on STMT failed.')
               end
    end
!    if s0 <> 0 then
!     message('SQLBindCol on STMT failed.')
!               end
    loop
     s0 = SQLFetch(hstmt)
!    if s0 <> 0 then
!     message('SQLFetch on STMT failed.')
!              end
    if s0 = SQL_NO_DATA then break .
    loop s1 = 1 to qcols
    pstrez = clip(pstrez) &  clip(buff[s1]) & '|'
    end
    pstrez = clip(pstrez) &  '<13><10>'
    end
    if hstmt <> 0 then SQLFreeHandle(SQL_HANDLE_STMT, hstmt) .
    if hdbc  <> 0 then SQLDisconnect(hdbc);  SQLFreeHandle(SQL_HANDLE_DBC, hdbc) .
    if henv  <> 0 then SQLFreeHandle(SQL_HANDLE_ENV, henv) .
                                                                                                        end
                                                                                                        end
                                                                                                        end
                                                                                                        end
                                                                                                        
 
      return(0)