如何确定包含数据表的会话变量在C#中为null或为空

时间:2018-04-07 05:29:37

标签: c# session datatable

我有一个Session变量Session [" tblItems"],会话变量包含一个数据表。请在下面找到我的代码。

public JsonResult SaveItemToTable(string itemCode, int quantity, int Division)
{
    try
    {
        DataTable dt = new DataTable("tblItems1");

        if(!string.IsNullOrEmpty(Session["tblItems"] as string))
            {
            dt = (DataTable)Session["tblItems"];
            DataRow[] i = dt.Select("ItemCode ='" + itemCode + "'");
            if (i.Count() > 0)
            {
                for (int j = dt.Rows.Count - 1; j >= 0; j--)
                {
                    DataRow dr1 = dt.Rows[j];
                    if (dr1.ItemArray[0].ToString() == itemCode)
                    {
                        dr1.Delete();
                    }
                }
            }

        }
        else
        {
            dt.Columns.Add("ItemCode", typeof(string));
            dt.Columns.Add("Quantity", typeof(int));
            dt.Columns.Add("Division", typeof(int));
        }

        DataRow dr;
        dr = dt.NewRow();
        dr["ItemCode"] = itemCode;
        dr["Quantity"] = quantity;
        dr["Division"] = Division;
        dt.Rows.Add(dr);
        Session["tblItems"] = dt;
        return Json(1);
    }
    catch(Exception ex)
    {
        return Json(0); 
    }
}

当Session变量为空时,代码工作正常(仅限第一次)。 所有时间

if(!string.IsNullOrEmpty(Session["tblItems"] as string))

上面的代码返回false。即使会话变量包含值。

2 个答案:

答案 0 :(得分:0)

您的测试返回false,因为您正在使用“安全演员”:如果无法进行转换,as投射将返回null(有关C#指南的更多信息,请参阅{ {3}})。由于您尝试将数据表强制转换为字符串,因此即使会话变量具有值,也始终返回null。

要查看问题的真实性质,请尝试将其转换为:

if(!string.IsNullOrEmpty((string)Session["tblItems"]))

这会引发异常,因为您无法将数据表转换为这样的字符串。你需要像这样测试null:

if (Session["tblItems"] != null))

更新:看过上面的评论,我已经添加了一个更全面的例子来解释需要改变的内容。您的代码看起来应该更像这样:

DataTable dt;

if (Session["tblItems"] != null))
{
    dt = (DataTable)Session["tblItems"];
    ...
}
else
{
    dt = new DataTable("tblItems1");
    ...
}

DataRow dr;
dr = dt.NewRow();
...

请注意我所做的更改:如果有值,则会话从会话初始化dt,在这种情况下,转换将起作用,当它为null时,构造一个新的。然后,您可以使用下面部分中的值而不会出现问题,因为它始终具有值。

此外,我还建议您根本不要将数据表存储在会话中,而只是存储您需要的值。

答案 1 :(得分:0)

要检查您的会话是空还是空(对于DataTable):

private bool IsDataTableNullOrEmpty(object arg) =>
    arg == null || ((DatTable)arg).Rows.Count == 0;