datatable使用Update 更新问题

问题遇到的现象和发生背景

在更新datatable时使用Getchange方法时用update更新表,为什么显示Object cannot be cast from DBNull to other types

问题相关代码,请勿粘贴截图

private void tsbSave_Click(object sender, EventArgs e)
{
DataTable changeDt=dtml.GetChanges();
foreach (DataRow dr in changeDt.Rows)
{
string strSQL = string.Empty;
if (dr.RowState == System.Data.DataRowState.Added)
{
strSQL = @"INSERT INTO [dbo].[MaterialInfo]
([material_cd]datatable
,[material_nm]
,[material_class]
,[material_unit]
,[material_price]
,[budget_price])
VALUES
('" + dr["material_cd"].ToString() + @"'
,'" + dr["material_nm"].ToString() + @"'
,'" + dr["material_class"].ToString() + @"'
,'" + dr["material_unit"].ToString() + @"'
," + Convert.ToDecimal(dr["material_price"]) + @"
," + Convert.ToDecimal(dr["budget_price"]) + @")";
}
else if (dr.RowState == System.Data.DataRowState.Deleted)
{
strSQL = @"DELETE FROM [dbo].[MaterialInfo]
WHERE material_cd= '" + dr["material_cd", DataRowVersion.Original].ToString() + @"'";
}
else if (dr.RowState == System.Data.DataRowState.Modified)
{
if (dr["material_unit"]!= DBNull.Value)
{
strSQL = @"UPDATE[dbo].[MaterialInfo]
SET [material_nm] = '" + dr["material_nm"].ToString() + @"'
,[material_class] ='" + dr["material_class"].ToString() + @"'
,[material_unit] ='" + dr["material_unit"].ToString() + @"'
,[material_price] =" + Convert.ToDecimal( dr["material_price"]) + @"
,[budget_price] =" + Convert.ToDecimal(dr["budget_price"]) + @"
WHERE material_cd = '" + dr["material_cd"].ToString() + @"'";
}

            }
            SqlCommand comm = new SqlCommand(strSQL, connml);
            comm.ExecuteNonQuery();
        }
    }
运行结果及报错内容

报错:Object cannot be cast from DBNull to other types

我的解答思路和尝试过的方法

好像是deimial不能转化,但不知道该怎么改

我想要达到的结果

有空对象,检查一下你的类型转换里面哪个被转的对象为空,