С# sql выберите строку запроса с параметрами

Я хотел бы выбрать все строки, в которых артиклиды совпадают, а идентификатор - это определенный интервал. Это мой код:

public CZaposleni ucitajZaposlenog(int idZap)
    {
        CZaposleni zap = new CZaposleni();
        string queryString =
            "SELECT zap.ZapId, zap.SifraRadnika, zap.Ime, zap.Prezime, zap.Pol, zap.JMBG, zap.BrKnjizice, zap.StrucnaSprema, zap.DatumRodjenja, zap.DatumRodjenja, zap.DatumZaposlenja, zap.MestoRodjenja, zap.Prebivaliste, zap.Kontakt1, zap.Kontakt2, " +
            "rad.RmId, rad.Naziv, rad.Sifra " +
            "FROM T_Zaposleni zap, T_RadnaMesta rad " +
            "WHERE zap.ZapId = @Id AND zap.RadnoMestoId = rad.RmId;";
        using (SqlConnection connection = new SqlConnection(_connectionString))
        {
            SqlCommand command = connection.CreateCommand();
            command.CommandText = queryString;
            command.Parameters.Add(new SqlParameter("@Id", idZap));
            connection.Open();

            command.ExecuteNonQuery();

            using (SqlDataReader reader = command.ExecuteReader())
            {
                    zap = new CZaposleni();
                    zap.Sifra = reader["SifraRadnika"].ToString();
                    zap.Ime = reader["Ime"].ToString();
                    zap.Prezime = reader["Prezime"].ToString();
                    zap.Pol = Char.Parse(reader["Pol"].ToString());
                    zap.JMBG = reader["JMBG"].ToString();
                    zap.Brknjizice = reader["BrKnjizice"].ToString();
                    zap.SS = reader["StrucnaSprema"].ToString();
                    zap.DatumR = DateTime.Parse(reader["DatumRodjenja"].ToString());
                    zap.DatumZ = DateTime.Parse(reader["DatumZaposlenja"].ToString());
                    zap.Mestorodj = reader["MestoRodjenja"].ToString();
                    zap.Prebivaliste = reader["Prebivaliste"].ToString();
                    zap.Kontakt1 = reader["Kontakt1"].ToString();
                    zap.Kontakt2 = reader["Kontakt2"].ToString();
                    zap.Radnomesto = new CRadnaMesta();
                    zap.Radnomesto.ID = Int32.Parse(reader["RmId"].ToString());
                    zap.Radnomesto.Naziv = reader["Naziv"].ToString();

            }

        }



        return zap;
    }

Я получаю эту ошибку:

Произошло необработанное исключение типа «System.InvalidOperationException» в System.Data.dll. Дополнительная информация: недопустимая попытка чтения при отсутствии данных.

Кажется, что @Id никогда не меняется с фактическим параметром в строке запроса.

Может ли кто-нибудь указать мне? Спасибо.


person Morsus    schedule 23.05.2016    source источник
comment
В дополнение к ответам ниже вы также дважды выполняете запрос, как с command.ExecuteNonQuery();, так и снова с command.ExecuteReader()   -  person Fermin    schedule 23.05.2016
comment
В следующий раз сначала погуглите свое сообщение об ошибке;)   -  person Tim Schmelter    schedule 23.05.2016
comment
@TimSchmelter Я понимаю, что означает ошибка.   -  person Morsus    schedule 23.05.2016


Ответы (4)


После создания читалки нужно сообщить об этом Read

using (SqlDataReader reader = command.ExecuteReader())
{
   while(reader.Read())
   {
      .....
   }
}

То есть, если вы ожидаете, что ваш читатель вернет несколько строк - если когда-либо будет возвращена только 1 строка, достаточно использовать if:

using (SqlDataReader reader = command.ExecuteReader())
{
   if(reader.Read())
   {
      .....
   }
}

Также вам не нужна эта строка:

command.ExecuteNonQuery();

Это приводит к тому, что ваш запрос выполняется, а результаты игнорируются. Для чтения данных необходима только строка ExecuteDataReader

person Jamiec    schedule 23.05.2016

Вам нужно использовать reader.Read() для перехода к следующей записи.

using (SqlDataReader reader = command.ExecuteReader())
{
    if(reader.Read()) //Assuming you have only one record else use loop.
    {
        zap = new CZaposleni();
        zap.Sifra = reader["SifraRadnika"].ToString();
        zap.Ime = reader["Ime"].ToString();
        zap.Prezime = reader["Prezime"].ToString();
        zap.Pol = Char.Parse(reader["Pol"].ToString());
        zap.JMBG = reader["JMBG"].ToString();
        zap.Brknjizice = reader["BrKnjizice"].ToString();
        zap.SS = reader["StrucnaSprema"].ToString();
        zap.DatumR = DateTime.Parse(reader["DatumRodjenja"].ToString());
        zap.DatumZ = DateTime.Parse(reader["DatumZaposlenja"].ToString());
        zap.Mestorodj = reader["MestoRodjenja"].ToString();
        zap.Prebivaliste = reader["Prebivaliste"].ToString();
        zap.Kontakt1 = reader["Kontakt1"].ToString();
        zap.Kontakt2 = reader["Kontakt2"].ToString();
        zap.Radnomesto = new CRadnaMesta();
        zap.Radnomesto.ID = Int32.Parse(reader["RmId"].ToString());
        zap.Radnomesto.Naziv = reader["Naziv"].ToString();
    }
}

Также вам не требуется command.ExecuteNonQuery();, удалите его.

person Hari Prasad    schedule 23.05.2016

Ты пропускаешь:

using (SqlDataReader reader = command.ExecuteReader())
{
  while (reader.Read()) //This line
  {
    zap = new CZaposleni();
    zap.Sifra = reader["SifraRadnika"].ToString();
    zap.Ime = reader["Ime"].ToString();
    zap.Prezime = reader["Prezime"].ToString();
    zap.Pol = Char.Parse(reader["Pol"].ToString());
    zap.JMBG = reader["JMBG"].ToString();
    zap.Brknjizice = reader["BrKnjizice"].ToString();
    zap.SS = reader["StrucnaSprema"].ToString();
    zap.DatumR = DateTime.Parse(reader["DatumRodjenja"].ToString());
    zap.DatumZ = DateTime.Parse(reader["DatumZaposlenja"].ToString());
    zap.Mestorodj = reader["MestoRodjenja"].ToString();
    zap.Prebivaliste = reader["Prebivaliste"].ToString();
    zap.Kontakt1 = reader["Kontakt1"].ToString();
    zap.Kontakt2 = reader["Kontakt2"].ToString();
    zap.Radnomesto = new CRadnaMesta();
    zap.Radnomesto.ID = Int32.Parse(reader["RmId"].ToString());
    zap.Radnomesto.Naziv = reader["Naziv"].ToString();
}
person Jeremy Thompson    schedule 23.05.2016

Вы пропустили: Метод SqlDataReader.Read()

Это должно быть так:

using (SqlDataReader reader = command.ExecuteReader())
{
    if (reader.HasRows)
    {
        while (reader.Read())
        {
            zap = new CZaposleni();
            zap.Sifra = reader["SifraRadnika"].ToString();
            zap.Ime = reader["Ime"].ToString();
            zap.Prezime = reader["Prezime"].ToString();
            zap.Pol = Char.Parse(reader["Pol"].ToString());
            zap.JMBG = reader["JMBG"].ToString();
            zap.Brknjizice = reader["BrKnjizice"].ToString();
            zap.SS = reader["StrucnaSprema"].ToString();
            zap.DatumR = DateTime.Parse(reader["DatumRodjenja"].ToString());
            zap.DatumZ = DateTime.Parse(reader["DatumZaposlenja"].ToString());
            zap.Mestorodj = reader["MestoRodjenja"].ToString();
            zap.Prebivaliste = reader["Prebivaliste"].ToString();
            zap.Kontakt1 = reader["Kontakt1"].ToString();
            zap.Kontakt2 = reader["Kontakt2"].ToString();
            zap.Radnomesto = new CRadnaMesta();
            zap.Radnomesto.ID = Int32.Parse(reader["RmId"].ToString());
            zap.Radnomesto.Naziv = reader["Naziv"].ToString();
        }
    }
}
person Vishal Suthar    schedule 23.05.2016