2012-12-12 42 views
2

大家好我正在使用存儲的procdure從sql server讀取數據,並且當存在null時,我得到的數據庫中的數據不能將DBNull轉換爲其他類型。我使用.NET MVC3以下是我的代碼:在mscorlib.dll中發生類型'System.InvalidCastException'的第一次機會異常對象不能從DBNull轉換爲其他類型

public static List<XYZFactorsModel> SelectGridItems(string sidx, string sord, int page, int rows, String rid, String process, String detail_table, String jobGroup, String date) 

    { 


     const string spName = "dbo.p___GetXYZMonitorJobDetails"; 
     List<XYZFactorsModel> XYZFactorDetailGridCollection; 

     string connectionString = ConfigurationManager.ConnectionStrings["AdvItemsContext"].ConnectionString; 
     if (string.IsNullOrEmpty(connectionString)) 
      return null; 
     using (SqlConnection sqlConnection = new SqlConnection(connectionString)) 
     { 
      SqlCommand sqlCommand = new SqlCommand(spName, sqlConnection); 
      sqlCommand.CommandType = CommandType.StoredProcedure; 
      //sqlCommand.Parameters.Add("@jobDate", SqlDbType.VarChar); 
      sqlCommand.Parameters.Add("@jobGroup", SqlDbType.VarChar); 
      sqlCommand.Parameters.Add("@jobName", SqlDbType.VarChar); 
      sqlCommand.Parameters.Add("@detailTable", SqlDbType.VarChar); 
      sqlCommand.Parameters.Add("@filterBatchControl", SqlDbType.VarChar); 
      sqlCommand.Parameters.Add("@filterDate", SqlDbType.VarChar); 
      sqlCommand.Parameters.Add("@filterTime", SqlDbType.VarChar); 

      //sqlCommand.Parameters["@jobDate"].Value = date2; 
      sqlCommand.Parameters["@jobGroup"].Value = jobGroup; 
      sqlCommand.Parameters["@jobName"].Value = process; 
      sqlCommand.Parameters["@detailTable"].Value = detail_table; 
      sqlCommand.Parameters["@filterBatchControl"].Value = rid; 
      sqlCommand.Parameters["@filterDate"].Value = date; 
      sqlCommand.Parameters["@filterTime"].Value =date; 

      sqlConnection.Open(); 
      XYZFactorDetailGridCollection = FillGridEntity(sqlCommand); 
     } 
     return XYZFactorDetailGridCollection; 
    } 

    private static List<XYZFactorsModel> FillGridEntity(SqlCommand sqlCommand) 
    { 
     List<MBSFactorsModel> thegrid = new List<MBSFactorsModel>(); 
     using (SqlDataReader sqlDataReader = sqlCommand.ExecuteReader()) 
     { 
      while (sqlDataReader.Read()) 
      { 
       try 
       { 

        //if(sqlDataReader["last_factor"] != System.DBNull.Value) 
        //{ 
        //  
        // thegrid.Add(new XYZFactorsModel 
        // { 
        //  last_factor = Convert.ToDateTime(sqlDataReader["last_factor"]) 
        // }); 
        //} 
        //else 
        //{ 
        // System.Diagnostics.Debug.WriteLine("null value was found in last factor field"); 
        // } 

        thegrid.Add(new XYZFactorsModel 
        { 
         abc = sqlDataReader["abc"].ToString(), 
         abc2 = sqlDataReader["abc2"].ToString(), 
         abc3 = sqlDataReader["abc3"].ToString(), 
         abc4 = sqlDataReader["abc4"].ToString(), 
         abc5 = Convert.ToDecimal(sqlDataReader["abc5"]), 
       last_factor = Convert.ToDateTime(sqlDataReader["last_factor"]), 

        }); 


       } 
       catch (Exception ex) 
       { 

        System.Diagnostics.Debug.WriteLine(ex.Message); 
       } 

      } 
     } 
     return thegrid; 
    } 
} 

回答

0

您未能顯示變量的聲明,但我懷疑的問題是在拉取數據出來sqlDataReader實例的線路:

last_factor = Convert.ToDateTime(sqlDataReader["last_factor"]) 

如果last_factor聲明爲DateTime last_factor;,並且該列爲空,Convert調用將失敗。在進行此轉換之前,您需要檢查IsDbNull是否爲真。

如果空值是合適的,我會建議使用在這裏可空類型,而不是:

DateTime? last_factor = sqlDataReader.IsDbNull(columnNumber) ? (DateTime?)null : sqlDataReader.GetDateTime(columnNumber); 
+0

實際上在字段last_factor中有空值我試圖添加DBNull.Value檢查,但沒有幫助。 – CharlesMighty

+0

@ user1899247編輯顯示如何檢查 –

+0

嘗試了代碼行,但仍然無效。任何其他建議?日Thnx – CharlesMighty

0

只是轉換所有數據類型爲字符串,現在能正常工作。

相關問題