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.
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) &
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
UNTIL r.eof OR (ret # Success);
END ;
NextField(field)
END
END ;
FirstField(s.params, field);
...
END Execute;
nnnnnnnnnn¯
PROCEDURE Execute* (s: Statement);
~
(field IS FileField) DO NextField(field) END ;
<
Success THEN s.ret := ret; RETURN END