В папке \examples есть файл testodbc.pp. Эта программа обеспечивает доступ к базам данных через ODBC.
Во-первых, создадим базу данных stud1.mdb при помощи MS Aceess. В этой БД одна таблица - Students1 с полями:
Заполним таблицу например, так:
1 | Ivanov | 1 | 05.12.1990 |
2 | Петров | 2 | 14.06.1985 |
Program TestODBC; uses odbcsql; var DBDSn : Pchar; // Это имя источника данных ODBC Query : pchar; // Это SQL-запрос к базе данных UserName, Password : pchar; tt: text; db,qq,usn,pass: string; Function ODBCSuccess (Res : Integer) : Boolean; begin ODBCSuccess:= (res=SQL_SUCCESS) or (res=SQL_SUCCESS_WITH_INFO); end; Var EnvHandle : SQLHandle; DBHandle : SQLHandle; StmtHandle : SQLHSTMT; ResID : Longint; ResName : Array[0..255] of char; // Matches length of field+1 ResEmail : Array[0..255] of char; Procedure FreeHandles; begin If StmtHAndle<>0 then SQLFreeHandle(SQL_HANDLE_STMT,StmtHandle); If DBHandle<>0 then SQLFreeHandle(SQL_HANDLE_DBC,DBHandle); If EnvHandle<>0 then SQLFreeHandle(SQL_HANDLE_ENV,EnvHandle); end; Procedure DoError (Msg : String;ErrCode : Integer); begin FreeHandles; Writeln(Msg,' Code : ',ErrCode); Halt(1); end; Procedure StartSession; Var Res : Integer; begin EnvHandle:=0; DBHandle:=0; StmtHandle:=0; Res:=SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, EnvHandle); if Res <> SQL_SUCCESS then DoError('Could allocate ODBC handle',Res); Res:=SQLSetEnvAttr(EnvHandle,SQL_ATTR_ODBC_VERSION, SQLPOINTER(SQL_OV_ODBC3), 0); If Not ODBCSuccess(res) then DoError('Could not set environment',Res); Res:=SQLAllocHandle(SQL_HANDLE_DBC, envHandle, DBHandle); If res<>SQL_SUCCESS then DoError('Could not create database handle',res); Res:=SQLConnect(DBHandle,PSQLCHAR(DBDSN),SQL_NTS, PSQLChar(UserName),SQL_NTS, PSQLCHAR(Password),SQL_NTS); If Not OdbcSuccess(res) then DoError('Could not connect to datasource.',Res); end; Procedure ExecuteStatement; Var Res,ErrCode : LongInt; begin Res:=SQLAllocHandle(SQL_HANDLE_STMT,DBHandle,stmtHandle); If not ODBCSuccess(res) then DoError('Could not allocate statement handle.',Res); { Bind result buffers. Note that for many queries, the result is not known on beforehand, And must be queried with SQLPrepare, SQLNumResulCols and SQLDescribeCol before the statement is executed.} SQLBindCol(stmtHandle,1,SQL_INTEGER,SQLPointer(@ResID),4,@ErrCode); SQLBindCol(stmtHandle,2,SQL_CHAR,SQLPointer(@ResName),256,@ErrCode); SQLBindCol(stmtHandle,3,SQL_CHAR,SQLPointer(@ResEmail),256,@ErrCode); // Now actually do it. Res:=SQLExecDirect(StmtHandle,Query,SQL_NTS); if not ODBCSuccess(res) then DoError('Execute of statement failed.',Res); end; Procedure ShowResult; Var Count,Res : Longint; begin Res:=SQLFetch(StmtHandle); Count:=0; While Res<>SQL_NO_DATA do begin Inc(Count); Writeln(tt,'Record: ',Count,' : '); Writeln(tt,ResId,' ',PChar(@ResName[0]),' ',Pchar(@ResEmail[0])); Res:=SQLFetch(StmtHandle); end; end; begin Assign(tt,'odbc1.txt'); Rewrite(tt); write('Name of ODBC Source-> '); // Проблемы с русификацией readln(DB); DBDSn:= PChar(db); write('login (UserName) -> '); readln(usn); UserName:= PChar(usn); write('Password -> '); readln(pass); Password:= PChar(pass); write('SQL -> '); // select * from students1, readln(qq); Query:= PChar(qq); StartSession; ExecuteStatement; ShowResult; FreeHandles; Close(tt); end.
E:\XRAN_RW_MyProg\FPC_FPC>testodbc3.exe Name of ODBC Source-> students1 login (UserName) -> Password -> SQL -> select * from students1
E:\XRAN_RW_MyProg\FPC_FPC>testodbc3.exe Name of ODBC Source-> unesco1 login (UserName) -> root Password -> SQL -> select * from un_forum File 'C:\mysql\\share\charsets\?.conf' not found (Errcode: 2) Character set '#51' is not a compiled character set and is not specified in the 'C:\mysql\\share\charsets\Index' file