变量名“ @ID”已经声明。变量名称在查询批处理或存储过程中必须唯一

时间:2018-11-24 20:00:58

标签: sql-server sqlcommand

我建立了一个搜索功能,可以按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和姓氏进行搜索?我必须使用SqlCommandParameter吗?如果是,怎么办?

2 个答案:

答案 0 :(得分: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可能是另一种类型。

答案 1 :(得分:0)

收到错误消息的原因:"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);
}

上面的代码没有实现的意义。输入方法之前,应检查姓和id参数是否为空。将其视为输入验证。