Delen via


Procedure: Fouten en waarschuwingen afhandelen met behulp van het SQLSRV-stuurprogramma

PHP-stuurprogramma downloaden

Standaard behandelt het SQLSRV-stuurprogramma waarschuwingen als fouten; een aanroep van een sqlsrv-functie die een fout genereert of een waarschuwing onwaar retourneert. In dit onderwerp wordt gedemonstreert hoe u dit standaardgedrag uitschakelt en hoe u waarschuwingen afzonderlijk van fouten kunt afhandelen.

Opmerking

Er zijn enkele uitzonderingen op het standaardgedrag van het behandelen van waarschuwingen als fouten. Waarschuwingen die overeenkomen met de SQLSTATE-waarden 01000, 01001, 01003 en 01S02 worden nooit behandeld als fouten.

Example

In het volgende codevoorbeeld worden twee door de gebruiker gedefinieerde functies , DisplayErrors en DisplayWarnings, gebruikt om fouten en waarschuwingen af te handelen. In het voorbeeld ziet u hoe u waarschuwingen en fouten afzonderlijk kunt afhandelen door het volgende te doen:

  1. Hiermee schakelt u het standaardgedrag van het behandelen van waarschuwingen als fouten uit.

  2. Hiermee maakt u een opgeslagen procedure die de vakantieuren van een werknemer bijwerkt en de resterende vakantieuren retourneert als uitvoerparameter. Wanneer de beschikbare vakantieuren van een werknemer kleiner zijn dan nul, drukt de opgeslagen procedure een waarschuwing af.

  3. Werkt vakantieuren voor verschillende werknemers bij door de opgeslagen procedure voor elke werknemer aan te roepen en geeft de berichten weer die overeenkomen met eventuele waarschuwingen en fouten die optreden.

  4. Geeft de resterende vakantieuren weer voor elke werknemer.

In de eerste aanroep van een sqlsrv-functie (sqlsrv_configure) worden waarschuwingen behandeld als fouten. Omdat er waarschuwingen worden toegevoegd aan de foutverzameling, hoeft u niet afzonderlijk van fouten te controleren op waarschuwingen. In volgende aanroepen naar sqlsrv-functies worden waarschuwingen echter niet behandeld als fouten, dus u moet expliciet controleren op waarschuwingen en op fouten.

Houd er ook rekening mee dat de voorbeeldcode na elke aanroep naar een sqlsrv-functie controleert op fouten. Dit is de aanbevolen procedure.

In dit voorbeeld wordt ervan uitgegaan dat SQL Server en de AdventureWorks-database op de lokale computer zijn geïnstalleerd. Alle uitvoer wordt naar de console geschreven wanneer het voorbeeld via de opdrachtregel wordt uitgevoerd. Wanneer het voorbeeld wordt uitgevoerd op basis van een nieuwe installatie van de AdventureWorks-database, worden er drie waarschuwingen en twee fouten gegenereerd. De eerste twee waarschuwingen zijn standaardwaarschuwingen die worden uitgegeven wanneer u verbinding maakt met een database. De derde waarschuwing treedt op omdat de beschikbare vakantieuren van een werknemer worden bijgewerkt naar een waarde kleiner dan nul. De fouten treden op omdat de beschikbare vakantieuren van een werknemer worden bijgewerkt naar een waarde die kleiner is dan -40 uur. Dit is een schending van een beperking in de 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";  
          }  
     }  
}  
?>  

Zie ook

Procedure: Fout- en waarschuwingsafhandeling configureren met behulp van het SQLSRV-stuurprogramma

Naslaginformatie over de API voor SQLSRV-stuurprogramma's