System.NullReferenceException, выброшенный AseDataReader - PullRequest
2 голосов
/ 19 августа 2010

Я использую Sybase.AdoNet2.AseClient для доступа к данным Sybase ASE из консольного приложения C #.Не всегда, но время от времени я получаю System.NullReferenceException со следующим кодом.

Хорошо работает только с одним запущенным приложением, но завершается неудачей с этим исключением, если я одновременно запускаю 10 процессов на моей машине.

public void Dummy()
{
    List<string> valueList = new List<string>();

    AseParameter[] arParms = new AseParameter[1];
    arParms[0] = new AseParameter("@date", AseDbType.Date);
    arParms[0].Value = Convert.ToDateTime("1/08/2010");

    AseCommand spCommand = new AseCommand();
    spCommand.CommandType = CommandType.StoredProcedure;
    spCommand.Connection = connection;
    spCommand.CommandText = "MyStoredProcedure";

    spCommand.Parameters.AddRange(arParms);

    AseDataReader reader = spCommand.ExecuteReader();
    while (reader.Read())
    {
        if (reader["MyColumn"] != DBNull.Value)
            valueList.Add(reader["MyColumn"].ToString());
    }
}

Это происходит в строке «while (reader.Read ())» и имеет следующий стек вызовов.

System.NullReferenceException: ссылка на объект не установлена ​​на экземпляробъект.в Sybase.Data.AseClient1.AseDataReader.Read ()
в Sybase.Data.AseClient.AseDataReader.Read ()
в Dummy ()

Буду очень признателен, если кто-нибудь сможет мне помочь.

Ответы [ 5 ]

0 голосов
/ 05 июня 2012

Это старый вопрос, но так как я наткнулся на эту проблему и нашел причину, вот она: Мой читатель не был нулевым, но у него было «IsClosed = true», потому что соединение было закрыто перед чтением данных.

Согласно http://infocenter.sybase.com/help/index.jsp?topic=/com.sybase.help.sdk_12.5.1.adonet/html/adonet/Isclosed_asadatareader_apiref.htm после того, как считыватель закрыт, вы можете вызвать только IsClosed и RecordsActed.

0 голосов
/ 22 августа 2010

Это немного выстрел в темноте, но я бы попробовал определить объем объектов с помощью:странное поведение.В любом случае, я не думаю, что библиотеками sybase управляют, так что это действительно лучшая практика, чтобы очистить явно, где это возможно.

0 голосов
/ 19 августа 2010

Ну, это конечно, потому что spCommand.ExecuteReader возвращает ноль.Но, к сожалению, я не смог выяснить, почему исключение Null выбрасывается в справочнике SysBook Online.Возможно, попробуйте другое поведение командыдостаточно;)

0 голосов
/ 19 августа 2010

Большое спасибо за ответы.

Но reader, возвращаемое из spCommand.ExecuteReader(), не null.Исключение происходит внутри Sybase.Data.AseClient1.AseDataReader.Read(), как вы можете видеть из стека вызовов.

Ниже приведен код, полученный от рефлектора.

public bool Read()
{
  this.OnTraceEnterEvent("Read", null);
  if (this._disposed)
  {
    throw new NullReferenceException();
  }
  if (this.IsClosed)
  {
    throw new AseException(DriverMsgNumber.ERR_RESULTSET_DEAD, null);
  }
  bool state = false;
  if (!this._bNoResultSet)
  {
    state = this.Peform_Next();
    state = this.CheckSingleRow(state);
  }
  this.OnTraceExitEvent("Read", state);
  return state;
}

Я вижу, что может быть выброшен один NullReferenceExceptionс _disposed как true.Но не совсем уверен, что это исключение в моей ситуации.

0 голосов
/ 19 августа 2010

Я предполагаю, что spCommand.ExecuteReader() вместо возврата пустого считывателя возвращает null объект. В этом случае я предлагаю chceck, если он пуст, перед прочтением:

AseDataReader reader = spCommand.ExecuteReader();
if(reader != null)
   while (reader.Read())
   {
        if (reader["MyColumn"] != DBNull.Value)
            valueList.Add(reader["MyColumn"].ToString());
   }
...