2010-01-12 12 views
1

Je reçois une exception SqlException lors de l'exécution du code suivant. "La procédure ou la fonction 'usp_Search' attend le paramètre '@pxmlSearchOutput', qui n'a pas été fourni."SqlClient Xml Le paramètre de sortie "was not provided"

Mes paramètres + demande.

using (var connection = new SqlConnection(_connectionString)) 
    { 
     using (var command = new SqlCommand("Search.usp_Search", con)) 
     { 

      var pxmlSearchOutput = new SqlParameter(); 
      pxmlSearchOutput.ParameterName = "@pxmlSearchOutput"; 
      pxmlSearchOutput.SqlDbType = SqlDbType.Xml; 
      pxmlSearchOutput.Direction = ParameterDirection.Output; 
      pxmlSearchOutput.Size = 1; 
      command.Parameters.Add(pxmlSearchOutput); 

      var pxmlSearchInput = new SqlParameter(); 
      pxmlSearchInput.ParameterName = "@pxmlSearchInput"; 
      pxmlSearchInput.Value = requestXML;//is valid xml, is a local var 
      pxmlSearchInput.SqlDbType = SqlDbType.Xml; 
      command.Parameters.Add(pxmlSearchInput); 

      var pbitDebug = new SqlParameter(); 
      pbitDebug.Value = false; 
      pbitDebug.ParameterName = "@pbitDebug"; 
      pbitDebug.SqlDbType = SqlDbType.Bit; 
      command.Parameters.Add(pbitDebug); 

      var pintErrorNumber = new SqlParameter(); 
      pintErrorNumber.ParameterName = "@pintErrorNumber"; 
      pintErrorNumber.SqlDbType = SqlDbType.Int; 
      pintErrorNumber.Direction = ParameterDirection.Output; 
      command.Parameters.Add(pintErrorNumber); 

      connection.Open(); 
      command.ExecuteScalar(); 
      connection.Close(); 
     } 
    } 

En utilisant profileur SQL, je peux extraire les éléments suivants:

 declare @p3 xml 
     set @p3=null 
     declare @p4 xml 
     set @p4=convert(xml,'***Redacted - This is however, valid xml, which convert works on happily***') 
     declare @p6 int 
     set @p6=NULL 
     exec 
     sp_executesql 
     N'Search.usp_Search', 
     N'@pxmlSearchOutput xml output,@pxmlSearchInput xml,@pbitDebug bit,@pintErrorNumber int output', 
     @[email protected] output, 
     @[email protected], 
     @pbitDebug=0, 
     @[email protected] output 
     select @p3, @p6 

Je suis incapable de diagnostiquer exactement ce qui ne va pas avec le SQL (et donc, comment il se rapporte au code .net). Des idées?

Répondre

2

Vous exécutez le lot, une requête de type Text:

Search.usp_Search 

Vous faites passer un tas de paramètres à ce lot, mais ce sont tous ignorés car ils ne sont pas réellement utilisés dans le lot lui-même. Vous avez deux alternatives:

  • utiliser les paramètres passés à la charge dans le lot lui-même: var command = new SqlCommand("exec Search.usp_Search @pxmlSearchOutput output, @pxmlSearchInput,@pbitDebug, @pintErrorNumber output", con))
  • Dites ADO.NEt que vous faites un appel RPC, non seulement l'exécution d'un lot: command.CommandType = CommandType.StoredProcedure;

L'un ou l'autre changement fonctionnera (mais pas les deux).

+0

Genius! Merci de votre aide. J'ai ajouté le command.CommandType = STP et tout est doré. – Gregory

+1

Whoops se demandait pourquoi cela ne fonctionnait pas pour moi aussi mais oui bien sûr, avait oublié le type de commande: \ Merci;) – Rabid