Eine ähnliche Situation tritt ein, wenn Sie Hostvariable in C++-Klassen verwenden. Es empfiehlt sich häufig, eine Klasse in einer eigenen Header-Datei zu deklarieren. Diese Header-Datei kann zum Beispiel folgende Deklaration von my_class enthalten.
typedef short a_bool; #define TRUE ((a_bool)(1==1)) #define FALSE ((a_bool)(0==1)) public class { long host_member; my_class(); // Constructor ~my_class(); // Destructor a_bool FetchNextRow( void ); // Fetch the next row into host_member } my_class; |
In diesem Beispiel ist jede Methode in einer Embedded SQL-Quelldatei implementiert. Nur einfache Variable können als Hostvariable verwendet werden. Die im vorigen Abschnitt vorgestellte Methode kann verwendet werden, um auf ein Datenmitglied einer Klasse zuzugreifen.
EXEC SQL INCLUDE SQLCA; #include "my_class.hpp" #if 0 // Because it ignores #if preprocessing directives, // SQLPP reads the following declaration. EXEC SQL BEGIN DECLARE SECTION; long this_host_member; EXEC SQL END DECLARE SECTION; #endif // Macro used by the C++ compiler only. #define this_host_member this->host_member my_class::my_class() { EXEC SQL DECLARE my_table_cursor CURSOR FOR SELECT int_col FROM my_table order by int_col; EXEC SQL OPEN my_table_cursor; } my_class::~my_class() { EXEC SQL CLOSE my_table_cursor; } a_bool my_class::FetchNextRow( void ) { // :this_host_member references this->host_member EXEC SQL FETCH NEXT AllRows INTO :this_host_member; return( SQLCODE != SQLE_NOTFOUND ); } void main( void ) { db_init( &sqlca ); EXEC SQL CONNECT "DBA" IDENTIFIED BY "SQL"; { my_class mc; // Created after connecting. while( mc.FetchNextRow() ) { printf( "%ld\n", mc.host_member ); } } EXEC SQL DISCONNECT; db_fini( &sqlca ); } |
Im obigen Beispiel wird this_host_member
für den SQL-Präprozessor deklariert, doch der Makro bewirkt, dass C++ die Variable in this->host_member
konvertiert. Der Präprozessor würde sonst den Typ dieser Variable nicht kennen. Viele C/C++-Compiler tolerieren keine mehrfach
vorhandenen Deklarationen. Die #if
-Direktive dient dazu, die zweite Deklaration vor dem Compiler zu verbergen, lässt sie jedoch für den SQL-Präprozessor sichtbar.
Mehrere Deklarationen können nützlich sein, doch Sie müssen sicherstellen, dass jede Deklaration den einzelnen Typen dieselben Variablenamen gibt. Der Präprozessor geht davon aus, dass jede Hostvariable im Anschluss an ihre Deklaration global bekannt ist, da er die Sprache "C" nicht vollständig syntaktisch analysieren kann.
Kommentieren Sie diese Seite in DocCommentXchange. Senden Sie uns Feedback über diese Seite via E-Mail. |
Copyright © 2009, iAnywhere Solutions, Inc. - SQL Anywhere 11.0.1 |