Имя переменной '@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();
}

Как искать по идентификатору и фамилии? Должен ли я использовать SqlCommandParameter? Если да, то как?


person User123    schedule 24.11.2018    source источник


Ответы (2)


Вы добавляете свои параметры дважды. Вместо использования AddWithValue используйте Add, а затем вы можете проверить, являются ли ID или Name нулевыми или пустыми, например:

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 может быть другого типа.

person ATC    schedule 24.11.2018

Причина, по которой вы получаете сообщение об ошибке: "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, прежде чем вводить метод. Думайте об этом как о проверке ввода.

person Örvar    schedule 24.11.2018
comment
Я удалил эту часть кода, теперь она дает мне эту ошибку: параметризованный запрос '(@ID nvarchar (4000), @lname nvarchar (4000)) SELECT [ID], [Name], [La' ожидает параметр '@ ID', который не был предоставлен. - person User123; 25.11.2018