OracleDataReader Read (); вернуть false и System.NullReferenceException - PullRequest
0 голосов
/ 20 ноября 2018

Я делал это Мэнни раз, но теперь я получаю сообщение об ошибке, и я не знаю, как это исправить.Переменные не являются нулевыми, они имеют значение;Я пробовал это в БД, и все в порядке, он возвращает 1 строку

List<Partido_E> lista = new List<Partido_E>();

try
{       
    conexion = bd.LeerDeBaseDeDatos();       
    orden = new OracleCommand(
        @"select * from partido 
          where TO_CHAR(fecha, 'DD/MM/YYYY') = :anyo AND 
                equipo_l = :equipol AND 
                equipo_v = :equipov ", conexion);

    orden.Parameters.Add(new OracleParameter("anyo", fecha));
    orden.Parameters.Add(new OracleParameter("equipol", equipoL));
    orden.Parameters.Add(new OracleParameter("equipov", equipoV));
    orden.BindByName = true;

    lector = orden.ExecuteReader();

    while(lector.Read())
    {
        lista.Add(new Partido_E(lector.GetString(0),
                                lector.GetString(1), 
                                lector.GetDateTime(2),
                                lector.GetString(3),
                                lector.GetString(4),
                                lector.IsDBNull(5) ? 0 : lector.GetInt32(5),
                                lector.IsDBNull(6) ? 0 : lector.GetInt32(6),
                                lector.IsDBNull(7) ? 0 : lector.GetInt32(7)
                 ));
    }


    lector.Close();
    lector.Dispose();
    orden.Dispose();

    bd.CerrarConexion();
}
catch (Exception e)
{
    Console.WriteLine("Error " + e.ToString());
    Console.ReadLine();
}

return lista;

1 Ответ

0 голосов
/ 20 ноября 2018

Вот ваша проблема - читайте комментарии

 while (lector.Read())
 {
      // if you never come here, your reader is closed
 }
 lector.Close(); // <-- problem here

Oracle:

Экземпляр OracleDataReader создается путем вызова метода ExecuteReader объекта OracleCommand. Единственными свойствами, к которым можно получить доступ после закрытия или удаления DataReader, являются IsClosed и RecordsActed .

Эта строка lector.Read() не может выдать исключение нулевой ссылки, потому что строка до этого lector = orden.ExecuteReader(); всегда будет возвращать читателя. Если строк нет, он будет закрыт.

Ваш код не очень хорош. должно быть

using (conn = new connection/getconnection)
{
    using (cmd = new command)
    { 
        using (reader = cmd.ExecuteReader)
        {
        } // no need to explicitly dispose/close here
    }
} 
...