Arjuna Aircraft Ident.: F-MBSD | 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 :
- <%@Language="VBScript"%>
- <%
- Option Explicit
- ' 1 heure, ça devrait suffir...
- Server.ScriptTimeout = 3600
- Dim fVal(1)
- fVal(0) = timer
- %>
- <html>
- <head>
- <title>Page de test SQL</title>
- </head>
- <body>
- <%
- If Request.Form = "" Then
- ' Affichage d'un formulaire de saisie de la procédure et des paramètres
- %>
- <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.
- <form name="frmSQL" method="POST">
- <dl>
- <dt>Procédure :</dt>
- <dd><input size="47" type="text" name="procname"></dd>
- <dt>Paramètres :</dt>
- <dd><textarea name="params" cols="40" rows="5"></textarea></dd>
- <dd><input type="submit" value="Lancer la procédure"></dd>
- </dl>
- </form>
- <%
- Else
- ' Affichage des résultats
- Dim tabParams
- Dim tabParamNames()
- Dim tabParamVals()
- tabParams = Split(CStr(Request.Form("params" )), vbCrLf)
- Redim tabParamNames(UBound(tabParams))
- Redim tabParamVals(UBound(tabParams))
- Dim i
- For i = LBound(tabParams) to UBound(tabParams)
- tabParamNames(i) = Trim(Left(tabParams(i), Instr(1, tabParams(i), "=" ) - 1))
- tabParamVals(i) = Trim(Right(tabParams(i), Len(tabParams(i)) - Instr(1, tabParams(i), "=" )))
- If tabParamVals(i) = "(null)" Then
- tabParamVals(i) = null
- End If
- Next
- Dim cnx
- Set cnx = Server.CreateObject("ADODB.Connection" )
- cnx.ConnectionString = "dsn=LE_DSN;user id=LOGIN;password=PASSWORD"
- cnx.Open
- Dim cmd
- Set cmd = Server.CreateObject("ADODB.Command" )
- Set cmd.ActiveConnection = cnx
- cmd.NamedParameters = True
- cmd.CommandText = Request.Form("procname" )
- cmd.CommandType = 4
- cmd.CommandTimeout = 0
- %>
- <p>Paramètres reçus :</p>
- <pre>
- <%
- Dim rs
- Set rs = Server.CreateObject("ADODB.RecordSet" )
- Set rs.ActiveConnection = cnx
- For i = LBound(tabParams) to UBound(tabParams)
- 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) & "'"
- Response.Write tabParamNames(i) & " = "
- If Not isNull(tabParamVals(i)) Then
- Response.Write tabParamVals(i)
- Else
- Response.Write "(null)"
- End If
- If Not rs.EOF Then
- If rs("xtype" ) = 56 Then
- Response.Write " Int"
- cmd.Parameters.Append cmd.CreateParameter(rs("name" ), 3, 1, rs("length" ), tabParamVals(i))
- ElseIf rs("xtype" ) = 167 Then
- Response.Write " VarChar"
- cmd.Parameters.Append cmd.CreateParameter(rs("name" ), 200, 1, rs("length" ), tabParamVals(i))
- ElseIf rs("xtype" ) = 61 Then
- Response.Write " DateTime"
- cmd.Parameters.Append cmd.CreateParameter(rs("name" ), 135, 1, rs("length" ), tabParamVals(i))
- End If
- Response.Write vbCrLf
- Else
- Response.Write " Inexistant => ignoré"
- End If
- rs.Close
- Next
- %>
- </pre>
- <%
- Set rs = cmd.Execute
- %>
- <table>
- <tr>
- <%
- Dim el
- For Each el in rs.Fields
- %>
- <th><%=el.Name%></th>
- <%
- Next
- %>
- </tr>
- <%
- Dim cpt
- cpt = 0
- Do While Not rs.EOF
- cpt = cpt + 1
- If cpt <= 100 Then
- %>
- <tr>
- <%
- For Each el in rs.Fields
- %>
- <td><%=el.Value%></td>
- <%
- Next
- %>
- </tr>
- <%
- End If
- rs.MoveNext
- Loop
- If cpt > 100 Then
- %>
- <tr>
- <th colspan="<%=rs.Fields.Count%>"><%=cpt%> élé au total</th>
- </tr>
- <%
- End If
- %>
- </table>
- <a href="procrunner.asp">Autre requête</a>
- <%
- rs.Close
- Set rs = Nothing
- Set cmd = Nothing
- cnx.Close
- Set cnx = Nothing
- End If
- fVal(1) = CSng( timer )
- %>
- <p>Duré totale : <%=(fVal(1) - fVal(0))%> secondes.</p>
- </body>
- </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 ? |