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

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

 

Ausdrücke als Hostvariablen

Hostvariablen müssen einfache Namen sein, da der SQL-Präprozessor Zeiger oder Referenzausdrücke nicht erkennt. Folgende Anweisung funktioniert nicht, weil der SQL-Präprozessor den Punkt-Operator nicht versteht. Dieselbe Syntax hat in SQL eine andere Bedeutung.

// Incorrect statement:
EXEC SQL SELECT LAST sales_id INTO :mystruct.mymember;

Obwohl die oben dargestellte Syntax nicht zulässig ist, können Sie dennoch mit folgender Methode einen Ausdruck verwenden:

  • Binden Sie den SQL-Deklarationsabschnitt in eine #if 0-Präprozessordirektive ein. Der SQL-Präprozessor liest die Deklarationen und verwendet sie für den Rest des Moduls, da er die Präprozessor-Direktiven ignoriert.

  • Definieren Sie einen Makro mit dem Namen der Hostvariablen. Da der SQL-Deklarationsabschnitt vom C-Compiler aufgrund der #if-Direktive nicht gesehen wird, kommt es zu keinem Konflikt. Stellen Sie sicher, dass der Makro mit demselben Hostvariabletyp aufgelöst wird.

Der folgende Code veranschaulicht diese Methode, um den Ausdruck host_value vor dem SQL-Präprozessor zu verbergen.



#include <sqlerr.h>
#include <stdio.h>
EXEC SQL INCLUDE SQLCA;
typedef struct my_struct {
   long     host_field;
} my_struct;
#if 0
   // Because it ignores #if preprocessing directives,
   // SQLPP reads the following declaration.
   EXEC SQL BEGIN DECLARE SECTION;
      long    host_value;
   EXEC SQL END DECLARE SECTION;
#endif
// Make C/C++ recognize the 'host_value' identifier
// as a macro that expands to a struct field.
#define host_value my_s.host_field

Da der SQLPP-Prozessor Direktiven für die bedingte Kompilierung ignoriert, wird host_value als Hostvariable vom Datentyp long behandelt, und wenn sie nachfolgend als Hostvariable verwendet wird, wird sie diesen Namen ausgeben. Der C/C++-Compiler verarbeitet die ausgegebene Datei und ersetzt alle entsprechenden Verwendungen des Namens durch my_s.host_field.

Mit den obigen Deklarationen können Sie auf host_field wie folgt zugreifen:



void main( void )
{
   my_struct      my_s;
   db_init( &sqlca );
   EXEC SQL CONNECT "DBA" IDENTIFIED BY "SQL";
   EXEC SQL DECLARE my_table_cursor CURSOR FOR
      SELECT int_col FROM my_table order by int_col;
   EXEC SQL OPEN my_table_cursor;
   for( ; ; ) {
      // :host_value references my_s.host_field
      EXEC SQL FETCH NEXT AllRows INTO :host_value;
      if( SQLCODE == SQLE_NOTFOUND ) {
         break;
      }
      printf( "%ld\n", my_s.host_field );
   }
   EXEC SQL CLOSE my_table_cursor;
   EXEC SQL DISCONNECT;
   db_fini( &sqlca );
}

Sie können mit derselben Methode andere lvalues-Werte als Hostvariablen verwenden:

  • Zeigerumleitungen

    *ptr
    p_struct->ptr
    (*pp_struct)->ptr
  • Array-Verweise

    my_array[ I ]
  • Beliebig komplexe lvalues-Werte