next up previous contents
Next: Über dieses Dokument Up: Kurzvorstellung ADABAS D für Previous: Dienstprogramme

Datenbankzugriff mit C/C++ via Embedded SQL

 

Mit Hilfe entsprechender Pre-Compiler können C/C++ (oder auch COBOL) Programme auf die Datenbank zugreifen. Die SQL Kommandos werden hierfür mit EXEC SQL eingeleitet. Der Precompiler übersetzt alle EXEC SQL Anweisungen in C Code für den Aufruf der von ADABAS D bereitgestellten API. Das resultierende C Programm wird mit dem C Compiler übersetzt und mit den ADABAS D Bibliotheken gelinkt.

Beispiel

Folgendes kleines Programm lädt jede Zeile, die es von stdin liest, in eine Datenbank-Tabelle foo. Zur Vereinfachung wird die Tabelle foo jedesmal gelöscht (drop) und neu angelegt.

Da das Programm im ORACLE7 kompatiblem Mode precompiliert wird, ist der Sourcecode voll portabel zwischen ORACLE7, ORACLE6 und ADABAS D Datenbank Backends.

ld.cpc:

/*
 * load every line from stdin into database table foo
 * $Id: node9.html,v 1.1 1999/10/26 10:06:43 ronsc Exp $
 */
#include <stdio.h>

EXEC SQL BEGIN DECLARE SECTION;
        int n;			/* line counter */
        varchar text[256];	/* line */
EXEC SQL END DECLARE SECTION;
EXEC SQL INCLUDE SQLCA.H;
EXEC SQL WHENEVER SQLERROR GOTO sqlerr;

void drop_foo();

main(int argc, char *argv)
{
        char buf[256];
        int connected= 0;

        setbuf(stdout, NULL);

        EXEC SQL CONNECT joe IDENTIFIED BY joe;
        connected= 1;

        drop_foo();
        EXEC SQL create table foo (nr number(8), text varchar2(256));

        n= 0;
        while (fgets(buf, sizeof(buf), stdin)) {
               buf[strlen(buf)-1]= '\0';

               strcpy(text.arr, buf); 
               text.len= strlen(text.arr);

               EXEC SQL insert into foo values (:n, :text);
               n++;
               putchar('.');
        }
        putchar('\n');

        EXEC SQL COMMIT WORK RELEASE;
        exit(0);

sqlerr:
        fprintf(stderr, "SQL Error: %s\n", sqlca.sqlerrm.sqlerrmc);
        if (connected) {
               EXEC SQL ROLLBACK WORK RELEASE;
        }
        exit(1);
}

void
drop_foo()
{
        EXEC SQL drop table foo;
        return;
sqlerr:
        /* ignored */
        return;
}

Zur Kompilierung unter ADABAS D kann folgendes (GNU-)Makefile verwendet werden:

# $Id: node9.html,v 1.1 1999/10/26 10:06:43 ronsc Exp $

pgm = load
sources = ld.cpc

CC = gcc
CFLAGS = -Wall
CPC = cpc
CPCFLAGS = -S oracle
ADALIBS = pcrlib.a pcd1lib.a pcd2lib.a pcd3lib.a libsqlrte.a libsqlptc.a \
	sqlca.a	
SYSLIBS = -lncurses

objects= $(addsuffix .o,$(basename $(sources)))

$(pgm): $(objects)
	 $(CC) $(LDFLAGS) -o $@ $(objects) \
		$(addprefix $(DBROOT)/lib/,$(ADALIBS)) $(SYSLIBS)

clean:
	rm -f $(objects) core $(pgm)

%.o: %.cpc
	$(CPC) $(CPCFLAGS) $(basename $?)



Frank Roscher
Fri Jun 13 17:14:20 MET DST 1997