无法将对象从DBNull强制转换为其他类型。
我有以下函数抛出上述错误。我正在处理我的数据库和C#代码中的所有空值。 那么它在哪里得到这个错误?
我可以看到catch块中的错误。但我不明白以下create()中哪一行得到错误。
private void btnsearch_Click(object sender, EventArgs e)
{
try
{
dt.Rows.Clear();
SqlConnection CN = new SqlConnection(mysql.CON.ConnectionString);
SqlDataAdapter sda = new SqlDataAdapter("select EMP_EMPLOYEES.NAME,EMP_EMPLOYEES.JOBNAME,EMP_EMPLOYEES.FIA,EMP_EMPLOYEES.DRAGA,EMP_EMPLOYEES.SALARY ,EMP_HASM_DET.GZA,EMP_EMPLOYEES.NAQLBADAL,EMP_EMPLOYEES.JOBBADALAT ,BLADIAINFO.MA3ESHA ,EMP_EMPLOYEES.DISSENT ,EMP_EMPLOYEES.SANDOK as'الصندوق' from BLADIAINFO ,EMP_EMPLOYEES left join EMP_HASM_DET on EMP_HASM_DET.EMPID = EMP_EMPLOYEES.ID left join EMP_MOKHALFAT_DET on EMP_MOKHALFAT_DET.EMPID = EMP_EMPLOYEES.ID left join EMP_MOKHALFAT on EMP_MOKHALFAT.ID=EMP_MOKHALFAT_DET.MOKHALFAID left join EMP_HASMIAT on EMP_HASMIAT.ID=EMP_HASM_DET.HASMID and EMP_EMPLOYEES.EMPTYPE = '" + cmbEMPTYPE.SelectedItem.ToString() + "' ", CN);
sda.Fill(dt);
}
////////////
dt.Columns.Add("Actual_salary", typeof(string));
foreach (DataRow dr in dt.Rows)
{
int GZA = dr["GZA"] == null ? 0 : Convert.ToInt32(dr["GZA"]);
dr["Actual_salary"] = Convert.ToInt32(dr["SALARY"]) - ((Convert.ToInt32(dr["SALARY"]) / 30) * GZA);
}
dataGridViewX1.DataSource = dt;
答案 0 :(得分:4)
在将列转换为其他类型之前,您需要检查列是否具有空值。在您使用 null 进行检查时,dr["GZA"]
不会为空,因此您需要使用DBNull.Value
试试这个
foreach (DataRow dr in dt.Rows)
{
int GZA = (dr["GZA"] == DBNull.Value) ? 0 : Convert.ToInt32(dr["GZA"]);
if (dr["SALARY"] != DBNull.Value)
{
dr["Actual_salary"] = Convert.ToInt32(dr["SALARY"]) - ((Convert.ToInt32(dr["SALARY"]) / 30) * GZA);
}
}
答案 1 :(得分:1)
你可以在一行上使用它:
int salary = reader["SALARY"] as int? ?? 0;
dr["Actual_salary"] = salary - ((salary/30) * GZA);
您可以为DBNull结果输入0或任何值。
答案 2 :(得分:0)
private static string MyToString(object o)
{
if (o == DBNull.Value || o == null)
return "";
return o.ToString();
}
转换为十进制:
spinHOInvAmt.Value = Convert.ToDecimal(dr["HOInvAmount"] == DBNull.Value ? 0 : dr["HOInvAmount"]);