使用ASP.NET MVC中的参数调用存储过程

时间:2010-04-22 16:13:14

标签: asp.net asp.net-mvc

我有一个工作控制器用于数据库中的另一个存储过程,但我正在尝试测试另一个。

当我请求URL时;

  

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

我收到以下错误消息,这是可以理解的,但我似乎无法找出它发生的原因;

  

程序或功能   'esp_GetPlacesWithinGeoSpan'期待   参数'@MinLat',但不是   提供。

这是我正在使用的代码。

    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));
        }
    }
}

非常感谢任何有关解决此问题的帮助。

2 个答案:

答案 0 :(得分:3)

您的CommandType错了。它应该是:

cmd.CommandType = CommandType.StoredProcedure;

由于您正在使用CommandType.Text,我的猜测是ADO.NET会尝试将参数映射到查询文本中,而不是生成对存储过程的正确调用。

答案 1 :(得分:1)

如果您希望使用文本类型

传递参数
CommandType.Text

然后你应该传递这样的参数:

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

因为你做它的方式就像你的传递参数一样,但它没有映射到任何东西所以它被忽略了。

希望有所帮助