Compartir vía


Procedimientos: Envío de datos en forma de secuencia

Descargar controlador PHP

Los Controladores de Microsoft para PHP para SQL Server aprovechan las secuencias de PHP para enviar objetos de gran tamaño al servidor. En los ejemplos de este tema se muestra cómo enviar datos como una secuencia. En el primer ejemplo se utiliza el controlador SQLSRV para mostrar el comportamiento predeterminado, que consiste en enviar todos los datos de secuencia en el momento de ejecución de la consulta. En el segundo ejemplo se usa el controlador SQLSRV para mostrar cómo enviar hasta ocho kilobytes (8 kB) de datos de secuencia a la vez al servidor.

En el tercer ejemplo se muestra cómo enviar datos de secuencia al servidor con el controlador PDO_SQLSRV.

Ejemplo: Envío de datos de secuencia en la ejecución

En el ejemplo siguiente se inserta una fila en la tabla Production.ProductReview de la base de datos de AdventureWorks. Los comentarios del cliente ( $comments) se abren como una secuencia con la función fopen de PHP y luego se transmiten al servidor al ejecutar la consulta.

En el ejemplo se da por hecho que SQL Server y la base de datos AdventureWorks están instalados en el equipo local. Todos los resultados se agregan a 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;  
$data = 'Insert any lengthy comment here.';
$comments = fopen('data:text/plain,'.urlencode($data), '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);  
?>  

Ejemplo: Envío de datos de secuencia mediante sqlsrv_send_stream_data

El ejemplo siguiente es el mismo que el anterior, pero en él se ha desactivado el comportamiento predeterminado de enviar todos los datos de secuencia en el momento de la ejecución. En este ejemplo se utiliza sqlsrv_send_stream_data para enviar datos de secuencia al servidor. Se envían hasta ocho kilobytes (8 kB) de datos con cada llamada a sqlsrv_send_stream_data. El script cuenta el número de llamadas realizadas por sqlsrv_send_stream_data y muestra el recuento en la consola.

En el ejemplo se da por hecho que SQL Server y la base de datos AdventureWorks están instalados en el equipo local. Todos los resultados se agregan a 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;  
$data = 'Insert any lengthy comment here.';
$comments = fopen('data:text/plain,'.urlencode($data), '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, pueden enviarse datos en cualquier formato como una secuencia. Por ejemplo, también puede utilizar las técnicas que se muestran en este tema para enviar imágenes en formato binario como secuencias.

Ejemplo: Envío de una imagen en forma de secuencia

<?php  
   $server = "(local)";   
   $database = "Test";  
   $conn = new PDO( "sqlsrv:server=$server;Database = $database", "", "");  
  
   $binary_source = fopen( "data://text/plain,", "r");  
  
   $stmt = $conn->prepare("insert into binaries (imagedata) values (?)");  
   $stmt->bindParam(1, $binary_source, PDO::PARAM_LOB);   
  
   $conn->beginTransaction();  
   $stmt->execute();  
   $conn->commit();  
?>  

Consulte también

Actualización de datos (controladores de Microsoft para PHP para SQL Server)

Recuperación de datos como una secuencia con el controlador SQLSRV

Sobre los ejemplos de código de la documentación