Mssql + print database = failed stmt malgres succes

Mssql + print database = failed stmt malgres succes - PHP - Programmation

Marsh Posté le 18-08-2016 à 01:17:17    

Hello a tous
 
Est-ce que quelqu un sait comment compter le nombre de rows affectées avec une DB MSSQL dans laquelle j ai implémenté des prints pour savoir quel trigger est lancé, pour la gestion en interne.
le sqlsrv_row_count ne marche pas , le stmt me retourne une erreur malgres le faite qu il a bien enregistrer le truc dans la table.
 
J ai essayé aussi differents types de cursor Key_set , Dynamic etc sans succes
 

Spoiler :

SQLSRV_CURSOR_FORWARD, SQLSRV_CURSOR_STATIC, SQLSRV_CURSOR_DYNAMIC, ou SQLSRV_CURSOR_KEYSET


 
La seul possibilité pour le moment est de virer tout les prints des triggers (Instead of insert, for update, delete), ce qui n est pas non plus souhaitable


Message édité par Neon67 le 18-08-2016 à 01:18:24
Reply

Marsh Posté le 18-08-2016 à 01:17:17   

Reply

Marsh Posté le 18-08-2016 à 09:26:34    

Voila le code  
 

Spoiler :

$tsql = "Insert INTO software_version ([software_id], [version]) VALUES (?,?)";  
$params = array ($software_id, $version);
$stmt = sqlsrv_query( $conn, $tsql, $params, array("Scrollable" => SQLSRV_CURSOR_KEYSET));
if( $stmt === false ) {      echo "Error insert <br>";
                                    die( print_r( sqlsrv_errors(), true));
                               }
$rows_affected = sqlsrv_rows_affected( $stmt);
$row_count= sqlsrv_num_rows($stmt);
if( $row_count != 0 ) {     ....
 


Le stmt retourne toujours false, meme si il a bien inserer dans la base de donnee
L erreur retournee est la suivante

Spoiler :

Array(    [0] => Array        (            [0] => 01000            [SQLSTATE] => 01000            [1] => 0            [code] => 0            [2] => [Microsoft][ODBC Driver 11 for SQL Server][SQL Server]Begin tgr_software_version_insert            [message] => [Microsoft][ODBC Driver 11 for SQL Server][SQL Server]Begin tgr_software_version_insert        ))
 


La partie en gras est ce que le Trigger ecrit via Print dans le Instead of Insert.  Cela m es tres utile lors de l integration direct d un grand nombre de donnees
 

Spoiler :

BEGIN
        Print('Begin tgr_software_version_insert');
        open mycursor_tgr_software_version_insert;
 


Voila, si quelqu un a une idee ca serait sympas  :hello:

Reply

Marsh Posté le 18-08-2016 à 10:11:04    

Tu as la réponse dans la question.
Le pilote SQLSRV pour PHP parse les retours fait par le serveur pour savoir si la requête se passe correctement.

 

Si tu renvoies quelque chose avec print, dans un trigger, il croit que l'insert n'a pas fonctionné car il n'a pas "1 rows inserted" seul.

 

Il te faut virer le print ... ou bien développer un mode "debug" qui print quand tu en as besoin, mais pas dans un cas comme celui ci.

 

Et utilise la balise code à la place de la balise spoiler stp :o


Message édité par kao98 le 18-08-2016 à 10:12:18

---------------
Kao ..98 - Uplay (R6S) : kao98.7.62x39 - Origin (BF4, BF1) : kntkao98
Reply

Marsh Posté le 18-08-2016 à 10:19:59    

Merci . c est dommage de virer les print car ils sont utile pour la maintenance de la DB. Y a pas une autre methode ? Le mode debug c est quoi exactement ?

Reply

Marsh Posté le 18-08-2016 à 10:45:24    

Neon67 a écrit :

Merci . c est dommage de virer les print car ils sont utile pour la maintenance de la DB. Y a pas une autre methode ? Le mode debug c est quoi exactement ?


C'était une proposition d'un truc à faire toi même si besoin :o
 
Pis y'a plein d'autre façon de journaliser sans passer par des print, pour de la maintenance par exemple.
 
Une table de log par exemple.
 


---------------
Kao ..98 - Uplay (R6S) : kao98.7.62x39 - Origin (BF4, BF1) : kntkao98
Reply

Marsh Posté le 18-08-2016 à 13:26:51    

J ai une table de log egalement.
Seulement  MSSQL n aime pas les boucles avec les FK. Du coup pour du update on Cascade ou Delete on Cascade j ai du passer par les trigger, le Print me sert par exemple a suivre le cheminement entre autre

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed