Verwenden von Längen- und Indikatorwerten

Der Längen-/Indikatorpuffer wird verwendet, um die Bytelänge der Daten im Datenpuffer oder einen speziellen Indikator wie SQL_NULL_DATA zu übergeben, der angibt, dass die Daten NULL sind. Abhängig von der Funktion, in der sie verwendet wird, wird ein Längen-/Indikatorpuffer als SQLINTEGER oder ALS SQLSMALLINT definiert. Daher ist ein einzelnes Argument erforderlich, um es zu beschreiben. Wenn der Datenpuffer ein nicht verzögerter Eingabepuffer ist, enthält dieses Argument die Bytelänge der Daten selbst oder einen Indikatorwert. Es wird häufig StrLen_or_Ind oder ein ähnlicher Name genannt. Der folgende Code ruft z. B. SQLPutData auf, um einen Puffer voller Daten zu übergeben. Die Bytelänge (ValueLen) wird direkt übergeben, da der Datenpuffer (ValuePtr) ein Eingabepuffer ist.

SQLCHAR      ValuePtr[50];  
SQLINTEGER   ValueLen;  
  
// Call local function to place data in ValuePtr. In ValueLen, return the  
// number of bytes of data placed in ValuePtr. If there is not enough  
// data, this will be less than 50.  
FillBuffer(ValuePtr, sizeof(ValuePtr), &ValueLen);  
  
// Call SQLPutData to send the data to the driver.  
SQLPutData(hstmt, ValuePtr, ValueLen);  

Wenn der Datenpuffer ein verzögerter Eingabepuffer, ein nicht verzögerter Ausgabepuffer oder ein Ausgabepuffer ist, enthält das Argument die Adresse des Längen-/Indikatorpuffers. Es wird häufig StrLen_or_IndPtr oder ein ähnlicher Name genannt. Der folgende Code ruft z. B. SQLGetData auf, um einen Puffer voller Daten abzurufen. Die Bytelänge wird an die Anwendung im Längen-/Indikatorpuffer (ValueLenOrInd) zurückgegeben, dessen Adresse an SQLGetData übergeben wird, da der entsprechende Datenpuffer (ValuePtr) ein nicht verzögerter Ausgabepuffer ist.

SQLCHAR      ValuePtr[50];  
SQLINTEGER   ValueLenOrInd;  
SQLGetData(hstmt, 1, SQL_C_CHAR, ValuePtr, sizeof(ValuePtr), &ValueLenOrInd);  

Es sei denn, es ist ausdrücklich verboten, kann ein Argument für den Längen-/Indikatorpuffer 0 (wenn keine verzögerte Eingabe) oder ein NULL-Zeiger (wenn Ausgabe oder verzögerte Eingabe) sein. Bei Eingabepuffern ignoriert der Treiber die Bytelänge der Daten. Dies gibt einen Fehler zurück, wenn Daten mit variabler Länge übergeben werden, aber beim Übergeben von Daten mit nicht nuller Länge, fester Länge, da weder eine Länge noch ein Indikatorwert erforderlich sind. Bei Ausgabepuffern gibt der Treiber nicht die Bytelänge der Daten oder einen Indikatorwert zurück. Dies ist ein Fehler, wenn die vom Treiber zurückgegebenen Daten NULL sind, aber beim Abrufen von daten mit fester Länge, nicht nullablen Daten, häufig verwendet werden, da weder eine Länge noch ein Indikatorwert erforderlich sind.

Wenn die Adresse eines verzögerten Datenpuffers an den Treiber übergeben wird, muss die Adresse eines Verzögerten Längen-/Indikatorpuffers erneut Standard gültig sein, bis der Puffer ungebunden ist.

Die folgenden Längen sind als Längen-/Indikatorwerte gültig:

  • n, wobei n> 0.

  • SQL_NTS. Eine Zeichenfolge, die an den Treiber im entsprechenden Datenpuffer gesendet wird, wird null beendet; Dies ist eine bequeme Möglichkeit für C-Programmierer, Zeichenfolgen zu übergeben, ohne ihre Bytelänge berechnen zu müssen. Dieser Wert ist nur zulässig, wenn die Anwendung Daten an den Treiber sendet. Wenn der Treiber Daten an die Anwendung zurückgibt, gibt er immer die tatsächliche Bytelänge der Daten zurück.

Die folgenden Werte sind als Längen-/Indikatorwerte gültig. SQL_NULL_DATA wird im Feld SQL_DESC_INDICATOR_PTR Beschreibung gespeichert; alle anderen Werte werden im Feld SQL_DESC_OCTET_LENGTH_PTR Deskriptor gespeichert.

  • SQL_NULL_DATA. Die Daten sind ein NULL-Datenwert, und der Wert im entsprechenden Datenpuffer wird ignoriert. Dieser Wert ist nur für SQL-Daten zulässig, die an den Treiber gesendet oder abgerufen werden.

  • SQL_DATA_AT_EXEC. Der Datenpuffer enthält keine Daten. Stattdessen werden die Daten mit SQLPutData gesendet, wenn die Anweisung ausgeführt wird oder wenn SQLBulkOperations oder SQLSetPos aufgerufen wird. Dieser Wert ist nur für SQL-Daten zulässig, die an den Treiber gesendet werden. Weitere Informationen finden Sie unter SQLBindParameter, SQLBulkOperations und SQLSetPos.

  • Ergebnis des SQL_LEN_DATA_AT_EXEC(length)-Makros. Dieser Wert ähnelt SQL_DATA_AT_EXEC. Weitere Informationen finden Sie unter Senden langer Daten.

  • SQL_NO_TOTAL. Der Treiber kann die Anzahl der Bytes von langen Daten nicht ermitteln, die in einem Ausgabepuffer zurückgegeben werden können. Dieser Wert ist nur für SQL-Daten zulässig, die vom Treiber abgerufen werden.

  • SQL_DEFAULT_PARAM. Eine Prozedur besteht darin, den Standardwert eines Eingabeparameters in einer Prozedur anstelle des Werts im entsprechenden Datenpuffer zu verwenden.

  • SQL_COLUMN_IGNORE. SQLBulkOperations oder SQLSetPos besteht darin, den Wert im Datenpuffer zu ignorieren. Beim Aktualisieren einer Datenzeile durch einen Aufruf von SQLBulkOperations oder SQLSetPos wird der Spaltenwert nicht geändert. Beim Einfügen einer neuen Datenzeile durch einen Aufruf von SQLBulkOperations wird der Spaltenwert auf die Standardeinstellung festgelegt, oder wenn die Spalte keinen Standardwert hat, auf NULL.