fpc/packages/base/odbc/testodbc.pp
joost fbaa49fc9c + Added odbcsqldyn.pp
+ Fixed dyn. loading of ODBC and cleanup of non-fpc code
 + TODBCConnection now uses odbcsqldyn

git-svn-id: trunk@1687 -
2005-11-07 21:40:32 +00:00

122 lines
3.0 KiB
ObjectPascal

Program TestODBC;
uses odbcsql;
Const
DBDSn : Pchar = 'FPC';
Empty : pchar = '';
Query : pchar = 'SELECT Id,Username,InstEmail from FPdev Order by UserName';
// Adapt to needs...
{$ifdef linux}
UserName : pchar = 'michael'; // for mysql test.
Password : pchar = 'geen';
{$else}
UserName : pchar = ''; // for MS-Acces test.
Password : pchar = '';
{$endif}
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);
Write('Record: ',Count,' : ');
Writeln(ResId,' ',PChar(@ResName[0]),' ',Pchar(@ResEmail[0]));
Res:=SQLFetch(StmtHandle);
end;
end;
begin
StartSession;
ExecuteStatement;
ShowResult;
FreeHandles;
end.