summaryrefslogtreecommitdiff
path: root/packages/odbc/tests/testodbc.pp
diff options
context:
space:
mode:
Diffstat (limited to 'packages/odbc/tests/testodbc.pp')
-rw-r--r--packages/odbc/tests/testodbc.pp121
1 files changed, 121 insertions, 0 deletions
diff --git a/packages/odbc/tests/testodbc.pp b/packages/odbc/tests/testodbc.pp
new file mode 100644
index 0000000000..99edb8062e
--- /dev/null
+++ b/packages/odbc/tests/testodbc.pp
@@ -0,0 +1,121 @@
+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 assigned(StmtHAndle) then
+ SQLFreeHandle(SQL_HANDLE_STMT,StmtHandle);
+ If assigned(dbhandle) then
+ SQLFreeHandle(SQL_HANDLE_DBC,DBHandle);
+ If assigned(EnvHandle) 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:=nil;
+ DBHandle:=nil;
+ StmtHandle:=nil;
+ 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.