在下面的代码中获取第二行错误。可能出错?

时间:2010-11-23 06:04:01

标签: c# asp.net

for (I = 0; I < ds.Tables[0].Rows.Count; I++)
{
 if (Convert.ToBoolean(ds.Tables[0].Rows[I]["IsDefault"].ToString()) == true && Convert.ToBoolean(ds.Tables[0].Rows[I]["IsBill"].ToString()) == true)
.
.
.
.

错误:System.FormatException:String未被识别为有效的布尔值。

默认值和IsBill仅为布尔值

4 个答案:

答案 0 :(得分:2)

我认为你的表中有些值为空。

if (ds.Tables[0].Rows[I]["IsDefault"] != null && ds.Tables[0].Rows[I]["IsBill"]) != null)
    {
        if (Convert.ToBoolean(ds.Tables[0].Rows[I]["IsDefault"].ToString()) == true && Convert.ToBoolean(ds.Tables[0].Rows[I]["IsBill"]..ToString()) == true)
        {


        }

    }

您可能必须使用Convert.IsDBNull函数来检查值是否为NULL。

答案 1 :(得分:1)

显然,您对Visual Studio中提供的一些调试工具不太满意。

将来,如果您想自己解决这个问题,我可以建议一些调试方法:

1)在该行放置断点,然后将鼠标悬停在.ToString()方法上以查看它返回的内容 2)当您在断点处时,单击显示“即时窗口”的选项卡,然后键入可能返回奇怪的调用,在这种情况下 ds.Tables[0].Rows[I]["IsDefault"].ToString() 然后,您可以看到您的通话返回的结果,您很可能会解决自己的错误!

编辑:我错的原因是错的,但我认为有关良好调试实践的建议是值得的!祝你好运!

答案 2 :(得分:0)

您的代码可以改进一些东西。

(1)通常我们在循环中使用小写变量i

(2)不要在代码中直接使用列名。假设有一天,列名称从“isDefault”更改为“DefaultOrNot”(仅作为示例),这是一场噩梦,因为您需要在代码中的任何位置修改字符串。枚举在这里很有用。

enum TableColumns //well, it's a bad name
{
   ID = 0,
   Name = 1,
   IsDefault = 2   
}

并使用table.Rows[0][(int)TableColumns.IsDefault]访问您的表格单元格。只有在添加或更改任何列时,您才需要修改enum

(3)我认为格式异常是因为单元格的值是T/F而不是True/False。因此将其转换为bool类型将导致格式异常。

(4)在使用之前,最好检查一下这个单元格中是否有值。

编辑:您是否将值存储在DB 1/0中(1表示真,0表示假)?所以你应该使用:

object cell = table.Rows[0]["IsDefault"];
if (cell != null && !Convert.IsDBNull(cell))
{
    if (cell.ToString().Equals("1"))
    {
        //do something
    }
}

答案 3 :(得分:0)

如果可以,请检查数据库中IsDefault和IsBill列的值。你有一点专栏吗?如果是,则它可能返回1或0,您可能正在尝试将它们转换为布尔值,这不是那么容易做到的。

另外,检查null。当您尝试转换的值无法在目标类型上转换时,就会出现FormatException。

<强>更新: 我想你这里的括号错了。你的if在第一个ToString()

之后立即结束

if(Convert.ToBoolean(ds.Tables [0] .Rows [I] [“IsDefault”]。ToString()) == true&amp;&amp; Convert.ToBoolean(ds。表[0] .Rows [I] [“IsBill”]。ToString())== true)