【问题标题】:The variable name '@ID' has already been declared. Variable names must be unique within a query batch or stored procedure变量名称“@ID”已被声明。变量名称在查询批处理或存储过程中必须是唯一的
【发布时间】:2019-04-26 23:07:27
【问题描述】:

我已经建立了一个搜索功能,将通过 ID 和姓氏进行搜索。

这是我目前的代码:

SqlCommand cmd = new SqlCommand("SELECT [ID],[Name],[LastName],[FirstName],[FinalGrade] FROM DATABASE WHERE ID = @ID OR LastName = @lname");

using (SqlConnection con = new SqlConnection(conString))
{
    cmd.Connection = con;
    con.Open();

    cmd.Parameters.AddWithValue("@ID", ID);
    cmd.Parameters.AddWithValue("lname",lname);

    /*if (ID == null)
    {
        unitsParam.Value = DBNull.Value;
    }*/

    if(String.IsNullOrEmpty(ID))
    {
        cmd.Parameters.AddWithValue("@ID", DBNull.Value);
    }

    if (String.IsNullOrEmpty(lname))
    {
        cmd.Parameters.AddWithValue("@lname", DBNull.Value);
    }

    using (SqlDataReader sdr = cmd.ExecuteReader())
        if (sdr.HasRows)
        {
            while (sdr.Read())
            {
                int i = 0;

                // vm.SearchResults.Add(new ApqcrDirSearch
                ApqcrDirModel aRec = new ApqcrDirModel();

                aRec.ID = sdr.IsDBNull(i) ? null : sdr.GetString(i);
                i++;

                aRec.Name = sdr.IsDBNull(i) ? null : sdr.GetString(i);
                i++;

                aRec.LastName = sdr.IsDBNull(i) ? null : sdr.GetString(i);
                i++;

                aRec.FirstName = sdr.IsDBNull(i) ? null : sdr.GetString(i);
                i++;

                vm.SearchResults.Add(aRec);
            }
        }

        con.Close();
}

如何同时按 ID 和 LastName 进行搜索?我必须使用SqlCommandParameter 吗?如果是,如何?

【问题讨论】:

    标签: sql-server sqlcommand


    【解决方案1】:

    您添加了两次参数。不要使用AddWithValue,而是使用Add,然后您可以检查IDName 是否为空或为空,如下所示:

    cmd.Parameters.Add("@ID", SqlDbType.VarChar)
        .Value = string.IsNullOrEmpty(ID) ? (object)DBNull.Value : ID;
    
    cmd.Parameters.Add("@lname", SqlDbType.VarChar)
        .Value = string.IsNullOrEmpty(lname) ? (object)DBNull.Value : lname;
    

    注意:我猜VarChar,可能是不同的类型。

    【讨论】:

      【解决方案2】:

      您收到错误消息的原因:"The variable name '@ID' has already been declared. Variable names must be unique within a query batch or stored procedure" 是因为您要声明参数@ID 两次。您还声明了两次 @lname 参数。从您的方法中删除以下代码,错误不应再次出现:

      if(String.IsNullOrEmpty(ID))
      {
          cmd.Parameters.AddWithValue("@ID", DBNull.Value);
      }
      
      if (String.IsNullOrEmpty(lname))
      {
          cmd.Parameters.AddWithValue("@lname", DBNull.Value);
      }
      

      上面的代码实现起来没有意义。在输入方法之前,您应该检查 lastname 和 id 参数是否为空。把它想象成输入验证。

      【讨论】:

      • 我删除了那部分代码,现在它给了我这个错误:参数化查询'(@ID nvarchar(4000),@lname nvarchar(4000))SELECT [ID],[Name], [La' 需要参数“@ID”,但未提供。
      【解决方案3】:

      可以使用

      cmd.Parameters.Clear();
      

      con.Open(); 之后

      其他参数会清零

      【讨论】:

        猜你喜欢
        • 2020-02-01
        • 2015-05-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-20
        • 2020-08-23
        相关资源
        最近更新 更多