抱歉,我再次提出了一个关于从c#读取sqlite数据库的问题。 假设表中有一个简单的布尔列。 我想使用.net DataReader(连接层)。 我的问题是: 为什么在调用getBoolean方法时遇到强制转换异常(解决方案A)? 将DataReader转换为布尔值(解决方案B)非常有效。
A)布尔值my_bool = DR.getBoolean(...
B)布尔值my_bool =(布尔值)DR [...
显然我可以选择B,但我更喜欢A编程风格。 谢谢
答案 0 :(得分:0)
这是因为当数据读取器读取数据时,数据很可能不是bool类型。
第一个代码段引发了InvalidCastException
。
秒 - 检索另一种类型的数据并将其局部转换为bool。 CLR处理演员表并且有效。
我的猜测是你的数据库返回整数值,0
和1
(字节?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对象,该对象将无法转换为布尔值