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ührungsspalten 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 und nach dem Aufrufen von SQLBulkOperations oder SQLSetPos getrennt wird. 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 gibt 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 Datenspalte vorhanden ist, verwendet die Anwendung diesen Wert, um zu bestimmen, für welche Spalte Daten gesendet werden sollen; Der Treiber ist nicht erforderlich, um Daten für Daten bei ausführungsspalten 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 dem Treiber und der Datenquelle, die Daten neu zusammenzufügen. Wenn die Anwendung null-beendete Zeichenfolgendaten übergibt, muss der Treiber oder die Datenquelle das Nullendpunktzeichen im Rahmen des Erneutassembly-Prozesses entfernen.

  6. Ruft SQLParamData erneut auf, um anzugeben, dass alle Daten für die Spalte gesendet wurden. Wenn datenbasierte Datenspalten vorhanden sind, für die keine Daten gesendet wurden, gibt der Treiber SQL_NEED_DATA und den eindeutigen Wert für die nächste Daten-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 gesendet. 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ückgegeben und die Daten für die letzte Datenausführungsspalte 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 (Funktionssequenzfehler) zurück. 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.