Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sqlite布尔值和c#数据读取器_C#_Casting_Sqlite_Ado.net - Fatal编程技术网

Sqlite布尔值和c#数据读取器

Sqlite布尔值和c#数据读取器,c#,casting,sqlite,ado.net,C#,Casting,Sqlite,Ado.net,抱歉,我又有一个关于从c#读取sqlite db的问题。 假设表中有一个简单的布尔列。 我想使用.net数据读取器(连接层)。 我的问题是: 为什么调用getBoolean方法(解决方案a)时会出现强制转换异常? 将DataReader转换为Boolean(解决方案B)非常有效 A) 布尔my_bool=DR.getBoolean( B) 布尔my_bool=(布尔)DR[ 显然,我可以选择B,但我更喜欢A编程风格。 谢谢这是因为数据读取器读取数据时,数据很可能不是bool类型 第一个代码片段引

抱歉,我又有一个关于从c#读取sqlite db的问题。 假设表中有一个简单的布尔列。 我想使用.net数据读取器(连接层)。 我的问题是: 为什么调用getBoolean方法(解决方案a)时会出现强制转换异常? 将DataReader转换为Boolean(解决方案B)非常有效

A) 布尔my_bool=DR.getBoolean(

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

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

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

第一个代码片段引发
InvalidCastException
。 第二个-检索另一种类型的数据并在本地将其强制转换为bool。CLR处理强制转换并使其工作

我的猜测是,您的数据库返回整数值,
0
1
(字节?短字符?整数?),因此强制转换可以工作,但尝试读取布尔值却不起作用

要检查此情况,请记录读取的值:

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

我认为Sqlite Ado.net DataReader中有一个bug

请参阅sqlite开发人员和sqlite邮件列表中链接的线程

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


在任何情况下,我都确认A编程风格的结果更安全。

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

这听起来很相关,我刚刚发现它“SQLite没有单独的布尔存储类。相反,布尔值存储为整数0(false)和1(true)“请不要污损您自己的帖子。请再次回滚。请尊重未来的读者;这个问题可能对他们有用。在得到答案后删除或污损您的问题不是StackOverflow的公认做法。