Только как прототип - развлечение на досуге.
Код: Выделить всё
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)