C# Oracle.ManagedDataAccess.Client ExecuteScalar上引发的NullReferenceException
我在多线程程序上遇到间歇性异常的问题。 这些异常来自对OracleCommand.ExecuteScalar的调用。 使用的查询是计数(*),因此不可能返回null 这是调用ExecuteScalar的C代码C# Oracle.ManagedDataAccess.Client ExecuteScalar上引发的NullReferenceException,c#,oracle,C#,Oracle,我在多线程程序上遇到间歇性异常的问题。 这些异常来自对OracleCommand.ExecuteScalar的调用。 使用的查询是计数(*),因此不可能返回null 这是调用ExecuteScalar的C代码 public bool HasCodUniorgLinkedToREP(long numIdRep) { string strQuery = "select count(*) from tbl_uniorgrep where num_idrep = :p_n
public bool HasCodUniorgLinkedToREP(long numIdRep)
{
string strQuery = "select count(*) from tbl_uniorgrep where num_idrep = :p_num_idrep";
using (OracleCommand oraCmdUniorg = OraLib.CreateCommand(strQuery, oraConn))
{
oraCmdUniorg.Parameters.Add("p_num_idrep", OracleDbType.Decimal, numIdRep, ParameterDirection.Input);
try
{
if (Convert.ToInt32(oraCmdUniorg.ExecuteScalar()) != 0)
return true;
else
return false;
}
catch (Exception ex)
{
Exception e = new Exception("Error Message.", ex);
e.Data.Add("REP ID", numIdRep);
throw e;
}
}
}
此代码引发的异常如下所示:
Exception Info:
Type: System.NullReferenceException
Message: Object reference not set to an instance of an object.
Source: Oracle.ManagedDataAccess
Stack Trace:
at OracleInternal.ServiceObjects.OracleCommandImpl.ExtractAccessorValuesIntoParam(OracleParameterCollection paramColl, OracleConnection connection, Int32 paramCount, String commandText, Int64 longFetchSize, Int64 clientInitialLOBFS, Int64 internalInitialLOBFS, Int64[] scnFromExecution, Boolean bCallFromExecuteReader)
at Oracle.ManagedDataAccess.Client.OracleCommand.ExecuteReader(Boolean requery, Boolean fillRequest, CommandBehavior behavior)
at Oracle.ManagedDataAccess.Client.OracleCommand.ExecuteReader()
at Oracle.ManagedDataAccess.Client.OracleCommand.ExecuteScalar()
at FassiLib.REPCollector.DB.REP.HasCodUniorgLinkedToREP(Int64 numIdRep)
有人知道为什么会抛出此异常吗
有时,它在执行过程中由多个线程抛出。其他时间仅由一个线程执行。
大多数异常执行根本不会抛出
该程序具有批处理行为,每次执行大约创建70个线程
TIA您的连接对象oraConn是否存在,是否实例化并打开?我曾经遇到过类似的问题。OracleCommand的实例方法不能保证线程安全。对它是一个类变量,在类构造函数上创建/实例化/打开。@Edgarochacarvalho,非常有趣。我将用静态方法进行测试。。。忘了我最后的评论吧。ExecuteScalar没有静态版本。我将使用OracleDataAdapter/DataSet重写。