System.Data.SqlClient.SqlException:必须声明标量变量“@LocationID”。在MVC中

Dev*_*nde 3 c# datatable

说明:在执行当前 Web 请求期间发生未处理的异常。请查看堆栈跟踪以获取有关错误及其在代码中的来源的更多信息。

异常详细信息:System.Data.SqlClient.SqlException:必须声明标量变量“@LocationID”。

源错误:

第 43 行:第 44 行:conn.Open();第 45 行:
adapter.Fill(dt); 第 46 行:conn.Close(); 第 47 行:

源文件:C:\Users\Dev D\Documents\Visual Studio 2015\Projects\MySafar\MySafar\Models\DBUtility.cs 行:45

Location.cs(模型类)

public class Location
{
        public int LocationID;
        public string LocationName;
        public string PhotoPath;
        public string Details;
        public string CityID;
}        

public int Update()
{
            string query = "UPDATE Location SET LocationName = @LocationName, PhotoPath = @PhotoPath, Details = @Details, CityID = @CityID WHERE LocationID = @LocationID";
            List<SqlParameter> parameters = new List<SqlParameter>();
            parameters.Add(new SqlParameter("@LocationID", this.LocationID));
            parameters.Add(new SqlParameter("@LocationName", this.LocationName));
            parameters.Add(new SqlParameter("@PhotoPath", this.PhotoPath));
            parameters.Add(new SqlParameter("@Details", this.Details));
            parameters.Add(new SqlParameter("@CityID", this.CityID));

            return DBUtility.ModifyData(query, parameters);
}

public bool SelectByPK()
{
            string query = "SELECT * FROM Location WHERE LocationID = @LocationID";
            List<SqlParameter> parameters = new List<SqlParameter>();
            parameters.Add(new SqlParameter("@LocationID", this.LocationID));

            DataTable dt = DBUtility.SelectData(query, parameters);

            if (dt.Rows.Count > 0)
            {
                this.LocationName = dt.Rows[0]["LocationName"].ToString();
                this.PhotoPath = dt.Rows[0]["PhotoPath"].ToString();
                this.Details = dt.Rows[0]["Details"].ToString();
                //this.CityID = Convert.ToInt32(dt.Rows[0]["CityID"]);
                this.CityID = dt.Rows[0]["CityID"].ToString();

                return true;
            }
            else
            {
                return false;
            }
        }
}
Run Code Online (Sandbox Code Playgroud)

在 AdminController 中查看的方法

public ActionResult Location_Edit()
{
            Location l = new Location();
            l.LocationID = Convert.ToInt32(Request.QueryString["ID"]);
            l.SelectByPK();

            return View(l)
}

[HttpPost]
public ActionResult Location_List_Edit()
{
            Location l = new Location();
            l.LocationID = Convert.ToInt32(Request.QueryString["ID"]);
            l.LocationName = Request.Form["LocationName"];
            l.PhotoPath = Request.Form["PhotoPath"];
            l.Details = Request.Form["
            l.CityID = Request.Form["CityID"];

            l.Update();

            return View("Location_List", new DataTable());
}
Run Code Online (Sandbox Code Playgroud)

DBUtility.cs(模型类定义用于修改插入和选择数据的数据库方法)

public static DataTable SelectData(String query, List<SqlParameter> parameter)
{
            SqlConnection conn = new SqlConnection();
            conn.ConnectionString = "Data Source=(LocalDB)\\MSSQLLocalDB;AttachDbFilename=\"C:\\Users\\Dev D\\Documents\\Visual Studio 2015\\Projects\\MySafar\\MySafar\\App_Data\\MySafarDB.mdf\";Integrated Security=True";

            SqlCommand command = new SqlCommand();
            command.Connection = conn;

            command.CommandText = query;

            DataTable dt = new DataTable();
            SqlDataAdapter adapter = new SqlDataAdapter();
            adapter.SelectCommand = command;

            conn.Open();
            adapter.Fill(dt);
            conn.Close();

            return dt;
}
Run Code Online (Sandbox Code Playgroud)

Pra*_*ana 5

你在这个方法上有问题

public static DataTable SelectData(String query, List<SqlParameter> parameter)
Run Code Online (Sandbox Code Playgroud)

您正在传递List<SqlParameter> parameter但未将其添加到command参数列表中。

这就是它给你错误的原因。添加如下所示的参数,在您的方法中添加这行代码。

foreach( var param in  List<SqlParameter> parameter))
  command.Parameters.Add(param);
Run Code Online (Sandbox Code Playgroud)