Ich bin ein COBOL-Programmierer, und mein neuestes Projekt ist es, eine COBOL-Anwendung mit einer SQLite3-Datenbank zu verbinden.Wie schreibe ich SQLite Callback in COBOL
Ich habe this guide verfolgt, und ihre Lösung ist genau das, was ich in meiner COBOL-Anwendung benötigen würde. Es ist mir gelungen, Daten zu erstellen, zu verbinden, Daten einzufügen und die Datenbank zu schließen, aber das Problem tritt auf, wenn ich versuche, Daten aus der Datenbank auszuwählen.
Im Tutorial verwenden sie einen Callback mit Doppelzeigern.
static int callback(void *NotUsed, int argc, char **argv, char **azColName){
int i;
for(i=0; i<argc; i++){
printf("%s = %s\n", azColName[i], argv[i] ? argv[i] : "NULL");
}
printf("\n");
return 0;
}
Meine Lösung in COBOL wird wie folgt
WORKING-STORAGE SECTION.
*----------------------------------------------------------------*
01 sqlite3-db pointer.
01 err_msg pointer.
01 sqlite pointer.
01 res pointer.
01 notused pointer.
01 argc pic 99 comp-5.
01 argv pointer.
01 azColName pointer.
01 Writefunction-Ptr procedure-pointer.
procedure division.
set Writefunction-Ptr to entry "sqlite-callback".
*>Random code.
call "sqlite3_exec" using
by value sqlite3-db
by reference sqlQuery
by value Writefunction-Ptr
by value 0
by reference err_msg
returning rc
end-call
*>Random code.
stop run.
entry "sqlite-callback" using
by value notused
by value argc
by reference argv
by reference azColName.
display argc
goback.
Entry-Termination.
Der Rückruf funktioniert, weil es die Anzahl der Zeilen aufgerufen wird, die aus der Datenbank, und die ganze Zahl argc enthält die Anzahl der Spalten, die die zurückgegeben Tabelle enthält.
Die Frage ist:
Doppelzeiger in COBOL, wie sind sie vertreten? In meiner Lösung deklariere ich einen Zeiger und rufe den Callback mit "by reference" auf den Zeiger. Wissen Sie nicht, ob dies der richtige Weg ist, Doppelzeiger in COBOL darzustellen?
Wie zeige ich den Inhalt von azColName und argv an und nicht nur die Speicheradresse, auf die der Zeiger zeigt?
Ich versuchte jetzt, SET ADDRESS OF zu verwenden, aber ich bekomme es immer noch nicht zur Arbeit. Muss etwas sein, das ich vermisst habe. Meine Lösung ist im Moment wie folgt aussieht:
WORKING-STORAGE SECTION.
01 argv pointer.
Linkage Section.
01 link-area pic x.
procedure division using link-area.
*> RANDOM CODE
set address of link-area to argv
call "sqlite3_exec" using
by value sqlite3-db
by reference z"SELECT * FROM Cars"
by value Writefunction-Ptr
by value 0
by reference err_msg
returning rc
end-call
*> RANDOM CODE
entry "sqlite-callback" using
by value notused
by value argc
by reference argv
by reference azColName.
display argc.
if address of link-area not = null
display "Contents of new argv: " link-area
else
display "empty"
end-if
goback.
Entry-Termination.
Das Ergebnis, das ich bekommen ist, dass die if-Anweisung immer falsch ist, so dass die Zeichenfolge „leer“ angezeigt wird. Aber immer noch wird argc auf die Anzahl der Spalten in der Tabelle gesetzt.
Die Arbeitslösung:
WORKING-STORAGE SECTION.
01 argv.
03 firstColumn pointer.
03 secondColumn pointer.
03 thirdColumn pointer.
01 azColName pointer.
01 argc pic 99 comp-5.
01 notused pointer.
01 Writefunction-Ptr procedure-pointer.
*-----------------------------------------------------------------
Linkage Section.
01 Cars_Id pic 9(2).
01 Cars_Name pic X(20).
01 Cars_Price pic 9(10).
/-----------------------------------------------------------------
procedure division.
//code
set Writefunction-Ptr to entry "sqlite-callback".
initialize sqlQuery
move z"SELECT * FROM Cars;" to sqlQuery
call "sqlite3_exec" using
by value sqlite3-db
by reference sqlQuery
by value Writefunction-Ptr
by value 0
by reference err_msg
returning rc
end-call
//code
stop run.
entry "sqlite-callback" using
by value notused
by value argc
by reference argv
by reference azColName.
set address of Cars_Id to firstColumn
set address of Cars_Name to secondColumn
set address of Cars_Price to thirdColumn
display Cars_Id "|" Cars_Name "|" Cars_Price
goback.
Entry-Termination.
Welche COBOL verwenden Sie? Kompiliert das ohne LINKAGE SECTION? Sehen Sie sich SET ADDRESS von x TO your-pointer an, wobei x in der LINKAGE SECTION definiert ist und die gewünschte Größe und den Typ hat. Dadurch können Sie auf die Daten zugreifen, auf die der Zeiger zeigt. –
Marcus verwendet einen MicroFocus ServerExpress Compiler. – Anders