C# AseDataReader引发System.NullReferenceException异常
我使用Sybase.AdoNet2.AseClient从控制台C#应用程序访问Sybase ASE数据。不总是这样,但有时我会收到System.NullReferenceException,代码如下 只有一个应用程序启动时,它运行良好,但如果我在我的机器上同时启动10个进程,则会出现此异常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
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()处