我遇到了在多线程程序上抛出间歇性异常的问题。 这些异常来自对OracleCommand.ExecuteScalar的调用。 使用的查询是count(*),因此无法返回null。
这是调用ExecuteScalar的C#代码。
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