Hallo,
im Fach Datenbanksysteme haben wir eine Aufgabenstellung bekommen mit Embedded SQL. (Ich hoffe das ist das richtige Unterforum ansonsten bitte einfach verschieben.)
Und zwar haben wir eine Oracel Datenbank mit Gemeinden, Wegweisern, Standorte der Wegwesier, etc.
Es ist verlangt dass der Benutzer bei dem ESQL Programm den Namen von der Gemeinde von Hand eingeben soll um die dazu gehörigen Informationen abzurufen.
Ich gehe dabei so vor:
Die Eingabe des Benutzers wird in einem VARCHAR array gespeichert.
Dieses soll dann als "WHERE" Vergleich dienen.
also so würde das aussehen:
EXEC SQL DECLARE Gemeinde_cursor CURSOR FOR
SELECT GNAME FROM Gemeinde WHERE GNAME = :input;
("input" wäre hier das array)
Doch wenn ich dann das Programm mit dem Preecompiler übersetze und dann ausführe bekomme ich an der stellte wo der Cursor geöffnet werden soll die Fehlermeldung:
"Fehler bei DB-Zugriff ORA-01450 Ungültige Länge in variabler Zeichenfolge"
Wenn ich aber das "input" in der Abfrage durch einen Namen einer Gemeinde aus der Datenbank tausche (so das die Benutzereingabe entfällt) gibt es keine Probleme.
Ich hoffe hier kennt sich jemand mit Embedded SQL besser aus und kann mir helfen, ich weis nicht mehr weiter.
Hier nochmal der ganze ESQL Code falls nötig und im Anhang ein Ausschnitt der Datenbank.
Danke schon mal für jede Hilfe.
(Der Code ist noch nicht fertig es geht jetzt nur mal um das Problem)
#include <stdio.h>
#include <string.h>
EXEC SQL INCLUDE sqlca; /* SQL communication area */
int main (){
EXEC SQL BEGIN DECLARE SECTION;
VARCHAR user[16];
VARCHAR pwd[10];
VARCHAR input[20];
VARCHAR gname[20];
int gemeinde_input;
int laenge;
EXEC SQL END DECLARE SECTION;
EXEC SQL WHENEVER SQLERROR GOTO sqlerror; /* unspezifische Fehlerbehandlung */
/*Benutzer nach Name und Passwort fragen*/
printf ("Benutzername und Datenbankverbindung: ");
gets(user.arr);
user.len = strlen (user.arr);
printf("Passwort: ");
gets (pwd.arr);
pwd.len = strlen (pwd.arr);
EXEC SQL CONNECT :user IDENTIFIED BY wd;
if (sqlca.sqlcode == 0){
printf ("Connected to Oracle as %s\n", user.arr);
printf("Bitte geben Sie den Namen einer dieser Gemeinde ein: ");
printf("\n Baienfurt, Baindt, Weingarten, \n Ravensburg, Wolpertswende, Meckenbeuren, \n Friedrichshafen, Waldburg, Bodnegg, \n Amtzell \n");
printf("Gemeinde: ");
gets(input.arr);
laenge = strlen (input.arr);
input.arr[laenge] = '\0';
}
EXEC SQL DECLARE Gemeinde_cursor CURSOR FOR /*Cursor für Gemeindedaten */
SELECT GNAME FROM Gemeinde WHERE GNAME = :input;
EXEC SQL OPEN Gemeinde_cursor; /*Abfrage ausführen*/
EXEC SQL FETCH Gemeinde_cursor INTO :gname; /* Gemeinde Holen */
if (sqlca.sqlcode == 0){
gname.arr[gname.len] = '\0';
printf("Gemeinde %s wurde gewählt \n\n", gname.arr);
}
EXEC SQL CLOSE Gemeinde_Cursor;
gets(user.arr); /*NUR DAMIT DIE KONSOLE OFFEN BLEIBT */
return (1);
sqlerror: printf ("Fehler bei DB-Zugriff % .70s \n", sqlca.sqlerrm.sqlerrmc);
gets(user.arr);
return(0);
}
im Fach Datenbanksysteme haben wir eine Aufgabenstellung bekommen mit Embedded SQL. (Ich hoffe das ist das richtige Unterforum ansonsten bitte einfach verschieben.)
Und zwar haben wir eine Oracel Datenbank mit Gemeinden, Wegweisern, Standorte der Wegwesier, etc.
Es ist verlangt dass der Benutzer bei dem ESQL Programm den Namen von der Gemeinde von Hand eingeben soll um die dazu gehörigen Informationen abzurufen.
Ich gehe dabei so vor:
Die Eingabe des Benutzers wird in einem VARCHAR array gespeichert.
Dieses soll dann als "WHERE" Vergleich dienen.
also so würde das aussehen:
EXEC SQL DECLARE Gemeinde_cursor CURSOR FOR
SELECT GNAME FROM Gemeinde WHERE GNAME = :input;
("input" wäre hier das array)
Doch wenn ich dann das Programm mit dem Preecompiler übersetze und dann ausführe bekomme ich an der stellte wo der Cursor geöffnet werden soll die Fehlermeldung:
"Fehler bei DB-Zugriff ORA-01450 Ungültige Länge in variabler Zeichenfolge"
Wenn ich aber das "input" in der Abfrage durch einen Namen einer Gemeinde aus der Datenbank tausche (so das die Benutzereingabe entfällt) gibt es keine Probleme.
Ich hoffe hier kennt sich jemand mit Embedded SQL besser aus und kann mir helfen, ich weis nicht mehr weiter.
Hier nochmal der ganze ESQL Code falls nötig und im Anhang ein Ausschnitt der Datenbank.
Danke schon mal für jede Hilfe.
(Der Code ist noch nicht fertig es geht jetzt nur mal um das Problem)
#include <stdio.h>
#include <string.h>
EXEC SQL INCLUDE sqlca; /* SQL communication area */
int main (){
EXEC SQL BEGIN DECLARE SECTION;
VARCHAR user[16];
VARCHAR pwd[10];
VARCHAR input[20];
VARCHAR gname[20];
int gemeinde_input;
int laenge;
EXEC SQL END DECLARE SECTION;
EXEC SQL WHENEVER SQLERROR GOTO sqlerror; /* unspezifische Fehlerbehandlung */
/*Benutzer nach Name und Passwort fragen*/
printf ("Benutzername und Datenbankverbindung: ");
gets(user.arr);
user.len = strlen (user.arr);
printf("Passwort: ");
gets (pwd.arr);
pwd.len = strlen (pwd.arr);
EXEC SQL CONNECT :user IDENTIFIED BY wd;
if (sqlca.sqlcode == 0){
printf ("Connected to Oracle as %s\n", user.arr);
printf("Bitte geben Sie den Namen einer dieser Gemeinde ein: ");
printf("\n Baienfurt, Baindt, Weingarten, \n Ravensburg, Wolpertswende, Meckenbeuren, \n Friedrichshafen, Waldburg, Bodnegg, \n Amtzell \n");
printf("Gemeinde: ");
gets(input.arr);
laenge = strlen (input.arr);
input.arr[laenge] = '\0';
}
EXEC SQL DECLARE Gemeinde_cursor CURSOR FOR /*Cursor für Gemeindedaten */
SELECT GNAME FROM Gemeinde WHERE GNAME = :input;
EXEC SQL OPEN Gemeinde_cursor; /*Abfrage ausführen*/
EXEC SQL FETCH Gemeinde_cursor INTO :gname; /* Gemeinde Holen */
if (sqlca.sqlcode == 0){
gname.arr[gname.len] = '\0';
printf("Gemeinde %s wurde gewählt \n\n", gname.arr);
}
EXEC SQL CLOSE Gemeinde_Cursor;
gets(user.arr); /*NUR DAMIT DIE KONSOLE OFFEN BLEIBT */
return (1);
sqlerror: printf ("Fehler bei DB-Zugriff % .70s \n", sqlca.sqlerrm.sqlerrmc);
gets(user.arr);
return(0);
}
Anhänge
Zuletzt bearbeitet: