2010-11-07 01:33 UTC+0100 Viktor Szakats (harbour.01 syenar.hu)
* contrib/hbodbc/odbc.c
! SQLERROR(): Fixed to accept handle as pointer (not as number).
! SQLERROR(): Fixed returned cErrorMsg using proper length.
! SQLERROR(): Fixed to initialize 'out' parameters.
+ Added SQLGETDIAGREC( <nHandleType>, <hHandle>, <nRecNumber>, @<cSQLState>, @<nError>, @<cErrorMsg> ) -> <nResult>
* contrib/hbodbc/sql.ch
* Added self-guard
* Enclosed negative constant values in parents.
+ Added SQL_HANDLE_* constants.
* contrib/hbodbc/tests/odbcdemo.prg
* contrib/hbodbc/tests/odbccall.prg
* contrib/hbodbc/tests/testodbc.prg
* Added "simpleio.ch"
* Formatting.
! Changed locally rolled WITH OBJECT emulation with real WITH OBJECT syntax.
+ Added SQLERROR() and SQLGETDIAGREC() test calls.
This commit is contained in:
@@ -16,6 +16,26 @@
|
||||
The license applies to all entries newer than 2009-04-28.
|
||||
*/
|
||||
|
||||
2010-11-07 01:33 UTC+0100 Viktor Szakats (harbour.01 syenar.hu)
|
||||
* contrib/hbodbc/odbc.c
|
||||
! SQLERROR(): Fixed to accept handle as pointer (not as number).
|
||||
! SQLERROR(): Fixed returned cErrorMsg using proper length.
|
||||
! SQLERROR(): Fixed to initialize 'out' parameters.
|
||||
+ Added SQLGETDIAGREC( <nHandleType>, <hHandle>, <nRecNumber>, @<cSQLState>, @<nError>, @<cErrorMsg> ) -> <nResult>
|
||||
|
||||
* contrib/hbodbc/sql.ch
|
||||
* Added self-guard
|
||||
* Enclosed negative constant values in parents.
|
||||
+ Added SQL_HANDLE_* constants.
|
||||
|
||||
* contrib/hbodbc/tests/odbcdemo.prg
|
||||
* contrib/hbodbc/tests/odbccall.prg
|
||||
* contrib/hbodbc/tests/testodbc.prg
|
||||
* Added "simpleio.ch"
|
||||
* Formatting.
|
||||
! Changed locally rolled WITH OBJECT emulation with real WITH OBJECT syntax.
|
||||
+ Added SQLERROR() and SQLGETDIAGREC() test calls.
|
||||
|
||||
2010-11-06 23:25 UTC+0100 Viktor Szakats (harbour.01 syenar.hu)
|
||||
* INSTALL
|
||||
* Little clarification to '2. HOW TO DO A PARTIAL [RE]BUILD'
|
||||
|
||||
@@ -397,9 +397,14 @@ HB_FUNC( SQLERROR ) /* hEnv, hDbc, hStmt, @cErrorClass, @nType, @cErrorMsg */
|
||||
SQLSMALLINT wLen;
|
||||
SQLTCHAR buffer[ 256 ];
|
||||
SQLTCHAR szErrorMsg[ SQL_MAX_MESSAGE_LENGTH + 1 ];
|
||||
|
||||
buffer[ 0 ] = '\0';
|
||||
szErrorMsg[ 0 ] = '\0';
|
||||
wLen = 0;
|
||||
|
||||
hb_retni( SQLError( ( SQLHENV ) hb_parptr( 1 ),
|
||||
( SQLHDBC ) hb_parptr( 2 ),
|
||||
( SQLHSTMT ) ( HB_PTRUINT ) hb_parnint( 3 ),
|
||||
( SQLHSTMT ) ( HB_PTRUINT ) hb_parptr( 3 ),
|
||||
( SQLTCHAR * ) buffer,
|
||||
( SQLINTEGER * ) &lError,
|
||||
( SQLTCHAR * ) szErrorMsg,
|
||||
@@ -408,7 +413,32 @@ HB_FUNC( SQLERROR ) /* hEnv, hDbc, hStmt, @cErrorClass, @nType, @cErrorMsg */
|
||||
|
||||
O_HB_STORSTR( ( O_HB_CHAR * ) buffer, 4 );
|
||||
hb_stornl( ( long ) lError, 5 );
|
||||
O_HB_STORSTR( ( O_HB_CHAR * ) szErrorMsg, 6 );
|
||||
O_HB_STORSTRLEN( ( O_HB_CHAR * ) szErrorMsg, wLen, 6 );
|
||||
}
|
||||
|
||||
HB_FUNC( SQLGETDIAGREC ) /* nHandleType, hHandle, nRecNumber, @cSQLState, @nError, @cErrorMsg */
|
||||
{
|
||||
SQLTCHAR szSQLState[ 5 + 1 ];
|
||||
SQLINTEGER lError;
|
||||
SQLTCHAR szErrorMsg[ SQL_MAX_MESSAGE_LENGTH + 1 ];
|
||||
SQLSMALLINT wLen;
|
||||
|
||||
szSQLState[ 0 ] = '\0';
|
||||
szErrorMsg[ 0 ] = '\0';
|
||||
wLen = 0;
|
||||
|
||||
hb_retni( SQLGetDiagRec( ( SQLSMALLINT ) hb_parni( 1 ),
|
||||
( SQLHANDLE ) ( HB_PTRUINT ) hb_parptr( 2 ),
|
||||
( SQLSMALLINT) hb_parni( 3 ),
|
||||
( SQLTCHAR * ) szSQLState,
|
||||
( SQLINTEGER * ) &lError,
|
||||
( SQLTCHAR * ) szErrorMsg,
|
||||
( SQLSMALLINT ) sizeof( szErrorMsg ),
|
||||
( SQLSMALLINT * ) &wLen ) );
|
||||
|
||||
O_HB_STORSTR( ( O_HB_CHAR * ) szSQLState, 4 );
|
||||
hb_stornl( ( long ) lError, 5 );
|
||||
O_HB_STORSTRLEN( ( O_HB_CHAR * ) szErrorMsg, wLen, 6 );
|
||||
}
|
||||
|
||||
HB_FUNC( SQLROWCOUNT )
|
||||
|
||||
@@ -50,9 +50,12 @@
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef HBODBC_CH_
|
||||
#define HBODBC_CH_
|
||||
|
||||
/* RETCODEs */
|
||||
#define SQL_INVALID_HANDLE -2
|
||||
#define SQL_ERROR -1
|
||||
#define SQL_INVALID_HANDLE ( -2 )
|
||||
#define SQL_ERROR ( -1 )
|
||||
#define SQL_SUCCESS 0
|
||||
#define SQL_SUCCESS_WITH_INFO 1
|
||||
#define SQL_NO_DATA_FOUND 100
|
||||
@@ -71,13 +74,13 @@
|
||||
#define SQL_TIME 10
|
||||
#define SQL_TIMESTAMP 11
|
||||
#define SQL_VARCHAR 12
|
||||
#define SQL_BIT -7
|
||||
#define SQL_LONGVARCHAR -1
|
||||
#define SQL_LONGVARBINARY -4
|
||||
#define SQL_BIGINT -5
|
||||
#define SQL_TINYINT -6
|
||||
#define SQL_BIT ( -7 )
|
||||
#define SQL_LONGVARCHAR ( -1 )
|
||||
#define SQL_LONGVARBINARY ( -4 )
|
||||
#define SQL_BIGINT ( -5 )
|
||||
#define SQL_TINYINT ( -6 )
|
||||
|
||||
#define SQL_NVARCHAR -9
|
||||
#define SQL_NVARCHAR ( -9 )
|
||||
|
||||
#define SQL_TYPE_NULL 0
|
||||
#define SQL_TYPE_MIN SQL_BIT
|
||||
@@ -92,9 +95,9 @@ nullablity of a column in a table. */
|
||||
#define SQL_NULLABLE_UNKNOWN 2
|
||||
|
||||
/* Special length values */
|
||||
#define SQL_NULL_DATA -1
|
||||
#define SQL_DATA_AT_EXEC -2
|
||||
#define SQL_NTS -3
|
||||
#define SQL_NULL_DATA ( -1 )
|
||||
#define SQL_DATA_AT_EXEC ( -2 )
|
||||
#define SQL_NTS ( -3 )
|
||||
|
||||
/* SQLFreeStmt defines */
|
||||
#define SQL_CLOSE 0
|
||||
@@ -249,3 +252,10 @@ nullablity of a column in a table. */
|
||||
#define SQL_MAX_LENGTH 3
|
||||
#define SQL_ASYNC_ENABLE 4
|
||||
#define SQL_BIND_TYPE 5
|
||||
|
||||
#define SQL_HANDLE_ENV 1
|
||||
#define SQL_HANDLE_DBC 2
|
||||
#define SQL_HANDLE_STMT 3
|
||||
#define SQL_HANDLE_DESC 4
|
||||
|
||||
#endif
|
||||
|
||||
@@ -2,36 +2,33 @@
|
||||
* $Id$
|
||||
*/
|
||||
|
||||
#xcommand WITH <oObject> DO => Self := <oObject>
|
||||
#xcommand ENDWITH => Self := NIL
|
||||
#include "simpleio.ch"
|
||||
|
||||
PROCEDURE Main()
|
||||
|
||||
LOCAL cConStr
|
||||
LOCAL dsFunctions
|
||||
|
||||
LOCAL Self
|
||||
|
||||
cConStr := "DBQ=" + hb_FNameMerge( hb_DirBase(), "test.mdb" ) + ";Driver={Microsoft Access Driver (*.mdb)}"
|
||||
|
||||
dsFunctions := TODBC():New( cConStr )
|
||||
|
||||
WITH dsFunctions DO
|
||||
WITH OBJECT dsFunctions
|
||||
|
||||
::SetSQL( "SELECT * FROM test" )
|
||||
::Open()
|
||||
? ::FieldByName( "First" ):Value
|
||||
? ::Skip()
|
||||
? ::FieldByName( "First" ):Value
|
||||
? ::GoTo( 1 )
|
||||
? ::FieldByName( "First" ):Value
|
||||
? ::Prior()
|
||||
? ::FieldByName( "First" ):Value
|
||||
? ::First()
|
||||
? ::FieldByName( "First" ):Value
|
||||
? ::Last()
|
||||
? ::FieldByName( "First" ):Value
|
||||
? ::Close()
|
||||
:SetSQL( "SELECT * FROM test" )
|
||||
:Open()
|
||||
? :FieldByName( "First" ):Value
|
||||
? :Skip()
|
||||
? :FieldByName( "First" ):Value
|
||||
? :GoTo( 1 )
|
||||
? :FieldByName( "First" ):Value
|
||||
? :Prior()
|
||||
? :FieldByName( "First" ):Value
|
||||
? :First()
|
||||
? :FieldByName( "First" ):Value
|
||||
? :Last()
|
||||
? :FieldByName( "First" ):Value
|
||||
? :Close()
|
||||
|
||||
ENDWITH
|
||||
|
||||
|
||||
@@ -2,6 +2,8 @@
|
||||
* $Id$
|
||||
*/
|
||||
|
||||
#include "simpleio.ch"
|
||||
|
||||
PROCEDURE Main()
|
||||
|
||||
LOCAL aOrders
|
||||
@@ -20,17 +22,17 @@ PROCEDURE Main()
|
||||
|
||||
DO WHILE .T.
|
||||
|
||||
@ 00, 00 SAY padc( "- TODBC Demonstration -", 80 ) COLOR "B/W"
|
||||
@ 0, 0 SAY PadC( "- TODBC Demonstration -", 80 ) COLOR "B/W"
|
||||
|
||||
dsFunctions:SetSQL( "SELECT * FROM test" )
|
||||
dsFunctions:Open()
|
||||
|
||||
@ 03, 24 TO len( dsFunctions:Fields ) + 4, 55
|
||||
@ 3, 24 TO len( dsFunctions:Fields ) + 4, 55
|
||||
|
||||
aOrders := {}
|
||||
FOR i := 1 TO len( dsFunctions:Fields )
|
||||
FOR i := 1 TO Len( dsFunctions:Fields )
|
||||
|
||||
aadd( aOrders, dsFunctions:Fields[ i ] :FieldName )
|
||||
AAdd( aOrders, dsFunctions:Fields[ i ] :FieldName )
|
||||
@ i + 3, 25 PROMPT padc( "ORDER BY " + aOrders[ i ], 30 )
|
||||
|
||||
NEXT
|
||||
@@ -47,28 +49,28 @@ PROCEDURE Main()
|
||||
dsFunctions:Open()
|
||||
|
||||
FOR i := 11 TO 24
|
||||
@ i, 00 SAY REPL( " ", 80 )
|
||||
@ i, 0 SAY Replicate( " ", 80 )
|
||||
NEXT
|
||||
|
||||
@ 10, 00 TO 10, 79
|
||||
@ 24, 00 TO 24, 79
|
||||
@ 12, 00 TO 12, 79
|
||||
@ 11, 00 SAY ""
|
||||
@ 10, 0 TO 10, 79
|
||||
@ 24, 0 TO 24, 79
|
||||
@ 12, 0 TO 12, 79
|
||||
@ 11, 0 SAY ""
|
||||
|
||||
@ 11, 02 SAY "Statement:" COLOR "GR+/B"
|
||||
@ 11, col() + 1 SAY dsFunctions:cSQL
|
||||
@ 11, 2 SAY "Statement:" COLOR "GR+/B"
|
||||
@ 11, Col() + 1 SAY dsFunctions:cSQL
|
||||
|
||||
@ 14, 05 SAY " " + PadR( dsFunctions:FieldByName( "First" ) :FieldName, 3 ) + " " + ;
|
||||
PadR( dsFunctions:FieldByName( "Last" ) :FieldName, 15 ) + " " + ;
|
||||
PadR( dsFunctions:FieldByName( "Street" ) :FieldName, 2 ) + " " + ;
|
||||
PadR( dsFunctions:FieldByName( "City" ) :FieldName, 40 ) ;
|
||||
@ 14, 5 SAY " " + PadR( dsFunctions:FieldByName( "First" ):FieldName, 3 ) + " " + ;
|
||||
PadR( dsFunctions:FieldByName( "Last" ):FieldName, 15 ) + " " + ;
|
||||
PadR( dsFunctions:FieldByName( "Street" ):FieldName, 2 ) + " " + ;
|
||||
PadR( dsFunctions:FieldByName( "City" ):FieldName, 40 ) ;
|
||||
COLOR "B/W"
|
||||
|
||||
DO WHILE !dsFunctions:Eof()
|
||||
? " " + PadR( dsFunctions:FieldByName( "First" ) :Value, 3 ), "³", ;
|
||||
PadR( dsFunctions:FieldByName( "Last" ) :Value, 15 ), "³", ;
|
||||
PadR( dsFunctions:FieldByName( "Street" ) :Value, 2 ), "³", ;
|
||||
PadR( dsFunctions:FieldByName( "City" ) :Value, 40 )
|
||||
? " " + PadR( dsFunctions:FieldByName( "First" ):Value, 3 ), "|", ;
|
||||
PadR( dsFunctions:FieldByName( "Last" ):Value, 15 ), "|", ;
|
||||
PadR( dsFunctions:FieldByName( "Street" ):Value, 2 ), "|", ;
|
||||
PadR( dsFunctions:FieldByName( "City" ):Value, 40 )
|
||||
dsFunctions:Skip()
|
||||
ENDDO
|
||||
|
||||
|
||||
@@ -2,6 +2,8 @@
|
||||
* $Id$
|
||||
*/
|
||||
|
||||
#include "simpleio.ch"
|
||||
|
||||
#include "sql.ch"
|
||||
|
||||
#xcommand GET ROW <nRow> INTO <cVar> => ;
|
||||
@@ -17,6 +19,7 @@ PROCEDURE Main()
|
||||
LOCAL cConstrout := SPACE(1024)
|
||||
LOCAL nRows := 0
|
||||
LOCAL cCode, cFunc, cState, cComm
|
||||
LOCAL cError1, nError, cError2
|
||||
|
||||
? "Version: " + hb_NumToHex( hb_odbcVer() )
|
||||
|
||||
@@ -33,9 +36,22 @@ PROCEDURE Main()
|
||||
? "Allocating statement... "
|
||||
SQLAllocStmt( hDbc, @hStmt )
|
||||
|
||||
? SQLError( hEnv,,, @cError1, @nError, @cError2 )
|
||||
? "SQLERROR", cError1, nError, cError2
|
||||
? SQLGetDiagRec( SQL_HANDLE_ENV, hEnv, 1, @cError1, @nError, @cError2 )
|
||||
? "SQLGETDIAGREC", cError1, nError, cError2
|
||||
|
||||
? "SQL: SELECT FROM test"
|
||||
SQLExecDirect( hStmt, "SELECT FROM test" )
|
||||
|
||||
? SQLError( hStmt,,, @cError1, @nError, @cError2 )
|
||||
? "SQLERROR", cError1, nError, cError2
|
||||
? SQLGetDiagRec( SQL_HANDLE_STMT, hStmt, 1, @cError1, @nError, @cError2 )
|
||||
? "SQLGETDIAGREC", cError1, nError, cError2
|
||||
|
||||
?
|
||||
? "SQL: SELECT * FROM TEST"
|
||||
SQLExecDirect( hStmt, "select * from test" )
|
||||
? "SQL: SELECT * FROM test"
|
||||
SQLExecDirect( hStmt, "SELECT * FROM test" )
|
||||
|
||||
?
|
||||
|
||||
@@ -45,11 +61,11 @@ PROCEDURE Main()
|
||||
GET ROW 2 INTO cFunc
|
||||
GET ROW 3 INTO cState
|
||||
GET ROW 4 INTO cComm
|
||||
? cCode, padr( cFunc, 20 ), cState, cComm
|
||||
? cCode, PadR( cFunc, 20 ), cState, cComm
|
||||
ENDDO
|
||||
|
||||
? "------------------------------------------------------------------------------"
|
||||
? str( nRows, 4 ), " row(s) affected."
|
||||
? Str( nRows, 4 ), " row(s) affected."
|
||||
|
||||
SQLFreeStmt( hStmt, SQL_DROP )
|
||||
SQLDisConnect( hDbc )
|
||||
|
||||
Reference in New Issue
Block a user