C# AseDataReader引发System.NullReferenceException异常

C# AseDataReader引发System.NullReferenceException异常,c#,sap-ase,C#,Sap Ase,我使用Sybase.AdoNet2.AseClient从控制台C#应用程序访问Sybase ASE数据。不总是这样,但有时我会收到System.NullReferenceException,代码如下 只有一个应用程序启动时,它运行良好,但如果我在我的机器上同时启动10个进程,则会出现此异常 public void Dummy() { List<string> valueList = new List<string>(); AseParameter[] a

我使用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());
    }
}
public void Dummy()
{
列表值列表=新列表();
AseParameter[]arParms=新的AseParameter[1];
arParms[0]=新的asetParameter(“@date”,AseDbType.date);
arParms[0]。Value=Convert.ToDateTime(“1/08/2010”);
ASECOMAND spCommand=新ASECOMAND();
spCommand.CommandType=CommandType.StoredProcess;
spCommand.Connection=连接;
spCommand.CommandText=“MyStoredProcedure”;
spCommand.Parameters.AddRange(arParms);
AseDataReader=spCommand.ExecuteReader();
while(reader.Read())
{
if(读卡器[“MyColumn”]!=DBNull.Value)
valueList.Add(reader[“MyColumn”].ToString());
}
}
它发生在“while(reader.Read())”行中,并具有以下调用堆栈

System.NullReferenceException:对象引用未设置为对象的实例。 位于Sybase.Data.AseClient1.AseDataReader.Read()
位于Sybase.Data.AseClient.AseDataReader.Read()
在Dummy()处


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

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

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

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

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

当然,这是因为spCommand.ExecuteReader返回空值。但不幸的是,我无法找到SysBook联机引用中抛出Null异常的原因。也许可以尝试使用不同的命令行为

差不多

reader.ExecuteReader(CommandBehavior.CloseConnection)

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

当然,这是因为spCommand.ExecuteReader返回空值。但不幸的是,我无法找到SysBook联机引用中抛出Null异常的原因。也许可以尝试使用不同的命令行为

差不多

reader.ExecuteReader(CommandBehavior.CloseConnection)

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

非常感谢您的回答

但是从
spCommand.ExecuteReader()
返回的
reader
不是
null
。从调用堆栈中可以看到,异常发生在
Sybase.Data.AseClient1.AseDataReader.Read()中

以下是我从reflector获得的代码

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
可以作为
true
抛出。但我不太确定这是否是我遇到的例外情况。

非常感谢您的回答

但是从
spCommand.ExecuteReader()
返回的
reader
不是
null
。从调用堆栈中可以看到,异常发生在
Sybase.Data.AseClient1.AseDataReader.Read()中

以下是我从reflector获得的代码

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
可以作为
true
抛出。但不太确定在我的情况下是否抛出异常。

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

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

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

由于奇怪的行为,我们总是需要确定sybase对象的范围,特别是连接对象。无论如何,我不认为sybase LIB是可管理的,因此尽可能明确地清理确实是最佳实践。

这有点像瞎猜,但我会尝试使用以下方法确定对象的范围:

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

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

由于奇怪的行为,我们总是需要确定sybase对象的范围,特别是连接对象。无论如何,我不认为sybase LIB是可以管理的,因此尽可能明确地清理是最好的做法。

这是一个老问题,但由于我偶然发现了这个问题并找到了原因,这里是: 我的读卡器不是空的,但它有“IsClosed=true”,因为在读取数据之前连接已关闭


根据一旦读卡器关闭,您只能调用IsClosed和recordsafected。

这是一个老问题,但由于我偶然发现了这个问题并找到了原因,下面是它: 我的读卡器不是空的,但它有“IsClosed=true”,因为在读取数据之前连接已关闭


根据,一旦读卡器关闭,您只能调用IsClosed和recordsafected。

它发生在“while(reader.Read())”行中,并具有以下调用堆栈。System.NullReferenceException:对象引用未设置为对象的实例。在Sybase.Data.AseClient1.AseDataReader.Read()的Sybase.Data.AseClient.AseDataReader.Read()的Dummy()中,它发生在“while(reader.Read())”行中,并具有以下调用堆栈。System.NullReferenceException:对象引用未设置为对象的实例。位于Sybase.Data.AseClient1.AseDataReader.Read()处的Sybase.Data.AseClient.AseDataReader.Read()处的Dummy()处