0

I would like to select all rows where artiklids match and where id is a specific int. This is my code:

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;
    }

I am getting this error:

An unhandled exception of type 'System.InvalidOperationException' occurred in System.Data.dll Additional information: Invalid attempt to read when no data is present.

It seems like @Id never gets changed with actual parameter in the queryString.

Dharman
  • 30,962
  • 25
  • 85
  • 135
Morsus
  • 107
  • 1
  • 16

4 Answers4

3

After creating a reader you need to tell it to Read

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

That is if you expect multiple rows back from your reader - if there is only ever to be 1 row returned, it is sufficient to use an if:

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

Also you don't need this line:

command.ExecuteNonQuery();

It causes your query to be exectued and the results ignored. For reading the data only the ExecuteDataReader line is necessary

Jamiec
  • 133,658
  • 13
  • 134
  • 193
2

You need to use reader.Read() to advance to next record.

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();
    }
}

Also you don't require command.ExecuteNonQuery();, remove it.

Hari Prasad
  • 16,716
  • 4
  • 21
  • 35
1

You're missing:

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();
}
Jeremy Thompson
  • 61,933
  • 36
  • 195
  • 321
0

You've missed: SqlDataReader.Read Method ()

It should be like this:

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();
        }
    }
}
Vishal Suthar
  • 17,013
  • 3
  • 59
  • 105