Neu vorgestellt, Programmierung

Erweiterung von OdbcParamAdd

Die CONZEPT 16 ODBC-Befehle ermöglichen den Zugriff auf Datenbanken, die über einen ODBC-Treiber angesteuert werden können. Der Befehl OdbcParamAdd() bietet hierbei die Möglichkeit SQL-Statements zu parametrisieren. Im kommenden Release wird der Befehl um ein zusätzliches optionales Argument erweitert. Dieser Artikel erklärt warum.

Das binden von Parametern zur Laufzeit einer Anwendung stellt eine einfache Möglichkeit zur Modifikation einer SQL-Abfrage dar. Das folgende Beispiel verdeutlicht dies.

tStm->OdbcPrepare('SELECT * FROM Customer WHERE Customer_Name = ?');
tStm->OdbcParamAdd(_TypeAlpha,30);
tStm->OdbcParamSet(1,'Müller');
tStm->OdbcExecute();

Im obigen Fall werden alle Datensätze der Tabelle Customer selektiert, deren Datenbankfeld Customer_Name den Inhalt ‚Müller‘ besitzt. Die Anweisung OdbcPrepare() bereitet das übergebene SQL-Statement für die spätere Ausführung durch OdbcExecute() vor.
Das SQL-Statement darf hierbei Platzhalter enthalten. Diese werden durch ‚?‘ spezifiziert. Im Beispiel oben wird lediglich ein Platzhalter (in der WHERE-Klausel) verwendet.
Der Inhalt des Platzhalters wird durch den Befehl OdbcParamSet() definiert. Datentyp und Feldlänge des zugeordneten Wertes ergeben sich über die bei OdbcParamAdd() angegebenen Argumente.
Im Beispiel wird definiert, dass es sich bei dem zu setzenden Inhalt um alphanumerische Informationen handelt (_TypeAlpha). Der Wert 30 definiert die Länge des Inhalts.
Da das zugrunde liegende Datenbank-System nichts mit den CONZEPT 16-Datentypen anfangen kann, müssen diese in ihre SQL-Entsprechung umgewandelt werden. _TypeAlpha wird deshalb von OdbcParamAdd() in den SQL-Datentyp SQL_CHAR umgewandelt. Dies entspricht einem alphanumerischen Datentyp mit fester Länge. Einige Datenbank-Systeme füllen deshalb Inhalte, deren tatsächliche Länge kleiner als die angegebene Länge ist, bis zur definierten Länge (im Beispiel 30) mit Leerzeichen auf.
Deshalb bietet der Befehl OdbcParamAdd() nun auch die Möglichkeit ein drittes Argument anzugeben.

...
tStm->OdbcParamAdd(_TypeAlpha,30,true);
...

Wird im neuen Argument true übergeben, dann findet eine Umwandlung von _TypeAlpha in den SQL-Datentyp SQL_VARCHAR statt. Dieser bezeichnet alphanumerische Daten mit variabler Länge. Sofern das entsprechende Datenbank-Feld des zugrunde liegenden Datenbank-Systems ebenfalls mit diesem Datentyp definiert ist, findet keine Auffüllung mit Leerzeichen statt.
Die Erweiterung wird in der CONZEPT 16-Release 5.7.01 sowie in der Release 5.6.08 enthalten sein.

5 Kommentare

5 Kommentare “Erweiterung von OdbcParamAdd”

  1. Das SQL-Statement wird über OdbcExecuteDirect() direkt an den ODBC-Treiber übergeben. Es hängt also von diesem bzw. der zugrundeliegenden SQL-Engine ab, wie die Inhalte konvertiert werden. Auch hier kann es theoretisch zu Unterschieden zw. verschiedenen ODBC-Treibern und SQL_CHAR bzw. SQL_VARCHAR kommen.

  2. Das ist eine gute Sache. Mit solchen parametrisierten Statements kann man z.B. SQL-Injection Attacken vorbeugen, vorausgesetzt dies wurde bei der Umsetzung der hier beschriebenen Funktionalität ebenfalls berücksichtigt.

Kommentar abgeben