Click here to view and discuss this page in DocCommentXchange. In the future, you will be sent there automatically.

SAP Sybase SQL Anywhere 16.0 (Deutsch) » UltraLite - C- und C++-Programmierung » Anwendungsentwicklung » UltraLite C++-Anwendungsentwicklung mit Embedded SQL » Hostvariablen

 

Hostvariablen in C++

Eine ähnliche Situation tritt ein, wenn Sie Hostvariablen 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 Variablen können als Hostvariablen 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 Variablen in this->host_member konvertiert. Der Präprozessor würde sonst den Typ dieser Variablen 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.