Freigeben über


Long-Daten, SQLSetPos und SQLBulkOperations

Wie bei Parametern in SQL-Anweisungen können lange Daten beim Aktualisieren von Zeilen mit SQLBulkOperations oder SQLSetPos oder beim Einfügen von Zeilen mit SQLBulkOperations gesendet werden. Die Daten werden in Teilen mit mehreren Aufrufen von SQLPutData gesendet. Spalten, für die Daten zur Ausführungszeit gesendet werden, werden als Daten-bei-Ausführungszeit-Spalten bezeichnet.

Hinweis

Eine Anwendung kann tatsächlich jede Art von Daten zur Ausführungszeit mit SQLPutData senden, obwohl nur Zeichen- und Binärdaten in Teilen gesendet werden können. Wenn die Daten jedoch klein genug sind, um in einen einzelnen Puffer zu passen, gibt es in der Regel keinen Grund, SQLPutData zu verwenden. Es ist viel einfacher, den Puffer zu binden und dem Treiber das Abrufen der Daten aus dem Puffer zu ermöglichen.

Da lange Datenspalten in der Regel nicht gebunden sind, muss die Anwendung die Spalte binden, bevor SQLBulkOperations oder SQLSetPos aufgerufen werden und sie nach dem Aufruf von SQLBulkOperations oder SQLSetPos wieder trennen. Die Spalte muss gebunden werden, da SQLBulkOperations oder SQLSetPos nur auf gebundenen Spalten ausgeführt werden und ungebunden sein müssen, damit SQLGetData zum Abrufen von Daten aus der Spalte verwendet werden kann.

Zum Senden von Daten zur Ausführungszeit führt die Anwendung folgende Aktionen aus:

  1. Platziert einen 32-Bit-Wert im Rowsetpuffer anstelle eines Datenwerts. Dieser Wert wird später an die Anwendung zurückgegeben, daher sollte sie von der Anwendung auf einen aussagekräftigen Wert festgelegt werden, z. B. die Anzahl der Spalte oder das Handle einer Datei, die Daten enthält.

  2. Legt den Wert im Längen-/Indikatorpuffer auf das Ergebnis des Makros SQL_LEN_DATA_AT_EXEC(länge) fest. Dieser Wert zeigt dem Treiber an, dass die Daten für den Parameter mit SQLPutData gesendet werden. Der Längenwert wird verwendet, wenn lange Daten an eine Datenquelle gesendet werden, die wissen muss, wie viele Byte lange Daten gesendet werden, damit der Speicherplatz vorab zugewiesen werden kann. Um festzustellen, ob für eine Datenquelle dieser Wert erforderlich ist, ruft die Anwendung SQLGetInfo mit der Option SQL_NEED_LONG_DATA_LEN auf. Alle Treiber müssen dieses Makro unterstützen; wenn für die Datenquelle keine Bytelänge erforderlich ist, kann der Treiber sie ignorieren.

  3. Ruft SQLBulkOperations oder SQLSetPos auf. Der Treiber ermittelt, dass ein Längen-/Indikatorpuffer das Ergebnis des Makros SQL_LEN_DATA_AT_EXEC(Länge) enthält und SQL_NEED_DATA als Rückgabewert der Funktion zurückgibt.

  4. Ruft SQLParamData als Reaktion auf den SQL_NEED_DATA Rückgabewert auf. Wenn lange Daten gesendet werden müssen, gibt SQLParamData SQL_NEED_DATA zurück. Im Puffer, auf den das ValuePtrPtr-Argument verweist, gibt der Treiber den eindeutigen Wert zurück, den die Anwendung im Rowsetpuffer platziert hat. Wenn mehr als eine Daten-bei-Ausführung-Spalte vorhanden ist, verwendet die Anwendung diesen Wert, um zu bestimmen, für welche Spalte Daten gesendet werden sollen; der Treiber ist nicht verpflichtet, Daten für Daten-bei-Ausführung-Spalten in einer bestimmten Reihenfolge anzufordern.

  5. Ruft SQLPutData auf, um die Spaltendaten an den Treiber zu senden. Wenn die Spaltendaten nicht in einen einzelnen Puffer passen, wie es häufig bei langen Daten der Fall ist, ruft die Anwendung SQLPutData wiederholt auf, um die Daten in Teilen zu senden; es liegt an der Treiber- und Datenquelle, die Daten neu zusammenzuspeichern. Wenn die Anwendung null-terminierte Zeichenfolgendaten übergibt, muss der Treiber oder die Datenquelle das Nullterminierungszeichen im Rahmen des Zusammenfügens entfernen.

  6. Ruft SQLParamData erneut auf, um anzugeben, dass alle Daten für die Spalte gesendet wurden. Wenn Data-at-Execution-Spalten vorhanden sind, für die keine Daten gesendet wurden, gibt der Treiber SQL_NEED_DATA und den eindeutigen Wert für die nächste Data-at-Execution-Spalte zurück; die Anwendung kehrt zu Schritt 5 zurück. Wenn Daten für alle Daten-bei-Ausführungsspalten gesendet wurden, werden die Daten für die Zeile an die Datenquelle übermittelt. SQLParamData gibt dann SQL_SUCCESS oder SQL_SUCCESS_WITH_INFO zurück und kann jede SQLSTATE zurückgeben, die SQLBulkOperations oder SQLSetPos zurückgeben kann.

Nachdem SQLBulkOperations oder SQLSetPos SQL_NEED_DATA zurückgibt und bevor die Daten für die letzte Ausführungsdatenspalte vollständig gesendet wurden, befindet sich die Anweisung in einem Need Data-Zustand. In diesem Zustand kann die Anwendung nur SQLPutData, SQLParamData, SQLCancel, SQLGetDiagField oder SQLGetDiagRec aufrufen; Alle anderen Funktionen geben SQLSTATE HY010 zurück (Funktionssequenzfehler). Durch Aufrufen von SQLCancel wird die Ausführung der Anweisung abgebrochen und an den vorherigen Zustand zurückgegeben. Weitere Informationen finden Sie in Anhang B: ODBC-Zustandsübergangstabellen.