2

我正在使用 Sybase.AdoNet2.AseClient 从控制台 C# 应用程序访问 Sybase ASE 数据。并非总是如此,但有时我会使用以下代码得到 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()

如果有人可以帮助我,将不胜感激。

4

5 回答 5

0

这有点像在黑暗中拍摄,但我会尝试使用以下方法来确定对象的范围:

using (AseCommand spCommand = new AseCommand())
{
     //etc..

     using (AseDataReader reader = spCommand.ExecuteReader())
     {
         // until end of while loop
     }
}

由于奇怪的行为,我们总是需要确定 sybase 对象的范围,尤其是连接对象。在任何情况下,我都不认为 sybase 库是受管理的,因此尽可能明确地进行清理确实是最佳实践。

于 2010-08-22T14:04:41.133 回答
0

我猜spCommand.ExecuteReader()不是返回空的阅读器而是返回null对象。在这种情况下,我建议在阅读之前检查它是否为空:

AseDataReader reader = spCommand.ExecuteReader();
if(reader != null)
   while (reader.Read())
   {
        if (reader["MyColumn"] != DBNull.Value)
            valueList.Add(reader["MyColumn"].ToString());
   }
于 2010-08-19T05:59:36.297 回答
0

这是一个老问题,但由于我偶然发现了这个问题并找到了原因,所以它是:我的阅读器不是空的,但它有“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 和 RecordsAffected。

于 2012-06-05T09:41:09.260 回答
0

这当然是因为 spCommand.ExecuteReader 返回一个空值。但不幸的是,我不知道为什么在 SysBook Online 参考中会引发 Null Exception。也许尝试不同的命令行为

http://infocenter.sybase.com/help/index.jsp?topic=/com.sybase.help.sdk_12.5.1.adonet/html/adonet/Asacommand_apiref.htm

http://msdn.microsoft.com/en-us/library/system.data.commandbehavior.aspx

就像是

reader.ExecuteReader(CommandBehavior.CloseConnection)

或者我认为 ŁukaszW.pl 的回答就足够了;)

于 2010-08-19T06:19:54.707 回答
0

非常感谢您的回答。

reader归来spCommand.ExecuteReader()不是nullSybase.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可以用_disposedas抛出true。但不太确定这是否是在我的情况下引发的异常。

于 2010-08-19T07:09:57.897 回答