-2

以下のコードのどこが間違っていると思われますか? データベースに null があると思います。null を含む列を合計するにはどうすればよいですか?

int Total_QtyinHand = 0;
int Total_QtyAllocated = 0;
int Total_QtyinStock = 0;
int Total_QtyUpcoming = 0;

protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
{
    if (e.Row.RowType == DataControlRowType.DataRow)
    {
        // VVV  --- Exception happens on the line below --- VVV
        Total_QtyinHand += Convert.ToInt32(DataBinder.Eval(e.Row.DataItem, "QuantityonHand"));
        Total_QtyAllocated += Convert.ToInt32(DataBinder.Eval(e.Row.DataItem, "Allocated_Quantity"));
        Total_QtyinStock += Convert.ToInt32(DataBinder.Eval(e.Row.DataItem, "Qty_in_Stock"));
        Total_QtyUpcoming += Convert.ToInt32(DataBinder.Eval(e.Row.DataItem, "UpcomingStock"));
    }

    else if (e.Row.RowType == DataControlRowType.Footer)
    {
        e.Row.Cells[3].Text = "Total Qty";
        e.Row.Cells[3].Font.Bold = true;

        e.Row.Cells[4].Text = Total_QtyinHand.ToString();
        e.Row.Cells[4].Font.Bold = true;

        e.Row.Cells[5].Text = Total_QtyAllocated.ToString();
        e.Row.Cells[5].Font.Bold = true;

        e.Row.Cells[6].Text = Total_QtyUpcoming.ToString();
        e.Row.Cells[6].Font.Bold = true;
    }

}
4

2 に答える 2

-1

DBNull.Valueデータベース API を使用する場合、データベースに null 値がある場合は値が置き換えられます。あなたのコードは、それを int に直接変換しようとしますが、失敗します。値は ではなく であるため、値を直接比較しnullても役に立ちません。nullDBNull.Value

そう:

object value = DataBinder.Eval(e.Row.DataItem, "QuantityonHand");
if (value != DBNull.Value) { Total_QtyinHand += (int)value; }

または、値が実際にはフードの下の文字列である場合は、代わりに解析する必要がある場合があります。ただし、データベースのスキーマをアップグレードして、実際に数値を格納して返すことをお勧めします。これについては後で詳しく説明します。

object value = DataBinder.Eval(e.Row.DataItem, "QuantityonHand");
if (value != DBNull.Value)
{ 
    int result = -1;
    if (int.TryParse((string)value, NumberStyles.Integer, CultureInfo.InvariantCulture, out result))
    {
       Total_QtyinHand += result;
    }
}

もちろん、このロジックを別の関数でキャプチャすることも、?:演算子をいじることもできます。

object value = DataBinder.Eval(e.Row.DataItem, "QuantityonHand");
Total_QtyinHand += (value == DBNull.Value ? 0 : (int)value);

回答を調査しているときに、文字列を介して値をラウンドトリップし、再度解析するための多くの提案が見つかる場合があります。これは非常に奇妙な動作につながる可能性があるため、そうしないことを強くお勧めします。コード内のこれらのバグをキャッチするために、過去に FxCoprule を作成したこともあります。スキーマが正しい場合、データベースの値はすでに数値形式であり、カルチャの解析などであらゆる種類の異常な動作を導入する理由はありません。.Parseorメソッドを使用する場合.TryParseは、予想される NumberStyle と数値が格納されているカルチャを指定して、偶発的な解析ミス (小数点が正しく設定されていない場合に値に 100 を掛けるなど) を防ぐようにしてください。

于 2014-12-24T10:19:33.807 に答える
-1

このコードは私のテストで正常に動作します

tot += DataBinder.Eval(e.Row.DataItem, "mylab").ToString() != string.Empty 
    ? Convert.ToInt32(DataBinder.Eval(e.Row.DataItem, "mylab")) 
    : 0;

e.Row.Cells[0].Text = tot.ToString();
于 2014-12-24T09:21:12.263 に答える