sql - tutoriel - Erreur lors de la tentative d'appel de la procédure stockée avec une instruction préparée




tutoriel procédure stockée sql server (2)

J'essaie d'utiliser une instruction préparée pour appeler une procédure stockée (en utilisant ADODB avec ASP classique), mais lorsque je définis CommandType, j'obtiens l'erreur suivante:

Erreur ADODB.Command '800a0bb9'

Les arguments sont du mauvais type, sont hors de portée acceptable, ou sont en conflit les uns avec les autres.

J'ai le code suivant:

With Server.CreateObject("ADODB.Command")
    .ActiveConnection = db 'this is initialized prior
    .CommandType = adCmdStoredProc
    .CommandText = "procName"
End With

Le nom de l'instruction préparée est correct (je suis capable de l'appeler simplement en exécutant la chaîne), et si je laisse de côté le .CommandType et j'essaie d'appeler .Execute, j'obtiens une erreur spécifiant:

La procédure ou la fonction 'procName' attend le paramètre '@ParamName', qui n'a pas été fourni.

Même si je laisse de côté le CommandType, je n'ai aucune idée de la façon d'ajouter réellement le paramètre (quelque chose le long des lignes suivantes résulte juste de l'erreur d'origine concernant les arguments du mauvais type):

.Parameters.Append .CreateParameter("@ParamName",adVarChar,adParamInput,50,param)

J'ai également essayé le suivant et ai eu une erreur "l'article ne peut pas être trouvé dans la collection correspondant au nom ou à l'ordinal demandé."

.Parameters.Refresh
.Parameters(0) = param

J'ai regardé plusieurs exemples de comment appeler des procédures stockées en utilisant des instructions préparées, et il semble que j'utilise la bonne syntaxe, mais tout ce que j'essaie semble aboutir à une sorte d'erreur. Toute aide serait grandement appréciée.


Voici comment vous appelez une procédure stockée dans ASP classic:

'Set the connection
'...............

'Set the command
DIM cmd
SET cmd = Server.CreateObject("ADODB.Command")
SET cmd.ActiveConnection = Connection

'Set the record set
DIM RS
SET RS = Server.CreateObject("ADODB.recordset")

'Prepare the stored procedure
cmd.CommandText = "procName"
cmd.CommandType = 4  'adCmdStoredProc

'Assign value to the parameter
cmd.Parameters("@ParamName ") = ParamValue 

'Execute the stored procedure
RS = cmd.Execute
SET cmd = Nothing

'You can now access the record set
if (not RS.EOF) THEN
    data = RS("column_name")
end if

'dispose your objects
RS.Close
SET RS = Nothing

Connection.Close
SET Connection = Nothing

Vous voulez quelque chose comme ça (non testé)

Dim cmd, rs, ars, conn

Set cmd = Server.CreateObject("ADODB.Command")

With cmd
  'Assuming passing connection string if passing ADODB.Connection object
  'make sure you use Set .ActiveConnection = conn also conn.Open should
  'have been already called.
  .ActiveConnection = conn
  'adCmdStoredProc is Constant value for 4 (include adovbs or 
  'set typelib in global.asa)
  .CommandType = adCmdStoredProc
  .CommandText = "dbo.procName"
  'Define parameters in ordinal order to avoid errors
  Call .Parameters.Append(.CreateParameter("@ParamName", adVarChar, adParamInput, 50))

  'Set values using parameter friendly name
  .Parameters("@ParamName").Value = param

  'Are you returning a recordset?
  Set rs = .Execute()
  'Populate array with data from recordset
  If Not rs.EOF Then ars = rs.GetRows()
  Call rs.Close()
  Set rs = Nothing
End With
Set cmd = Nothing

Il est important de se rappeler que le nom convivial (comme j'ai tendance à faire correspondre mes noms de paramètres dans ma procédure stockée à mes noms conviviaux dans ADO) ne donne rien à la procédure stockée car ADO passe les paramètres normalement et rien de plus , le fait que vous obtenez l'erreur;

La procédure ou la fonction 'procName' attend le paramètre '@ParamName', qui n'a pas été fourni.

Suggère que la procédure stockée s'attend à ce que votre paramètre @ParamName (défini dans votre procédure stockée) soit transmis à ADO dans une autre position ordinale, ce qui signifie généralement que vous n'avez pas défini tous vos paramètres ou transmis toutes les valeurs de paramètre sont attendus.

Vous pouvez également faire une version raccourcie si vous êtes sûr de votre positionnement ordinale et des paramètres requis

With cmd
  .ActiveConnection = conn
  .CommandType = adCmdStoredProc
  .CommandText = "dbo.procName"

  'Pass parameters as array following ordinal position.
  Set rs = .Execute(, Array(param))
  'Populate array with data from recordset
  If Not rs.EOF Then ars = rs.GetRows()
  Call rs.Close()
  Set rs = Nothing
End With
Set cmd = Nothing

Travailler avec un tableau bidimensionnel est facile et annule les frais généraux de travail directement avec un ADODB.Recordset.

Dim row, rows

If IsArray(ars) Then
  rows = UBound(ars, 2)
  For row = 0 To rows
    Response.Write "First column from row " & row & " = " & ars(0, row) & "<br />"
  Next
Else
  Response.Write "No data to return"
End If

Liens







adodb