我有一个工作控制器用于数据库中的另一个存储过程,但我正在尝试测试另一个。
当我请求URL时;
我收到以下错误消息,这是可以理解的,但我似乎无法找出它发生的原因;
程序或功能 '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));
}
}
}
非常感谢任何有关解决此问题的帮助。
答案 0 :(得分:3)
您的CommandType
错了。它应该是:
cmd.CommandType = CommandType.StoredProcedure;
由于您正在使用CommandType.Text
,我的猜测是ADO.NET会尝试将参数映射到查询文本中,而不是生成对存储过程的正确调用。
答案 1 :(得分:1)
如果您希望使用文本类型
传递参数CommandType.Text
然后你应该传递这样的参数:
GetPlacesWithinGeoSpan @MinLat, @MaxLat, @MinLng, @MaxLng
因为你做它的方式就像你的传递参数一样,但它没有映射到任何东西所以它被忽略了。
希望有所帮助