У меня есть эта строка ниже, дающая мне ошибку на мой заголовок.NullReferenceException, но нет нулей
dtDetail = SQLQuery.getRequestDetails(reqNo, vendorcode);
Но я проверял, dtDetail
не равно нулю, reqNo
не равно нулю, vendorCode
не равно нулю, и я из идеи.
logger.Debug("request#: " + reqNo);
logger.Debug("vendor code: " + vendorcode);
System.Data.DataTable dtDetail = new System.Data.DataTable();
if (dtDetail == null)
logger.Debug("dtDetail is null.");
if (SQLQuery.getRequestDetails(reqNo, vendorcode) == null)
logger.Debug("SQLQuery.getRequestDetails(reqNo, vendorcode) is null.");
dtDetail = SQLQuery.getRequestDetails(reqNo, vendorcode);
Я испытал SQLQuery.getRequestDetails(reqNo, vendorcode)
используя reqNo
и vendorCode
я получаю от logger.Debug
, не являются исключением там.
Все испытания проводятся на моем локальном ПК, но подключаются к производственной базе данных. Windows 7 Pro Service Pack 1.
Тот, который дал мне ошибку в производственной среде, под управлением Windows XP Pro 2002 Service Pack 3.
Ниже SQLQuery класс.
public static class SQLQuery
{
private static ILog logger = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
public static DataTable getRequestDetails(string reqNo, string vendorcode)
{
DataSet ds = new DataSet();
string strSQL = string.Empty;
ATSSPCommon.SQLDB myDB = null;
string ret = string.Empty;
try
{
string strConnectionString = Config.DrawingConnString();
myDB = new ATSSPCommon.SQLDB(strConnectionString);
strSQL = " SELECT * FROM vw_drawing_req_status WHERE regno = '" + reqNo + "'" + " AND vendorcode = '" + vendorcode + "'";
ds = myDB.GetDataSet(strSQL);
}
catch (Exception ex)
{
logger.Error("request#: " + reqNo + ", vendor code: " + vendorcode, ex);
throw ex;
}
finally
{
}
if (ds.Tables[0].Rows.Count > 0)
return ds.Tables[0];
else
return null;
}
public static DataTable getRFQDetail(string reqNo, string vendorcode)
{
DataSet ds;
string strSQL = string.Empty;
ATSSPCommon.SQLDB myDB = null;
string ret = string.Empty;
try
{
string strConnectionString = Config.DrawingConnString();
myDB = new ATSSPCommon.SQLDB(strConnectionString);
strSQL = " SELECT * FROM t_RFQ_info WHERE regno = '" + reqNo + "'" +
"AND vendor_code = '" + vendorcode + "'";
ds = myDB.GetDataSet(strSQL);
}
catch (Exception ex)
{
throw ex;
}
finally
{
}
if (ds.Tables[0].Rows.Count > 0)
return ds.Tables[0];
else
return null;
}
public static DataTable getVendorEmailAddress(string comp_code, string vendorcode)
{
DataSet ds;
string strSQL = string.Empty;
ATSSPCommon.SQLDB myDB = null;
string ret = string.Empty;
try
{
string strConnectionString = Config.DrawingConnString();
myDB = new ATSSPCommon.SQLDB(strConnectionString);
strSQL = " SELECT * FROM t_vendor_email WHERE comp_code = '" + comp_code + "'" +
"AND vendor = '" + vendorcode + "' AND status = 1";
ds = myDB.GetDataSet(strSQL);
}
catch (Exception ex)
{
throw ex;
}
finally
{
}
return ds.Tables[0];
}
public static string getModuleNumber(string reqNo)
{
DataSet ds;
string strSQL = string.Empty;
ATSSPCommon.SQLDB myDB = null;
string ret = string.Empty;
try
{
string strConnectionString = Config.DrawingConnString();
myDB = new ATSSPCommon.SQLDB(strConnectionString);
strSQL = " SELECT moduleno FROM subconjobQ WHERE regno = '" + reqNo + "'";
ret = myDB.GetOneValue(strSQL).ToString();
}
catch (Exception ex)
{
throw ex;
}
finally
{
}
return ret;
}
public static string getPlant(string reqNo)
{
DataSet ds;
string strSQL = string.Empty;
ATSSPCommon.SQLDB myDB = null;
string ret = string.Empty;
try
{
string strConnectionString = Config.DrawingConnString();
myDB = new ATSSPCommon.SQLDB(strConnectionString);
strSQL = " SELECT plant FROM subconjobQ WHERE regno = '" + reqNo + "'";
ret = myDB.GetOneValue(strSQL).ToString();
}
catch (Exception ex)
{
throw ex;
}
finally
{
}
return ret;
}
public static string getVendorCurrency(string plant, string vendorcode)
{
DataSet ds;
string strSQL = string.Empty;
ATSSPCommon.SQLDB myDB = null;
string ret = string.Empty;
try
{
string strConnectionString = Config.DrawingConnString();
myDB = new ATSSPCommon.SQLDB(strConnectionString);
strSQL = " SELECT currency FROM t_vendor_info WHERE plant = '" + plant + "'" +
"AND vendor = '" + vendorcode + "' AND status = 1";
ret = myDB.GetOneValue(strSQL).ToString();
}
catch (Exception ex)
{
throw ex;
}
finally
{
}
return ret;
}
public static void updateRFQTable(string regno, string vendor, string partno, string currency, double procCost, double rawCost, double treatCost, double unitPrice, string leadTime)
{
string strSQL = string.Empty;
ATSSPCommon.SQLDB myDB = null;
string ret = string.Empty;
try
{
string strConnectionString = Config.DrawingConnString();
myDB = new ATSSPCommon.SQLDB(strConnectionString);
strSQL = " UPDATE t_RFQ_info SET " +
"currency = '" + currency + "', " +
"process_cost = " + procCost + ", " +
"rawmat_cost = " + rawCost + ", " +
"treatment_cost = " + treatCost + ", " +
"unit_price = " + unitPrice + ", " +
"lead_time = '" + leadTime.Trim() + "', " +
"status = 1 " +
"WHERE Regno = '" + regno + "' AND " +
"vendor_code = '" + vendor + "' AND " +
"partno = '" + partno + "'";
myDB.ExecuteSQL(strSQL);
}
catch (Exception ex)
{
throw ex;
}
finally
{
}
}
}
Я даже пошел и написал новую функцию, но также дал мне такую же ошибку в производственной среде. сообщение
class RFQHandler
{
public static DataTable GetRequestDetail(string requestNumber, string vendorCode)
{
string connectionString = Config.DrawingConnString();
SqlConnection sqlConnection = new SqlConnection(connectionString);
string commandText = "SELECT * FROM vw_drawing_req_status WHERE regno = @requestNumber AND vendorcode = @vendorCode";
SqlCommand sqlCommand = new SqlCommand(commandText, sqlConnection);
sqlCommand.Parameters.Add("@requestNumber", SqlDbType.Char, 12).Value = requestNumber;
sqlCommand.Parameters.Add("@vendorCode", SqlDbType.VarChar, 25).Value = vendorCode;
DataTable requestDetail = new DataTable();
using (sqlConnection)
using (sqlCommand)
{
sqlConnection.Open();
using (SqlDataReader sqlDataReader = sqlCommand.ExecuteReader())
{
requestDetail.Load(sqlDataReader);
}
}
return requestDetail;
}
}
Ошибка вошли:
2017-01-18 15: 30: 53303 [1] ОШИБКА DrawingRequestEmail.Util [(нуль)] - ReceiveEmail System.NullReferenceException: Ссылка на объект не указывает к экземпляру объекта. в DrawingRequestEmail.Email.ProcessEmailFromSubconSystem (сообщение MailItem) в D: \ TFS \ SERVER \ Logistics \ Main \ MM \ DrawingRequest \ DrawingRequestEmail \ DrawingRequestEmail \ Email.cs: строка 155 в DrawingRequestEmail.Util.ReceiveEmail() в D: \ TFS \ SERVER \ Логистика \ Main \ MM \ DrawingRequest \ DrawingRequestEmail \ DrawingRequestEmail \ Util.cs: строка 123
Util.cs: линия 123
ret = email.ProcessEmailFromSubconSystem(oMessage);
Email.cs: линия 155
dtDetail = SQLQuery.getRequestDetails(reqNo, vendorcode);
Не могли бы вы устранить ненужные коды и включить только тот блок, который вызывает исключение. –
Замените все эти «выкидывания ex'-команд только« throw »... [вы испортили трассировку стека, которые он сообщает] (http://stackoverflow.com/questions/730250/is-there-a-difference-between-throw-and-throw-ex). Еще лучше удалите все эти блоки try/catch/finally, потому что они ничего не делают - поведение по умолчанию заключается в том, чтобы в любом случае исключить исключение из вызывающего метода. –
Поместите некоторые точки останова в свой метод 'getRequestDetails' и пройдите через него во время его запуска. Что-то в этом методе должно вызывать исключение. –