next up previous contents
Next: WHERE-Klauseln mit Nullwerten Up: Implementierungsaspekte Previous: Abbildung von Datentypen

Ausführung von Anweisungen

Beim Ausführen von SQL-Anweisungen mit Parametern müssen einige Fälle berücksichtigt werden: für Parameter, die Nullwerte enthalten, muß die Komponente len auf NullData gesetzt werden, für Zeichenkettenparameter auf NTS (null-terminated string), für dateibasierte Parameter schließlich auf ODBC.DataAtExec, da in diesem Fall die Daten blockweise beim Aufruf von Execute übertragen werden. Dieses blockweise Übertragen geschieht nach dem Aufruf von ODBC.SQLExecute für alle dateibasierten Parameterfelder, solange ODBC.SQLParamData NeedData liefert.

 nnnnnnnnnn¯ 
PROCEDURE  Execute* (s: Statement);

VAR r: Files.Rider; ret: ODBC.Retcode; field: Field; dummy: LONGINT;

BEGIN

...

FirstField(s.params, field);

WHILE field # NIL DO

IF field.isNull THEN field.len := NullData

ELSIF field IS StringField THEN field.len := NTS

ELSIF field IS FileField THEN field.len := ODBC.DataAtExec

ELSE field.len := 0

END ;

NextField(field)

END ;

s.ret := ODBC.SQLExecute(s.stmt);

WHILE s.ret = NeedData DO (* for all unbound FileFields *)

FirstField(s.params, field);

s.ret := ODBC.SQLParamData(s.stmt, dummy);

IF s.ret = NeedData THEN

WHILE (field # NIL) & ~(field IS FileField) DO NextField(field) END ;

IF field = NIL THEN HALT(45)

ELSE (* f is next FileField *)

Files.Set(r, field(FileField).f, 0);

REPEAT

Files.ReadBytes(r, buffer, BlockSize);

ret := ODBC.SQLPutData(s.stmt, S.ADR(buffer), BlockSize - r.res);

IF ret < Success THEN s.ret := ret; RETURN END

UNTIL r.eof OR (ret # Success);

END ;

NextField(field)

END

END ;

FirstField(s.params, field);

...

END Execute;



Christoph Steindl
Thu Jul 24 14:37:19 MET DST 1997