Sqlite Boolean和c#DataReader

时间:2014-01-29 20:12:33

标签: c# casting sqlite ado.net

抱歉,我再次提出了一个关于从c#读取sqlite数据库的问题。 假设表中有一个简单的布尔列。 我想使用.net DataReader(连接层)。 我的问题是: 为什么在调用getBoolean方法时遇到强制转换异常(解决方案A)? 将DataReader转换为布尔值(解决方案B)非常有效。

A)布尔值my_bool = DR.getBoolean(...

B)布尔值my_bool =(布尔值)DR [...

显然我可以选择B,但我更喜欢A编程风格。 谢谢

3 个答案:

答案 0 :(得分:0)

这是因为当数据读取器读取数据时,数据很可能不是bool类型

第一个代码段引发了InvalidCastException。 秒 - 检索另一种类型的数据并将其局部转换为bool。 CLR处理演员表并且有效。

我的猜测是你的数据库返回整数值,01(字节?short?int?),以便进行转换但尝试读取布尔值不起作用。

要检查此项,请记录readed值:

 Debug.Write( DR[...].GetType().ToString() );

答案 1 :(得分:0)

我认为Sqlite Ado.net DataReader中存在一个错误。

请参阅sqlite-dev和sqlite邮件列表中的线程链接here

可能的解决方法是1)使用签入(0,1)实现可靠的列约束,以避免插入“Y”而不是“1”的情况(旧的SqliteAdministrator问题) 2)定义BOOLEAN_INT而不是BOOLEAN:当ado.net没有自动映射到System.Boolean时,DR会识别任何错误插入的字符串

无论如何,我确认A编程风格更安全。

答案 2 :(得分:0)

如果列可以为空,那么您可能正在读取一个DBNull对象,该对象将无法转换为布尔值