Puffer

Ein Puffer ist ein beliebiger Anwendungsspeicher, der zum Übergeben von Daten zwischen der Anwendung und dem Treiber verwendet wird. Anwendungspuffer können beispielsweise Mit SQLBindCol-Resultsetspalten zugeordnet oder an diese gebunden werden. Sobald jede Zeile abgerufen wird, werden die Daten für jede Spalte in diesen Puffern zurückgegeben. Eingabepuffer werden verwendet, um Daten aus der Anwendung an den Treiber zu übergeben; Ausgabepuffer werden verwendet, um Daten vom Treiber an die Anwendung zurückzugeben.

Hinweis

Wenn eine ODBC-Funktion SQL_ERROR zurückgibt, sind die Inhalte aller Ausgabeargumente für diese Funktion nicht definiert.

Diese Diskussion betrifft sich in erster Linie mit Puffern unbestimmter Art. Die Adressen dieser Puffer werden als Argumente vom Typ SQLPOINTER angezeigt, z. B. das TargetValuePtr-Argument in SQLBindCol. Einige der hier erläuterten Elemente, z. B. die argumente, die mit Puffern verwendet werden, gelten jedoch auch für Argumente, die zum Übergeben von Zeichenfolgen an den Treiber verwendet werden, z. B. das TableName-Argument in SQLTables.

Diese Puffer kommen in der Regel in Paaren. Datenpuffer werden verwendet, um die Daten selbst zu übergeben, während Längen-/Indikatorpuffer verwendet werden, um die Länge der Daten im Datenpuffer oder einen speziellen Wert wie SQL_NULL_DATA zu übergeben, der angibt, dass die Daten NULL sind. Die Länge der Daten in einem Datenpuffer unterscheidet sich von der Länge des Datenpuffers selbst. Die folgende Abbildung zeigt die Beziehung zwischen dem Datenpuffer und dem Längen-/Indikatorpuffer.

Data buffer and length/indicator buffer

Ein Längen-/Indikatorpuffer ist erforderlich, wenn der Datenpuffer Daten mit variabler Länge enthält, z. B. Zeichen- oder Binärdaten. Wenn der Datenpuffer Daten mit fester Länge enthält, z. B. eine ganze Zahl oder eine Datumsstruktur, wird nur ein Längen-/Indikatorpuffer benötigt, um Indikatorwerte zu übergeben, da die Länge der Daten bereits bekannt ist. Wenn eine Anwendung einen Längen-/Indikatorpuffer mit Daten mit fester Länge verwendet, ignoriert der Treiber alle darin übergebenen Längen.

Die Länge des Datenpuffers und der darin enthaltenen Daten wird in Bytes gemessen, im Gegensatz zu Zeichen. Diese Unterscheidung ist für Programme, die ANSI-Zeichenfolgen verwenden, unwichtig, da Längen in Bytes und Zeichen identisch sind.

Wenn der Datenpuffer ein treiberdefiniertes Deskriptorfeld, Diagnosefeld oder Attribut darstellt, sollte die Anwendung dem Treiber-Manager die Art des Funktionsarguments angeben, das den Wert für das Feld oder Attribut angibt. Die Anwendung führt dies durch Festlegen des Längenarguments in jedem Funktionsaufruf aus, der das Feld oder Attribut auf einen der folgenden Werte festlegt. (Das gleiche gilt für Funktionen, die die Werte des Felds oder Attributs abrufen, mit der Ausnahme, dass das Argument auf die Werte verweist, die für die Einstellungsfunktion im Argument selbst enthalten sind.)

  • Wenn das Funktionsargument, das den Wert für das Feld oder Attribut angibt, ein Zeiger auf eine Zeichenfolge ist, ist das Längenargument die Länge der Zeichenfolge oder SQL_NTS.

  • Wenn das Funktionsargument, das den Wert für das Feld oder Attribut angibt, ein Zeiger auf einen Binärpuffer ist, platziert die Anwendung das Ergebnis des Makros SQL_LEN_BINARY_ATTR(länge) in das Längenargument . Dadurch wird ein negativer Wert im Längenargument platziert.

  • Wenn das Funktionsargument, das den Wert für das Feld oder Attribut angibt, ein Zeiger auf einen anderen Wert als eine Zeichenfolge oder eine binäre Zeichenfolge ist, sollte das Längenargument den Wert SQL_IS_POINTER haben.

  • Wenn das Funktionsargument, das den Wert für das Feld oder Attribut angibt, einen Wert mit fester Länge enthält, wird das Längenargument entsprechend SQL_IS_INTEGER, SQL_IS_UINTEGER, SQL_IS_SMALLINT oder SQL_ISI_USMALLINT.

In diesem Abschnitt werden die folgenden Themen behandelt: