在网格视图Controll中,对象不能从DBNull强制转换为其他类型

本文关键字:DBNull 转换 类型 其他 不能 视图 网格 Controll 对象 | 更新日期: 2023-09-27 17:58:35

我试图通过使用RowDataBound方法在gridview页脚中打印Grand Total。我在RowDataBound方法中声明了两个变量。一个是钱进,另一个是钱出。网格视图有空行。我在数据库中有两个表,一个叫存款,另一个叫取款。我正在使用SqlDataAdapter合并两个表。我声明了两个数据表dt和dt1。在每个数据表的SqlDataAdapter中,我传递了两个SQL查询,通过使用来自文本框的一个键从数据库中检索数据。最后,我使用merge方法将这两个数据表合并并显示在网格视图中。它工作得很好,但当我试图获得列的总计时,我遇到了这个错误。对象不能从DBNull转换为其他类型。这是我的Sql代码。

     SqlConnection cn = new SqlConnection(@"Data Source=KHUNDOKARNIRJOR'KHUNDOKERNIRJOR;Initial Catalog=Login;Integrated Security=True");
        SqlDataAdapter sdr = new SqlDataAdapter(@"SELECT  Account_Number AS [Account Number],Amount AS[Money In] from   Deposit  where Deposit.Account_Number='" + TextBox1.Text + "'", cn);
        DataTable dt = new DataTable();
        sdr.Fill(dt);
        SqlDataAdapter sdr1 = new SqlDataAdapter(@"SELECT    WithDraw.Amount AS[Money Out], ACCOUNT.statementamount AS [Balance] FROM ACCOUNT 
                                            INNER JOIN WithDraw 
                                            ON ACCOUNT.Account_Number = WithDraw.Account_Number  
                                            where WithDraw.Account_Number='" + TextBox1.Text + "'", cn);
        DataTable dt1 = new DataTable();
        sdr1.Fill(dt1);
        dt.Merge(dt1);
        GridView2.DataSource = dt;
        GridView2.DataBind();
    }
    int MoneyIn=0;
        int MoneyOut=0;

        // Loop thru each data row and compute total unit price and quantity sold 
        if (e.Row.RowType == DataControlRowType.DataRow)
        {
            if (DataBinder.Eval(e.Row.DataItem, "Money In") != DBNull.Value)
            {
                MoneyIn += Convert.ToInt32(DataBinder.Eval(e.Row.DataItem, "Money In"));
            }
            if (DataBinder.Eval(e.Row.DataItem, "Money Out") != DBNull.Value)
            {
                MoneyOut += Convert.ToInt32(DataBinder.Eval(e.Row.DataItem, "Money Out"));
            }
        } //// Display totals in the gridview footer
        else if (e.Row.RowType == DataControlRowType.Footer)
        {
            e.Row.Cells[0].Text = "Grand Total";
            e.Row.Cells[0].Font.Bold = true; 
            e.Row.Cells[1].Text = MoneyIn.ToString();
            e.Row.Cells[1].Font.Bold = true; 
            e.Row.Cells[2].Text = MoneyOut.ToString();
            e.Row.Cells[2].Font.Bold = true;
        }
    }
}
Please anyone can help me to solve this problem. Thanks 
here is the out put after editing and cheeking the Db null referance but still can not add the grand total 

在网格视图Controll中,对象不能从DBNull强制转换为其他类型

在转换之前,您是否尝试过与DBNull进行比较?

if(DataBinder.Eval(e.Row.DataItem, "Money In") != DBNull.Value)
{
  MoneyIn += Convert.ToInt32(DataBinder.Eval(e.Row.DataItem, "Money In"));
}

那么,如果要返回空字段,请使用IsNull()?像这样:

SELECT  Account_Number AS [Account Number], IsNull(Amount,0) AS[Money In] from   Deposit  where Deposit.Account_Number='" + TextBox1.Text + "'"

您可能还想使用Linq将两个DataTables链接在一起,因为这将给您更多的控制权。或者编写一个存储过程,以便在一个查询/DataTable中为您提供正确的输出(更好的选项)。

也停止使用= '"+ unsantitised input +"'!您使用SQL注入使您的页面极易破解。您需要使用参数。

您认为需要验证DataBinder。在使用之前评估(e.Row.DataItem,"Money In"),但实际上,如果您知道会有异常,并且应该忽略这些异常中的数据,则不需要验证数据,您可以忽略它。

这里有一个快速、肮脏的解决方案,可以帮助你:

更改:

    MoneyIn += Convert.ToInt32(DataBinder.Eval(e.Row.DataItem, "Money In"));

    Try
    {
    MoneyIn += Convert.ToInt32(DataBinder.Eval(e.Row.DataItem, "Money In"));
    }
    catch {};

更改:

    MoneyOut += Convert.ToInt32(DataBinder.Eval(e.Row.DataItem, "Money Out"));

    Try
    {
    MoneyOut += Convert.ToInt32(DataBinder.Eval(e.Row.DataItem, "Money Out"));
    }
    catch {};

请注意:这不会阻止你的异常发生,它只会捕捉到异常并忽略上面的数据。你的程序只会忽略无法转换为INT的数据,这就是你试图通过验证它来做的。

当您意识到将抛出异常,并且您愿意忽略这些异常,因为它们不会改变您的程序功能时,可以使用此选项,尽管它不是一个"良好标准"解决方案,但它确实有效。

相关文章: