次の方法で共有


データをストリームとして送信する方法

SQL Server Driver for PHP は、大きなオブジェクトをサーバーに送信するために、PHP ストリームを利用します。このトピックの例では、データをストリームとして送信する方法を示します。最初の例では、クエリの実行時にすべてのストリーム データを送信する既定の動作を示します。2 番目の例では、一度に最大 8 KB のストリーム データをサーバーに送信する方法を示します。

次の例では、AdventureWorks データベースの Production.ProductReview テーブルに行を挿入します。PHP の fopen 関数を使用して顧客のコメント ($comments) をストリームとして開き、クエリの実行時にサーバーにストリーム送信します。

この例では、SQL Server と AdventureWorks データベースがローカル コンピュータにインストールされていることを前提としています。すべての出力はコンソールに書き込まれます。

<?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);
?>

次の例は上記の例と同じですが、実行時にすべてのストリーム データを送信する既定の動作が無効になっています。この例では、sqlsrv_send_stream_data を使用してサーバーにストリーム データを送信します。sqlsrv_send_stream_data を呼び出すたびに、最大 8 KB のデータが送信されます。スクリプトでは、sqlsrv_send_stream_data によって行われた呼び出しの回数をカウントし、その回数をコンソールに表示します。

この例では、SQL Server と AdventureWorks データベースがローカル コンピュータにインストールされていることを前提としています。すべての出力はコンソールに書き込まれます。

<?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);
?>

このトピックの例では文字データをサーバーに送信していますが、任意の形式のデータをストリームとして送信できます。たとえば、このトピックで示した手法は、バイナリ形式の画像をストリームとして送信する場合にも使用できます。

参照

概念

ドキュメントのコード例について

その他のリソース

データの更新 (SQL Server Driver for PHP)
ストリームとしてのデータの取得