C#sql选择带参数

时间:2016-05-23 09:01:31

标签: c# sql query-parameters

我想选择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中的实际参数更改。

有人能指出我吗? 感谢。

4 个答案:

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