Compartir a través de


Cómo enviar datos como una secuencia

El Controlador de SQL Server para PHP aprovecha las ventajas de las secuencias de PHP para enviar grandes objetos al servidor. En los ejemplos de este tema se muestra cómo enviar datos como una secuencia. En el primer ejemplo se muestra el comportamiento predeterminado, que consiste en enviar todos los datos en secuencia al tiempo que se ejecuta la consulta. En el segundo ejemplo se muestra cómo enviar hasta ocho kilobytes (8K) de datos en secuencia a la vez al servidor.

Ejemplo

En el siguiente ejemplo se inserta una fila en la tabla Production.ProductReview de la base de datos AdventureWorks. Los comentarios del cliente ($comments) se abren como una secuencia con la función fopen de PHP y, a continuación, se envían al servidor tras la ejecución de la consulta.

En el ejemplo se supone que SQL Server y la base de datos AdventureWorks están instalados en el equipo local. Todos los resultados se escriben en la consola.

<?php
/* Connect to the local server using Windows Authentication and
specify the AdventureWorks database as the database in use. */
$serverName = "(local)";
$connectionInfo = array( "Database"=>"AdventureWorks");
$conn = sqlsrv_connect( $serverName, $connectionInfo);
if( $conn === false )
{
     echo "Could not connect.\n";
     die( print_r( sqlsrv_errors(), true));
}

/* Set up the Transact-SQL query. */
$tsql = "INSERT INTO Production.ProductReview (ProductID, 
                                               ReviewerName,
                                               ReviewDate,
                                               EmailAddress,
                                               Rating,
                                               Comments)
         VALUES (?, ?, ?, ?, ?, ?)";

/* Set the parameter values and put them in an array.
Note that $comments is opened as a stream. */
$productID = '709';
$name = 'Customer Name';
$date = date("Y-m-d");
$email = 'customer@name.com';
$rating = 3;
$comments = fopen( "data://text/plain,[ Insert lengthy comment here.]",
                  "r");
$params = array($productID, $name, $date, $email, $rating, $comments);

/* Execute the query. All stream data is sent upon execution.*/
$stmt = sqlsrv_query($conn, $tsql, $params);
if( $stmt === false )
{
     echo "Error in statement execution.\n";
     die( print_r( sqlsrv_errors(), true));
}
else
{
     echo "The query was successfully executed.";
}

/* Free statement and connection resources. */
sqlsrv_free_stmt( $stmt);
sqlsrv_close( $conn);
?>

El ejemplo siguiente es el mismo que el ejemplo anterior, aunque el comportamiento predeterminado de enviar todos los datos en secuencia en tiempo de ejecución está desactivado. El ejemplo usa sqlsrv_send_stream_data para enviar datos en secuencia al servidor. Con cada llamada a sqlsrv_send_stream_data se envían hasta ocho kilobytes (8K) de datos. El script cuenta el número de llamadas que realiza sqlsrv_send_stream_data y muestra el recuento en la consola.

En el ejemplo se supone que SQL Server y la base de datos AdventureWorks están instalados en el equipo local. Todos los resultados se escriben en la consola.

<?php
/* Connect to the local server using Windows Authentication and
specify the AdventureWorks database as the database in use. */
$serverName = "(local)";
$connectionInfo = array( "Database"=>"AdventureWorks");
$conn = sqlsrv_connect( $serverName, $connectionInfo);
if( $conn === false )
{
     echo "Could not connect.\n";
     die( print_r( sqlsrv_errors(), true));
}

/* Set up the Transact-SQL query. */
$tsql = "INSERT INTO Production.ProductReview (ProductID, 
                                               ReviewerName,
                                               ReviewDate,
                                               EmailAddress,
                                               Rating,
                                               Comments)
         VALUES (?, ?, ?, ?, ?, ?)";

/* Set the parameter values and put them in an array.
Note that $comments is opened as a stream. */
$productID = '709';
$name = 'Customer Name';
$date = date("Y-m-d");
$email = 'customer@name.com';
$rating = 3;
$comments = fopen( "data://text/plain,[ Insert lengthy comment here.]",
                  "r");
$params = array($productID, $name, $date, $email, $rating, $comments);

/* Turn off the default behavior of sending all stream data at
execution. */
$options = array("SendStreamParamsAtExec" => 0);

/* Execute the query. */
$stmt = sqlsrv_query($conn, $tsql, $params, $options);
if( $stmt === false )
{
     echo "Error in statement execution.\n";
     die( print_r( sqlsrv_errors(), true));
}

/* Send up to 8K of parameter data to the server with each call to
sqlsrv_send_stream_data. Count the calls. */
$i = 1;
while( sqlsrv_send_stream_data( $stmt)) 
{
     echo "$i call(s) made.\n";
     $i++;
}

/* Free statement and connection resources. */
sqlsrv_free_stmt( $stmt);
sqlsrv_close( $conn);
?>

Aunque los ejemplos de este tema envían datos de caracteres al servidor, se pueden enviar datos en cualquier formato como una secuencia. Por ejemplo, también puede usar las técnicas mostradas en este tema para enviar imágenes en formato binario como secuencias.

Vea también

Conceptos

Acerca de ejemplos de código en la documentación

Otros recursos

Actualizar datos (Controlador de SQL Server para PHP)
Recuperar datos como una secuencia