Zeichendaten und C-Zeichenfolgen
Eingabeparameter, die auf Zeichendaten mit variabler Länge verweisen (z. B. Spaltennamen, dynamische Parameter und Zeichenfolgen-Attributwerte), weisen einen zugeordneten Längenparameter auf. Wenn die Anwendung Zeichenfolgen mit dem null-Zeichen beendet, wie in C üblich, stellt sie als Argument entweder die Länge in Bytes der Zeichenfolge (nicht einschließlich null-Terminator) oder SQL_NTS (Null-Terminated String) bereit. Ein nicht negatives Längenargument gibt die tatsächliche Länge der zugeordneten Zeichenfolge an. Das Längenargument kann 0 sein, um eine leere Zeichenfolge anzugeben, die sich von einem NULL-Wert unterscheidet. Der negative Wert SQL_NTS leitet den Treiber an, um die Länge der Zeichenfolge zu bestimmen, indem das Nullendpunktzeichen ermittelt wird.
Wenn Zeichendaten vom Treiber an die Anwendung zurückgegeben werden, muss der Treiber immer null beenden. Dadurch erhält die Anwendung die Wahl, ob die Daten als Zeichenfolge oder als Zeichenarray behandelt werden sollen. Wenn der Anwendungspuffer nicht groß genug ist, um alle Zeichendaten zurückzugeben, schneidet der Treiber sie auf die Bytelänge des Puffers ab, weniger die Anzahl der Bytes, die vom Zeichen nullendpunkt erforderlich sind, null beendet die abgeschnittenen Daten und speichert sie im Puffer. Daher müssen Anwendungen immer zusätzlichen Speicherplatz für das Nullendpunktzeichen in Puffern zuweisen, die zum Abrufen von Zeichendaten verwendet werden. Beispielsweise ist ein 51-Byte-Puffer zum Abrufen von 50 Zeichen Daten erforderlich.
Besondere Sorgfalt muss sowohl von der Anwendung als auch vom Treiber beim Senden oder Abrufen von langen Zeichendaten in Teilen mit SQLPutData oder SQLGetData durchgeführt werden. Wenn die Daten als Eine Reihe von null-beendeten Zeichenfolgen übergeben werden, müssen die Nullendpunktzeichen für diese Zeichenfolgen entfernt werden, bevor die Daten neu zusammengefasst werden können.
Eine Reihe von ODBC-Programmierern haben verwechselte Zeichendaten und C-Zeichenfolgen. Dies ist ein Artefakt der Verwendung der C-Sprache beim Definieren von ODBC-Funktionen. Wenn ein ODBC-Treiber oder eine Anwendung eine andere Sprache verwendet – denken Sie daran, dass ODBC sprachunabhängig ist – ist diese Verwirrung weniger wahrscheinlich.
Wenn C-Zeichenfolgen zum Speichern von Zeichendaten verwendet werden, wird das Nullendpunktzeichen nicht als Teil der Daten betrachtet und wird nicht als Teil der Bytelänge gezählt. Beispielsweise können die Zeichendaten "ABC" als C-Zeichenfolge "ABC\0" oder das Zeichenarray {'A', 'B', 'C'} gespeichert werden. Die Bytelänge der Daten ist 3, unabhängig davon, ob sie als Zeichenfolge oder als Zeichenarray behandelt wird.
Obwohl Anwendungen und Treiber häufig C-Zeichenfolgen (null-beendete Arrays von Zeichen) zum Speichern von Zeichendaten verwenden, ist dies nicht erforderlich. In C können Zeichendaten auch als Array von Zeichen (ohne NULL-Beendigung) behandelt werden und ihre Bytelänge separat im Längen-/Indikatorpuffer übergeben werden.
Da Zeichendaten in einem Nicht-Null-beendeten Array und dessen getrennt übergebener Bytelänge gespeichert werden können, ist es möglich, Nullzeichen in Zeichendaten einzubetten. Das Verhalten von ODBC-Funktionen in diesem Fall ist jedoch nicht definiert, und es ist treiberspezifisch, ob ein Treiber dies richtig behandelt. Daher sollten interoperable Anwendungen immer Zeichendaten verarbeiten, die eingebettete NULL-Zeichen als Binärdaten enthalten können.