Angeben eines Cursortyps und Auswählen von Zeilen

Ab Version 1.1 des SQL Server-Treiber für PHP können Sie ein Resultset mit Zeilen erstellen, auf die Sie je nach Cursortyp in beliebiger Reihenfolge zugreifen können.

Cursortypen

Wenn Sie ein Resultset mit sqlsrv_query oder mit sqlsrv_prepare erstellen, können Sie den Typ des Cursors angeben. In der Standardeinstellung wird ein Vorwärtscursor verwendet. Mit einem Vorwärtscursor können Sie die Zeilen des Resultsets beginnend mit der ersten Zeile bis zum Ende des Resultsets einzeln durchgehen. Dies war der einzig verfügbare Cursortyp in Version 1.0 des SQL Server-Treiber für PHP.

Ab Version 1.1 des SQL Server-Treiber für PHP können Sie ein Resultset mit einem scrollfähigen Cursor erstellen, sodass Sie auf jede Zeile in einem Resultset in beliebiger Reihenfolge zugreifen können. In der folgenden Tabelle sind die Werte aufgeführt, die an die Scrollable-Option in sqlsrv_query oder sqlsrv_prepare übergeben werden können.

Option Beschreibung

SQLSRV_CURSOR_FORWARD

Mit diesem Cursortyp können Sie die Zeilen des Resultsets beginnend mit der ersten Zeile bis zum Ende des Resultsets einzeln durchgehen.

Dies ist der Standardcursortyp.

sqlsrv_num_rows gibt einen Fehler für Resultsets zurück, die mit diesem Cursortyp erstellt wurden.

forward ist die abgekürzte Form von SQLSRV_CURSOR_FORWARD.

SQLSRV_CURSOR_STATIC

Mit diesem Cursor können Sie in beliebiger Reihenfolge auf Zeilen zugreifen. Änderungen in der Datenbank werden jedoch nicht wiedergegeben.

static ist die abgekürzte Form von SQLSRV_CURSOR_STATIC.

SQLSRV_CURSOR_DYNAMIC

Mit diesem Cursor können Sie in beliebiger Reihenfolge auf Zeilen zugreifen, und Änderungen in der Datenbank werden wiedergegeben.

sqlsrv_num_rows gibt einen Fehler für Resultsets zurück, die mit diesem Cursortyp erstellt wurden.

dynamic ist die abgekürzte Form von SQLSRV_CURSOR_DYNAMIC.

SQLSRV_CURSOR_KEYSET

Mit diesem Cursor können Sie in beliebiger Reihenfolge auf Zeilen zugreifen. Bei einem Keysetcursor wird jedoch nicht die Zeilenanzahl aktualisiert, wenn eine Zeile aus der Tabelle gelöscht wird. (Eine gelöschte Zeile wird ohne Werte zurückgegeben.)

keyset ist die abgekürzte Form von SQLSRV_CURSOR_KEYSET.

Wenn bei einer Abfrage mehrere Resultsets generiert werden, gilt die Scrollable-Option für alle Resultsets.

Auswählen von Zeilen in einem Resultset

Nachdem Sie ein statisches, dynamisches oder Keyset-Resultset erstellt haben, können Sie mit sqlsrv_fetch, sqlsrv_fetch_array oder sqlsrv_fetch_object eine Zeile angeben.

In der folgenden Tabelle werden die Werte erläutert, die Sie im row-Parameter angeben können.

Parameter Beschreibung

SQLSRV_SCROLL_NEXT

Die nächste Zeile. Dies ist der Standardwert, wenn Sie nicht den row-Parameter für ein scrollfähiges Resultset angeben.

SQLSRV_SCROLL_PRIOR

Die Zeile vor der aktuellen Zeile.

SQLSRV_SCROLL_FIRST

Die erste Zeile im Resultset.

SQLSRV_SCROLL_LAST

Die letzte Zeile im Resultset.

SQLSRV_SCROLL_ABSOLUTE

Die mit dem offset-Parameter angegebene Zeile.

SQLSRV_SCROLL_RELATIVE

Die Zeile, die mit dem offset-Parameter aus der aktuellen Zeile angegeben wurde. Negative Zahlen sind nicht zulässig.

Beispiel

Beschreibung

Das folgende Beispiel zeigt die Auswirkungen der verschiedenen Cursor. In Zeile 33 des Beispiels ist die erste von drei Abfrageanweisungen enthalten, mit denen verschiedene Cursor angegeben werden. Zwei der Abfrageanweisungen sind kommentiert. Verwenden Sie bei jeder Ausführung des Programms einen anderen Cursortyp, um die Auswirkungen der Datenbankaktualisierung in Zeile 47 zu sehen.

Code

<?php
$server = "server_name";
$conn = sqlsrv_connect( $server, array( 'Database' => 'test' ));
if ( $conn === false ) {
   die( print_r( sqlsrv_errors(), true ));
}

$stmt = sqlsrv_query( $conn, "DROP TABLE dbo.ScrollTest" );
if ( $stmt !== false ) { 
   sqlsrv_free_stmt( $stmt ); 
}

$stmt = sqlsrv_query( $conn, "CREATE TABLE ScrollTest (id int, value char(10))" );
if ( $stmt === false ) {
   die( print_r( sqlsrv_errors(), true ));
}

$stmt = sqlsrv_query( $conn, "INSERT INTO ScrollTest (id, value) VALUES(?,?)", array( 1, "Row 1" ));
if ( $stmt === false ) {
   die( print_r( sqlsrv_errors(), true ));
}

$stmt = sqlsrv_query( $conn, "INSERT INTO ScrollTest (id, value) VALUES(?,?)", array( 2, "Row 2" ));
if ( $stmt === false ) {
   die( print_r( sqlsrv_errors(), true ));
}

$stmt = sqlsrv_query( $conn, "INSERT INTO ScrollTest (id, value) VALUES(?,?)", array( 3, "Row 3" ));
if ( $stmt === false ) {
   die( print_r( sqlsrv_errors(), true ));
}

$stmt = sqlsrv_query( $conn, "SELECT * FROM ScrollTest", array(), array( "Scrollable" => 'keyset' ));
// $stmt = sqlsrv_query( $conn, "SELECT * FROM ScrollTest", array(), array( "Scrollable" => 'dynamic' ));
// $stmt = sqlsrv_query( $conn, "SELECT * FROM ScrollTest", array(), array( "Scrollable" => 'static' ));

$rows = sqlsrv_has_rows( $stmt );
if ( $rows != true ) {
   die( "Should have rows" );
}

$result = sqlsrv_fetch( $stmt, SQLSRV_SCROLL_LAST );
$field1 = sqlsrv_get_field( $stmt, 0 );
$field2 = sqlsrv_get_field( $stmt, 1 );
echo "\n$field1 $field2\n";

$stmt2 = sqlsrv_query( $conn, "delete from ScrollTest where id = 3" );
// or
// $stmt2 = sqlsrv_query( $conn, "UPDATE ScrollTest SET id = 4 WHERE id = 3" );
if ( $stmt2 !== false ) { 
   sqlsrv_free_stmt( $stmt2 ); 
}

$result = sqlsrv_fetch( $stmt, SQLSRV_SCROLL_LAST );
$field1 = sqlsrv_get_field( $stmt, 0 );
$field2 = sqlsrv_get_field( $stmt, 1 );
echo "\n$field1 $field2\n";

sqlsrv_free_stmt( $stmt );
sqlsrv_close( $conn );
?>

Siehe auch

Weitere Ressourcen

Abrufen von Daten