2016-05-23 3 views
0

Я хотел бы выбрать все строки, в которых соответствуют артиклиды и где id - определенный int. Это мой код:C# sql select строка запроса с параметрами

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

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

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

Похоже, @Id никогда не будет изменен с фактическим параметром в строке запроса.

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

+2

В дополнение к ответам ниже вы также выполнение запроса в два раза , и с командой 'command.ExecuteNonQuery();' и снова с 'command.ExecuteReader()' – Fermin

+0

В следующий раз сначала ваше сообщение об ошибке google;) –

+0

@TimSchmelter Я понимаю, что означает ошибка. – Morsus

ответ

2

Чтобы перейти к следующей записи, вам необходимо использовать 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();, удалите его.

1

Вы упускаете:

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

После создания ридера вы должны сказать ему, чтобы Read

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

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

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

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

command.ExecuteNonQuery(); 

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

0

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

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

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