【问题标题】:C# sql select query string with parameters [duplicate]C# sql选择带参数的查询字符串[重复]
【发布时间】:2016-05-23 09:01:30
【问题描述】:

我想选择所有与 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.Data.dll 中出现“System.InvalidOperationException”类型的未处理异常 附加信息:不存在数据时尝试读取无效。

似乎@Id 永远不会随着查询字符串中的实际参数而改变。

谁能指出我? 谢谢。

【问题讨论】:

  • 除了下面的答案之外,您还要执行两次查询,一次是使用command.ExecuteNonQuery();,一次是使用command.ExecuteReader()
  • 下次先用谷歌搜索你的错误信息;)
  • @TimSchmelter 我明白错误的含义。

标签: c# sql query-parameters


【解决方案1】:

创建阅读器后你需要告诉Read

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

也就是说,如果您希望阅读器返回多行 - 如果只返回 1 行,则使用 if 就足够了:

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

你也不需要这一行:

command.ExecuteNonQuery();

它会导致您的查询被执行并且结果被忽略。要读取数据,只需 ExecuteDataReader

【讨论】:

    【解决方案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();,删除它。

    【讨论】:

      【解决方案3】:

      你不见了:

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

      【讨论】:

        【解决方案4】:

        你错过了: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();
                }
            }
        }
        

        【讨论】:

          猜你喜欢
          • 2021-11-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-01-11
          • 1970-01-01
          • 2011-12-11
          相关资源
          最近更新 更多