2010-04-22 6 views
2

J'ai un contrôleur de travail pour une autre procédure stockée dans la base de données, mais j'essaie de tester un autre.Appel de procédure stockée avec paramètres dans ASP.NET MVC

Lorsque je demande l'URL;

http://host.com/Map?minLat=0&maxLat=50&minLng=0&maxLng=50

Je reçois le message d'erreur suivant, ce qui est compréhensible, mais je ne peux pas sembler trouver pourquoi il se produit;

Procédure ou fonction 'esp_GetPlacesWithinGeoSpan' attend paramètre '@MinLat', qui n'a pas été fourni .

Ceci est le code que j'utilise.

using System; 
    using System.Collections.Generic; 
    using System.Linq; 
    using System.Web; 
    using System.Web.Mvc; 
    using System.Web.Mvc.Ajax; 
    using System.Data; 
    using System.Text; 
    using System.Data.SqlClient; 

namespace prototype.Controllers 
{ 
    public class MapController : Controller 
    { 
     //Initial variable definitions 
     //Array with chars to be used with the Trim() methods 
     char[] lastComma = { ',' }; 

     //Minimum and maximum lat/longs for queries 
     float _minLat; 
     float _maxLat; 
     float _minLng; 
     float _maxLng; 


     //Creates stringbuilder object to store SQL results 
     StringBuilder json = new StringBuilder(); 

     //Defines which SQL-server to connect to, which database, and which user 
     SqlConnection con = new SqlConnection(...connection string here...); 

     // 
     // HTTP-GET: /Map/ 

     public string CallProcedure_getPlaces(float minLat, float maxLat, float minLng, float maxLng) 
     { 
      con.Open(); 

      using (SqlCommand cmd = new SqlCommand("esp_GetPlacesWithinGeoSpan", con)) 
      { 
       cmd.CommandType = CommandType.Text; 
       cmd.Parameters.AddWithValue("@MinLat", _minLat); 
       cmd.Parameters.AddWithValue("@MaxLat", _maxLat); 
       cmd.Parameters.AddWithValue("@MinLng", _minLng); 
       cmd.Parameters.AddWithValue("@MaxLng", _maxLng); 


       using (SqlDataReader reader = cmd.ExecuteReader()) 
       { 
        while (reader.Read()) 
        { 
         json.AppendFormat("\"{0}\":{{\"c\":{1},\"f\":{2}}},", reader["PlaceID"], reader["PlaceName"], reader["SquareID"]); 
        } 
       } 
       con.Close(); 
      } 
      return "{" + json.ToString().TrimEnd(lastComma) + "}"; 
     } 


     //http://host.com/Map?minLat=0&maxLat=50&minLng=0&maxLng=50 
     public ActionResult Index(float minLat, float maxLat, float minLng, float maxLng) 
     { 
      _minLat = minLat; 
      _maxLat = maxLat; 
      _minLng = minLng; 
      _maxLng = maxLng; 

      return Content(CallProcedure_getPlaces(_minLat, _maxLat, _minLng, _maxLng)); 
     } 
    } 
} 

Une aide pour résoudre ce problème serait grandement appréciée.

+3

En passant, vous ne devriez vraiment pas accéder aux données dans vos contrôleurs. Cela est mieux réalisé en utilisant une autre couche, telle qu'un référentiel. –

+0

Pourriez-vous développer cela? Ou peut-être me montrer un exemple? Je ne suis pas très familier avec asp.net du tout, je pensais juste que c'était une façon simple et donc décente de le faire. J'aimerais apprendre. – cc0

+0

@ cc0 Voici un excellent exemple d'utilisation d'ADO.net (SqlConnection) avec un référentiel dans MVC: http://stackoverflow.com/a/6694195/555798 – MikeTeeVee

Répondre

3

Votre CommandType est erronée. Il devrait être:

cmd.CommandType = CommandType.StoredProcedure; 

Puisque vous utilisez CommandType.Text, je pense serait que ADO.NET tente de cartographier les paramètres dans le texte de la requête plutôt que de générer l'appel propre à la procédure stockée.

+0

Awesome! Lol. Je ne peux pas croire que j'ai raté ça! J'utilisais le texte pour tester avant d'avoir créé la procédure. Merci! Hoquet mental là-bas. – cc0

+0

@ cc0 Pas de problème. –

1

Si vous souhaitez passer les paramètres en utilisant le type de texte

CommandType.Text 

alors vous devez passer les paramètres comme ceci:

GetPlacesWithinGeoSpan @MinLat, @MaxLat, @MinLng, @MaxLng 

Parce que la façon que vous le faites son comme vos paramètres de passage, mais il ne correspond pas à quoi que ce soit donc c'est ignoré.

En espérant que ça aide

Questions connexes