Freigeben über


Erstellen von searched-Anweisungen

Wichtig

Dieses Feature wird in einer zukünftigen Version von Windows entfernt. Vermeiden Sie die Verwendung dieses Features in neuen Entwicklungsvorgängen, und planen Sie, Anwendungen zu ändern, die dieses Feature derzeit verwenden. Microsoft empfiehlt die Verwendung der Cursorfunktion des Treibers.

Um positionierte Update- und Delete-Anweisungen zu unterstützen, erstellt die Cursorbibliothek eine durchsuchte UPDATE- oder DELETE-Anweisung aus der positionierten Anweisung. Um Aufrufe von SQLGetData in einem Datenblock zu unterstützen, erstellt die Cursorbibliothek eine durchsuchte SELECT-Anweisung , um ein Resultset mit der aktuellen Datenzeile zu erstellen. In jeder dieser Anweisungen listet die WHERE-Klausel die im Cache gespeicherten Werte für jede gebundene Spalte auf, die SQL_PRED_SEARCHABLE oder SQL_PRED_BASIC für den SQL_DESC_SEARCHABLE Feldbezeichner in SQLColAttribute zurückgibt.

Achtung

Die WHERE-Klausel , die von der Cursorbibliothek zum Identifizieren der aktuellen Zeile erstellt wurde, kann keine Zeilen identifizieren, eine andere Zeile identifizieren oder mehr als eine Zeile identifizieren.

Wenn sich eine positionierte Update- oder Delete-Anweisung auf mehrere Zeilen auswirkt, aktualisiert die Cursorbibliothek das Zeilenstatusarray nur für die Zeile, in der sich der Cursor befindet, und gibt SQL_SUCCESS_WITH_INFO und SQLSTATE 01001 (Cursorvorgangskonflikt) zurück. Wenn die Anweisung keine Zeilen identifiziert, aktualisiert die Cursorbibliothek das Zeilenstatusarray nicht und gibt SQL_SUCCESS_WITH_INFO und SQLSTATE 01001 (Cursorvorgangskonflikt) zurück. Eine Anwendung kann SQLRowCount aufrufen, um die Anzahl der Zeilen zu bestimmen, die aktualisiert oder gelöscht wurden.

Wenn die SELECT-Klausel , die zum Positionieren des Cursors für einen Aufruf von SQLGetData verwendet wird, mehrere Zeilen identifiziert, wird von SQLGetData nicht garantiert, dass die richtigen Daten zurückgegeben werden. Wenn keine Zeilen identifiziert werden, gibt SQLGetData SQL_NO_DATA zurück.

Wenn eine Anwendung den folgenden Richtlinien entspricht, sollte die von der Cursorbibliothek erstellte WHERE-Klausel die aktuelle Zeile eindeutig identifizieren, es sei denn, dies ist nicht möglich, z. B. wenn die Datenquelle doppelte Zeilen enthält.

  • Binden Sie Spalten, die die Zeile eindeutig identifizieren. Wenn die gebundenen Spalten die Zeile nicht eindeutig identifizieren, kann die von der Cursorbibliothek erstellte WHERE-Klausel mehr als eine Zeile identifizieren. In einer positionierten Update- oder Delete-Anweisung kann eine solche Klausel dazu führen, dass mehr als eine Zeile aktualisiert oder gelöscht wird. Bei einem Aufruf von SQLGetData kann eine solche Klausel dazu führen, dass der Treiber Daten für die falsche Zeile zurückgibt. Durch das Binden aller Spalten in einem eindeutigen Schlüssel wird sichergestellt, dass jede Zeile eindeutig identifiziert wird.

  • Ordnen Sie Datenpuffer so groß zu, dass keine Abschneidungen auftreten. Der Cache der Cursorbibliothek ist eine Kopie der Werte in den Rowsetpuffern, die mit SQLBindCol an das Resultset gebunden sind. Wenn Daten abgeschnitten werden, wenn sie in diesen Puffern platziert werden, werden sie auch im Cache abgeschnitten. Eine WHERE-Klausel , die aus abgeschnittenen Werten erstellt wurde, identifiziert möglicherweise nicht ordnungsgemäß die zugrunde liegende Zeile in der Datenquelle.

  • Geben Sie Puffer mit nicht nuller Länge für binäre C-Daten an. Die Cursorbibliothek weist Längenpuffer in ihrem Cache nur zu, wenn das argument StrLen_or_IndPtr in SQLBindCol ungleich NULL ist. Wenn das TargetType-Argument SQL_C_BINARY ist, benötigt die Cursorbibliothek die Länge der Binärdaten, um eine WHERE-Klausel aus den Daten zu erstellen. Wenn kein Längenpuffer für eine SQL_C_BINARY Spalte vorhanden ist und die Anwendung SQLGetData aufruft oder versucht, eine positionierte Update- oder Delete-Anweisung auszuführen, gibt die Cursorbibliothek SQL_ERROR und SQLSTATE SL014 zurück (Eine positionierte Anforderung wurde ausgegeben, und nicht alle Spaltenanzahlfelder wurden gepuffert).

  • Geben Sie Puffer der Länge ungleich NULL für Nullable-Spalten an. Die Cursorbibliothek weist Längenpuffer in ihrem Cache nur zu, wenn das argument StrLen_or_IndPtr in SQLBindCol ungleich NULL ist. Da SQL_NULL_DATA im Längenpuffer gespeichert ist, geht die Cursorbibliothek davon aus, dass jede Spalte, für die kein Längenpuffer angegeben ist, nicht nullable ist. Wenn keine Längenspalte für eine Nullable-Spalte angegeben wird, erstellt die Cursorbibliothek eine WHERE-Klausel , die den Datenwert für die Spalte verwendet. Diese Klausel identifiziert die Zeile nicht ordnungsgemäß.