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仅为布尔值
答案 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)