2017-01-18 17 views
1

У меня есть эта строка ниже, дающая мне ошибку на мой заголовок.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); 
+0

Не могли бы вы устранить ненужные коды и включить только тот блок, который вызывает исключение. –

+1

Замените все эти «выкидывания ex'-команд только« throw »... [вы испортили трассировку стека, которые он сообщает] (http://stackoverflow.com/questions/730250/is-there-a-difference-between-throw-and-throw-ex). Еще лучше удалите все эти блоки try/catch/finally, потому что они ничего не делают - поведение по умолчанию заключается в том, чтобы в любом случае исключить исключение из вызывающего метода. –

+0

Поместите некоторые точки останова в свой метод 'getRequestDetails' и пройдите через него во время его запуска. Что-то в этом методе должно вызывать исключение. –

ответ

0

Возможная ссылка нулевая ошибка, я вижу this-

DataSet ds = new DataSet(); 
    string strSQL = string.Empty; 
    ATSSPCommon.SQLDB myDB = null; 
    string ret = string.Empty; 
    try 
    { 
     ........ 
     ds = myDB.GetDataSet(strSQL); 
    } 
    catch (Exception ex) 
    { 
     .... 
    } 
    finally 
    { 

    } 
    if (ds.Tables[0].Rows.Count > 0) // this could be the error 
     return ds.Tables[0]; 
    else 
     return null; 

Даже если запрос выполняется, нет никакой гарантии, что будет по крайней мере один DataTable внутри этого DataSet, а также DataSet сам может быть пустым. Попробуйте добавить нулевой чек, как это -

if (ds != null && ds.Tables.Any() && ds.Tables[0].Rows.Count > 0) 
     return ds.Tables[0]; 
    else 
     return null; 

Там также не нулевой чек, что после этого заявления -

myDB = new ATSSPCommon.SQLDB(strConnectionString); 

myDB также может быть пустым.

ОБНОВЛЕНИЕ: Для .net 2.0 попробуйте ds.Tables.Count > 0 вместо ds.Tables.Any(), как указано в комментарии.

+0

Я удалил проверку и только 'return ds.Tables [0];' осталось, это все равно дает мне ошибку. – Pop

+0

Это еще нужно проверить. Откуда вы знаете, что есть таблица наверняка? Таблица [0] означает, что у нее есть таблица с индексом 0. –

+0

В моем тестировании (укажите на производственную базу данных) я уже убедился, что мой запрос вернет что-то. Даже мой новый 'GetRequestDetail' без' myDB' и проверки дал мне ту же ошибку. – Pop

0

Я тоже получал исключение NULL и я проследил его до объявления переменной, которое пропускает отладчик, когда я использую «Установить следующее заявление» (Ctrl + Shift + F10).

Например, мой код выглядит следующим образом:

if (false) 
{ 
    classTypeObject myObject; 
    myObject = someValue; 
} 

Если я поставил точку останова на состоянии затем переместите следующий оператор для запуска на открывающую скобку, когда значение myObject установлено я получаю null, поскольку отладчик должен пропустить объявление.

Однако, если изменить код, чтобы быть, как это и сделать то же отладки шаги не проблема:

classTypeObject myObject; 
if (false) 
{ 
    myObject = someValue; 
} 

P.S. Очевидно, что это псевдокод, и вы никогда не захотите жесткого кода if (false).