Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Secara default, driver SQLSRV memperlakukan peringatan sebagai kesalahan; panggilan ke fungsi sqlsrv yang menghasilkan kesalahan atau peringatan mengembalikan false. Topik ini menunjukkan cara menonaktifkan perilaku default ini dan cara menangani peringatan secara terpisah dari kesalahan.
Catatan
Ada beberapa pengecualian untuk perilaku default memperlakukan peringatan sebagai kesalahan. Peringatan yang sesuai dengan nilai SQLSTATE 01000, 01001, 01003, dan 01S02 tidak pernah diperlakukan sebagai kesalahan.
Contoh
Contoh kode berikut menggunakan dua fungsi yang ditentukan pengguna, DisplayErrors dan DisplayWarnings, untuk menangani kesalahan dan peringatan. Contoh menunjukkan cara menangani peringatan dan kesalahan secara terpisah dengan melakukan hal berikut:
Menonaktifkan perilaku default memperlakukan peringatan sebagai kesalahan.
Membuat prosedur tersimpan yang memperbarui jam liburan karyawan dan mengembalikan jam liburan yang tersisa sebagai parameter output. Ketika jam liburan karyawan yang tersedia kurang dari nol, prosedur tersimpan mencetak peringatan.
Memperbarui jam liburan untuk beberapa karyawan dengan memanggil prosedur tersimpan untuk setiap karyawan, dan menampilkan pesan yang sesuai dengan peringatan dan kesalahan yang terjadi.
Menampilkan jam liburan yang tersisa untuk setiap karyawan.
Dalam panggilan pertama ke fungsi sqlsrv (sqlsrv_configure), peringatan diperlakukan sebagai kesalahan. Karena peringatan ditambahkan ke kumpulan kesalahan, Anda tidak perlu memeriksa peringatan secara terpisah dari kesalahan. Namun, dalam panggilan berikutnya ke fungsi sqlsrv , peringatan tidak akan diperlakukan sebagai kesalahan, jadi Anda harus memeriksa secara eksplisit untuk peringatan dan untuk kesalahan.
Perhatikan juga bahwa kode contoh memeriksa kesalahan setelah setiap panggilan ke fungsi sqlsrv . Ini adalah praktik yang direkomendasikan.
Contoh ini mengasumsikan bahwa SQL Server dan database AdventureWorks diinstal di komputer lokal. Semua output ditulis ke konsol saat contoh dijalankan dari baris perintah. Ketika contoh dijalankan terhadap penginstalan baru database AdventureWorks, contoh tersebut menghasilkan tiga peringatan dan dua kesalahan. Dua peringatan pertama adalah peringatan standar yang dikeluarkan saat Anda tersambung ke database. Peringatan ketiga terjadi karena jam liburan karyawan yang tersedia diperbarui ke nilai kurang dari nol. Kesalahan terjadi karena jam liburan karyawan yang tersedia diperbarui ke nilai kurang dari -40 jam, yang merupakan pelanggaran batasan pada tabel.
<?php
/* Turn off the default behavior of treating errors as warnings.
Note: Turning off the default behavior is done here for demonstration
purposes only. If setting the configuration fails, display errors and
exit the script. */
if( sqlsrv_configure("WarningsReturnAsErrors", 0) === false)
{
DisplayErrors();
die;
}
/* 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 the connection fails, display errors and exit the script. */
if( $conn === false )
{
DisplayErrors();
die;
}
/* Display any warnings. */
DisplayWarnings();
/* Drop the stored procedure if it already exists. */
$tsql1 = "IF OBJECT_ID('SubtractVacationHours', 'P') IS NOT NULL
DROP PROCEDURE SubtractVacationHours";
$stmt1 = sqlsrv_query($conn, $tsql1);
/* If the query fails, display errors and exit the script. */
if( $stmt1 === false)
{
DisplayErrors();
die;
}
/* Display any warnings. */
DisplayWarnings();
/* Free the statement resources. */
sqlsrv_free_stmt( $stmt1 );
/* Create the stored procedure. */
$tsql2 = "CREATE PROCEDURE SubtractVacationHours
@EmployeeID int,
@VacationHours smallint OUTPUT
AS
UPDATE HumanResources.Employee
SET VacationHours = VacationHours - @VacationHours
WHERE EmployeeID = @EmployeeID;
SET @VacationHours = (SELECT VacationHours
FROM HumanResources.Employee
WHERE EmployeeID = @EmployeeID);
IF @VacationHours < 0
BEGIN
PRINT 'WARNING: Vacation hours are now less than zero.'
END;";
$stmt2 = sqlsrv_query( $conn, $tsql2 );
/* If the query fails, display errors and exit the script. */
if( $stmt2 === false)
{
DisplayErrors();
die;
}
/* Display any warnings. */
DisplayWarnings();
/* Free the statement resources. */
sqlsrv_free_stmt( $stmt2 );
/* Set up the array that maps employee ID to used vacation hours. */
$emp_hrs = array (7=>4, 8=>5, 9=>8, 11=>50);
/* Initialize variables that will be used as parameters. */
$employeeId = 0;
$vacationHrs = 0;
/* Set up the parameter array. */
$params = array(
array(&$employeeId, SQLSRV_PARAM_IN),
array(&$vacationHrs, SQLSRV_PARAM_INOUT)
);
/* Define and prepare the query to subtract used vacation hours. */
$tsql3 = "{call SubtractVacationHours(?, ?)}";
$stmt3 = sqlsrv_prepare($conn, $tsql3, $params);
/* If the statement preparation fails, display errors and exit the script. */
if( $stmt3 === false)
{
DisplayErrors();
die;
}
/* Display any warnings. */
DisplayWarnings();
/* Loop through the employee=>vacation hours array. Update parameter
values before statement execution. */
foreach(array_keys($emp_hrs) as $employeeId)
{
$vacationHrs = $emp_hrs[$employeeId];
/* Execute the query. If it fails, display the errors. */
if( sqlsrv_execute($stmt3) === false)
{
DisplayErrors();
die;
}
/* Display any warnings. */
DisplayWarnings();
/*Move to the next result returned by the stored procedure. */
if( sqlsrv_next_result($stmt3) === false)
{
DisplayErrors();
die;
}
/* Display any warnings. */
DisplayWarnings();
/* Display updated vacation hours. */
echo "EmployeeID $employeeId has $vacationHrs ";
echo "remaining vacation hours.\n";
}
/* Free the statement and connection resources. */
sqlsrv_free_stmt( $stmt3 );
sqlsrv_close( $conn );
/* ------------- Error Handling Functions --------------*/
function DisplayErrors()
{
$errors = sqlsrv_errors(SQLSRV_ERR_ERRORS);
foreach( $errors as $error )
{
echo "Error: ".$error['message']."\n";
}
}
function DisplayWarnings()
{
$warnings = sqlsrv_errors(SQLSRV_ERR_WARNINGS);
if(!is_null($warnings))
{
foreach( $warnings as $warning )
{
echo "Warning: ".$warning['message']."\n";
}
}
}
?>
Lihat Juga
Cara: Mengonfigurasi Kesalahan dan Penanganan Peringatan Menggunakan Driver SQLSRV