SGBD / ASP : Page tester des procédures stockées SQL Server depuis ASP

SGBD / ASP : Page tester des procédures stockées SQL Server depuis ASP - SQL/NoSQL - Programmation

Marsh Posté le 21-07-2005 à 09:54:58    

Salut,
 
Hier, j'étais confronté à un gros problème de performances sur un site qu'on vient de passer en production.
 
Afin de vérifier la rapidité des procédures stockées entre le serveur BDD et IIS, j'ai donc dû créer une page qui execute des procédures stockées, charge le résultat, et indique en combien de temps ça a tourné.
 
=> Etant donné que pour mon "bench", j'avais décidé de tester 10 procédures différentes, chacune plusieurs fois avec des paramètres différents, j'ai décidé de faire une page générique, qui permette de sasir le nom de la PS a executer, ainsi que ses paramètres, mais tout en conservant l'utilisation de l'objet ADODB.Command (donc pas de exec de bourrin).
 
Voici le code de la page, qui pourrait vous être utile aussi.
Il reste à rajouter les autres types de données (pour le moment, elle n'accepte que les type Int, Varchar et DateTime) ainsi que les contrôles de base, genre si la PS existe, ou si on tente de lancer une PS en oubliant un paramètre obligatoire.
 

Code :
  1. <%@Language="VBScript"%>
  2. <%
  3. Option Explicit
  4. ' 1 heure, ça devrait suffir...
  5. Server.ScriptTimeout = 3600
  6. Dim fVal(1)
  7. fVal(0) = timer
  8. %>
  9. <html>
  10. <head>
  11.  <title>Page de test SQL</title>
  12. </head>
  13. <body>
  14. <%
  15. If Request.Form = "" Then
  16. ' Affichage d'un formulaire de saisie de la procédure et des paramètres
  17. %>
  18.  <p>Veuillez sasir le nom d'une procédure stockée à executer, ainsi que la liste des paramètres (un par ligne, sous la forme "@nomParam=valeur" ).<br>Tapez "(null)" pour les valeurs nulles.
  19.  <form name="frmSQL" method="POST">
  20.   <dl>
  21.    <dt>Procédure :</dt>
  22.    <dd><input size="47" type="text" name="procname"></dd>
  23.    <dt>Paramètres :</dt>
  24.    <dd><textarea name="params" cols="40" rows="5"></textarea></dd>
  25.    <dd><input type="submit" value="Lancer la procédure"></dd>
  26.   </dl>
  27.  </form>
  28. <%
  29. Else
  30. ' Affichage des résultats
  31. Dim tabParams
  32. Dim tabParamNames()
  33. Dim tabParamVals()
  34. tabParams = Split(CStr(Request.Form("params" )), vbCrLf)
  35. Redim tabParamNames(UBound(tabParams))
  36. Redim tabParamVals(UBound(tabParams))
  37. Dim i
  38. For i = LBound(tabParams) to UBound(tabParams)
  39.  tabParamNames(i) = Trim(Left(tabParams(i), Instr(1, tabParams(i), "=" ) - 1))
  40.  tabParamVals(i) = Trim(Right(tabParams(i), Len(tabParams(i)) - Instr(1, tabParams(i), "=" )))
  41.  If tabParamVals(i) = "(null)" Then
  42.   tabParamVals(i) = null
  43.  End If
  44. Next
  45. Dim cnx
  46. Set cnx = Server.CreateObject("ADODB.Connection" )
  47. cnx.ConnectionString = "dsn=LE_DSN;user id=LOGIN;password=PASSWORD"
  48. cnx.Open
  49. Dim cmd
  50. Set cmd = Server.CreateObject("ADODB.Command" )
  51. Set cmd.ActiveConnection = cnx
  52. cmd.NamedParameters = True
  53. cmd.CommandText = Request.Form("procname" )
  54. cmd.CommandType = 4
  55. cmd.CommandTimeout = 0
  56. %>
  57.  <p>Paramètres reçus :</p>
  58.  <pre>
  59. <%
  60. Dim rs
  61. Set rs = Server.CreateObject("ADODB.RecordSet" )
  62. Set rs.ActiveConnection = cnx
  63. For i = LBound(tabParams) to UBound(tabParams)
  64.  rs.Open "select c.name, c.xtype, c.length from syscolumns c, sysobjects o where o.xtype = 'P' and o.name like '" & Request.Form("procname" ) & "' and c.id = o.id and c.name like '" & tabParamNames(i) & "'"
  65.  Response.Write tabParamNames(i) & " = "
  66.  If Not isNull(tabParamVals(i)) Then
  67.   Response.Write tabParamVals(i)
  68.  Else
  69.   Response.Write "(null)"
  70.  End If
  71.  If Not rs.EOF Then
  72.   If rs("xtype" ) = 56 Then
  73.    Response.Write " Int"
  74.    cmd.Parameters.Append cmd.CreateParameter(rs("name" ), 3, 1, rs("length" ), tabParamVals(i))
  75.   ElseIf rs("xtype" ) = 167 Then
  76.    Response.Write " VarChar"
  77.    cmd.Parameters.Append cmd.CreateParameter(rs("name" ), 200, 1, rs("length" ), tabParamVals(i))
  78.   ElseIf rs("xtype" ) = 61 Then
  79.    Response.Write " DateTime"
  80.    cmd.Parameters.Append cmd.CreateParameter(rs("name" ), 135, 1, rs("length" ), tabParamVals(i))
  81.   End If
  82.   Response.Write vbCrLf
  83.  Else
  84.   Response.Write " Inexistant =&gt; ignoré"
  85.  End If
  86.  rs.Close
  87. Next
  88. %>
  89.  </pre>
  90. <%
  91. Set rs = cmd.Execute
  92. %>
  93.  <table>
  94.   <tr>
  95. <%
  96. Dim el
  97. For Each el in rs.Fields
  98. %>
  99.    <th><%=el.Name%></th>
  100. <%
  101. Next
  102. %>
  103.   </tr>
  104. <%
  105. Dim cpt
  106. cpt = 0
  107. Do While Not rs.EOF
  108.  cpt = cpt + 1
  109.  If cpt <= 100 Then
  110. %>
  111.   <tr>
  112. <%
  113.   For Each el in rs.Fields
  114. %>
  115.    <td><%=el.Value%></td>
  116. <%
  117.   Next
  118. %>
  119.   </tr>
  120. <%
  121.  End If
  122.  rs.MoveNext
  123. Loop
  124. If cpt > 100 Then
  125. %>
  126.   <tr>
  127.    <th colspan="<%=rs.Fields.Count%>"><%=cpt%> &eacute;l&eacute; au total</th>
  128.   </tr>
  129. <%
  130. End If
  131. %>
  132.  </table>
  133.  <a href="procrunner.asp">Autre requête</a>
  134. <%
  135. rs.Close
  136. Set rs = Nothing
  137. Set cmd = Nothing
  138. cnx.Close
  139. Set cnx = Nothing
  140. End If
  141. fVal(1) = CSng( timer )
  142. %>
  143.  <p>Dur&eacute; totale : <%=(fVal(1) - fVal(0))%> secondes.</p>
  144. </body>
  145. </html>


 
Actuellement, elle utilise un DSN, on pourrait très bien modifier cette ligne pour passer par une connection OLE DB.
 
Si vous êtes intéressés pour faire la même page en d'autres langages / pour d'autres SGBD, ce serait intéressant de se constituer une petite librairie dans ce topic non ?

Reply

Marsh Posté le 21-07-2005 à 09:54:58   

Reply

Marsh Posté le 21-07-2005 à 11:04:53    

J'aime bien, à chaque fois que je fais des topics "utiles", tout le monde s'en fout :spamafote:

Reply

Marsh Posté le 21-07-2005 à 12:21:07    

mais non bordel, c'est juste qu'il y a rien à dire de plus :o
j'ai quelques topics à toi dans mes favoris, spas pour ça que j'y ai posté hein


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 21-07-2005 à 12:22:06    

Ha, merci, ça fait plaisir :D

Reply

Sujets relatifs:

Leave a Replay

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