【问题标题】:The parameterized query '(@FirstName nvarchar(4000))select * from tblEm where FirstName=@' expects the parameter '@FirstName', which was not supplied参数化查询 '(@FirstName nvarchar(4000))select * from tblEm where FirstName=@' 需要参数 '@FirstName',但未提供该参数
【发布时间】:2015-12-27 07:28:19
【问题描述】:

我在执行附加代码时遇到异常。请帮忙。我已成功从 ajax 调用中获取发布的数据,但无法使用 ado.net 执行选择操作。我正在用这个问题附加控制器代码。附加图像

控制器代码:-

public ActionResult notCk_Pk(String FirstName,String LastName,int? Salary,String Gender)
        {

            List<Counting> l = new List<Counting>();
            //String FirstName = FirstName;
            //String LastName = LastName;
            //int Salary = Salary;
            //String Gender = Gender;

                string query = "select * from tblEm where FirstName=@FirstName";
                string ConnectionString = ConfigurationManager.ConnectionStrings["EmployeeContext"].ConnectionString;
                SqlDataAdapter da;
                DataSet ds = new DataSet();
                using (SqlConnection connection = new SqlConnection("data source=.; database=Srivatsava; integrated security=SSPI"))
                {
                    using (SqlCommand cmd = new SqlCommand(query, connection))
                    {
                        cmd.Parameters.AddWithValue("@FirstName",FirstName);
                        //if (String.IsNullOrEmpty(n.FirstName))
                        //{
                        //    cmd.Parameters.AddWithValue("@FirstName", DBNull.Value);
                        //}
                        connection.Open();
                        Object o=cmd.ExecuteScalar();
                        if (o != null)
                        {
                            string city = o.ToString(); 
                        }
                        connection.Close();
                    }
                }
                da = new SqlDataAdapter(query, ConnectionString);
                da.Fill(ds);
                foreach (DataRow dr in ds.Tables[0].Rows)
                {
                    l.Add(new Counting() { FirstNamecount = Convert.ToInt32(dr[0]), LastNamecount = Convert.ToInt32(dr[1]), Salary = Convert.ToInt32(dr[2]), Gendercount = Convert.ToInt32(dr[3]) });
                }



            var todoListsResults = l.Select(
                  a => new
                  {

                      a.FirstNamecount,
                      a.LastNamecount,
                      a.Salary,
                      a.Gendercount

                  });

            var jsonData = new
            {
                //   total = totalPages,
                // page,
                //records = totalRecords,
                rows = todoListsResults
            };
            return Json(jsonData, JsonRequestBehavior.AllowGet);




        }

【问题讨论】:

  • 但是我的代码在这个语句 cmd.ExecuteNonQuery();
  • 对不起,忘了说,我用 ExecuteNonQuery() 替换了 ExecuteScalar
  • 那更糟 - ExecuteNonQuery() 用于像 INSERTUPDATEDELETE 这样返回的操作任何数据——你肯定想返回数据。
  • 好的。实际上我正在通过 ajax 调用向上述控制器方法发布数据。是这个错误的原因吗?
  • 查看我的回复 - 我已尝试解决您遇到的所有问题

标签: c# jquery asp.net-mvc ado.net asp.net-ajax


【解决方案1】:

如果你想填充一个DataTable(绝对不需要使用DataSet,如果你只得到一个表,并且没有关系) - 然后使用这个代码:

public ActionResult notCk_Pk(String FirstName, String LastName, int? Salary, String Gender)
{
    List<Counting> l = new List<Counting>();

    string query = "select * from tblEm where FirstName = @FirstName";
    string ConnectionString = ConfigurationManager.ConnectionStrings["EmployeeContext"].ConnectionString;

    -- set up and connection and command in "using"        
    using (SqlConnection connection = new SqlConnection(ConnectionString))
    using (SqlCommand cmd = new SqlCommand(query, connection))
    {
        -- define parameter - don't use "AddWithValue"
        cmd.Parameters.Add("@FirstName", SqlDbType.VarChar, 100).Value = FirstName;

        -- define data adapter and use the *existing* "cmd"   
        SqlDataAdapter da = new SqlDataAdapter(cmd);

        -- fill a DataTable since you only get data from a single table
        DataTable dt = new DataTable();

        da.Fill(dt);

        foreach (DataRow dr in dt.Rows)
        {
            l.Add(new Counting() { FirstNamecount = Convert.ToInt32(dr[0]), 
                                   LastNamecount = Convert.ToInt32(dr[1]), 
                                   Salary = Convert.ToInt32(dr[2]), 
                                   Gendercount = Convert.ToInt32(dr[3]) 
                                 });
        }
    }

    var todoListsResults = l.Select(
      a => new
      {

          a.FirstNamecount,
          a.LastNamecount,
          a.Salary,
          a.Gendercount

      });

    var jsonData = new
        {
            rows = todoListsResults
        };

    return Json(jsonData, JsonRequestBehavior.AllowGet);
}

我改进的点:

  • 使用ConnectionString,如果你获取它 - 不要从配置中获取连接字符串,然后使用硬编码字符串代替......
  • 删除了不必要的、毫无意义的 .ExecuteNonQuery().ExecuteScalar() 调用
  • 使用预先存在的SqlCommand cmd 创建SqlDataAdapter 以使用该命令已经设置的连接和参数!
  • 使用.Add() 调用定义参数 - 不是 .AddWithValues()(请查看这篇文章Can we stop using AddWithValue() already? 了解为什么 - 它可能会导致意外和令人惊讶结果...)

【讨论】:

  • 我为实例 ds 声明了 DataSet。我收到错误现在必须声明标量变量“@FirstName”。
  • @Baji:正如我所说,你不需要DataSet - 一个DataTable 就可以了,而且同样好。有不必要的开销没有意义.....
  • 是的,我同意你的观点,但它在 da.fill(ds) 行中指向错误。
  • 同样的错误必须声明标量变量“@FirstName”。
  • 抱歉,我真的不知道出了什么问题 - 代码在我的测试机器上运行很好。你真的没有改变我的代码,还是你调整了它?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-08-02
相关资源
最近更新 更多