2

オブジェクトを DBNull から他の型にキャストすることはできません。

上記のエラーをスローする次の関数があります。データベースと C# コードですべての null を処理しています。では、どこでこのエラーが発生していますか?

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;
4

3 に答える 3

5

別の型にキャストする前に、列に null 値があるかどうかを確認する必要があります。nullでチェックしていますが、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);
    }
}
于 2013-09-29T07:35:33.553 に答える
0
    private static string MyToString(object o)
    {
        if (o == DBNull.Value || o == null)
            return "";

        return o.ToString();
    }

10 進数に変換する場合:

spinHOInvAmt.Value = Convert.ToDecimal(dr["HOInvAmount"] == DBNull.Value ? 0 : dr["HOInvAmount"]);
于 2014-01-09T11:50:35.377 に答える