错误(无法将对象从DBNull强制转换为其他类型

时间:2018-06-15 05:36:14

标签: c# dbnull

请帮忙告诉我做错了什么?

//For Only visible Rows After Filtering 
for(int i=0; i< DGScores.DataGridView.Rows.Count-1;i++)
{
    Int32 M1Val=Convert.ToInt32(DGScores.DataGridView.Rows[i].Cells["M1Val"].Value); 
    Int32 ScoreType=Convert.ToInt32(DGScores.DataGridView.Rows[i].Cells["ScoreType"].Value); 
    string StudentCode=DGScores.DataGridView.Rows[i].Cells["StudentCode"].Value.ToString();
    if(!Convert.IsDBNull(DGScores.DataGridView.Rows[i].Cells["M1Val"].Value))
    {
        if(  ScoreType==2 &&  M1Val >=0 )   
        { 
            MessageBox.Show("نمره مستمر اول برای "+StudentCode);  
        }
    }    
} 

2 个答案:

答案 0 :(得分:1)

你可以这样做并避免dbnull错误

if(datarow["columnaname"] != DBNull.Value)
 object.property =  decimal.Parse(row["columnname"].ToString());

或创建使用多个地方的常用方法

 public static T GetColumnValue<T>(string columnName, DataRow dr)
 {
    Type typeParameterType = typeof(T);

    return dr[columnName] != DBNull.Value
                ? (T) Convert.ChangeType(dr[columnName] , typeParameterType)
                : default(T);
 }

一样使用它
 obj.property = GetColumnValue<int>("column", datarow);

答案 1 :(得分:0)

避免这种错误的一种方法就是做你喜欢的事情。

Int32? M1Val = DGScores.DataGridView.Rows[i].Cells["M1Val"].Value == DBNull.Value ? 
(Int32?)null : Convert.ToInt32(DGScores.DataGridView.Rows[i].Cells["M1Val"].Value);

如果它实际上是null,则将其设置为null;如果不是,则将其设置为数字。然后,您可以在输入消息框if statement

之前使用它来检查null
if(M1Val != null)
{
    if(  ScoreType==2 &&  M1Val >=0 )   
    { 
        MessageBox.Show("نمره مستمر اول برای "+StudentCode);  
    }
}

希望这有帮助。