我想选择artiklids匹配的所有行,其中id是特定的int。这是我的代码:
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永远不会被queryString中的实际参数更改。
有人能指出我吗? 感谢。
答案 0 :(得分:3)
创建阅读器后,您需要告诉Read
using (SqlDataReader reader = command.ExecuteReader())
{
while(reader.Read())
{
.....
}
}
如果您希望从阅读器返回多行 - 如果只返回1行,则使用if
就足够了:
using (SqlDataReader reader = command.ExecuteReader())
{
if(reader.Read())
{
.....
}
}
你也不需要这一行:
command.ExecuteNonQuery();
它会导致您的查询被执行并忽略结果。要读取数据,只需要ExecuteDataReader
行
答案 1 :(得分: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();
,请将其删除。
答案 2 :(得分: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 :(得分: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();
}
}
}