Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ms-access/4.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
C# 在Access SQL语句中返回整数的CBool函数_C#_Ms Access_Ado.net_Ms Access 2010 - Fatal编程技术网

C# 在Access SQL语句中返回整数的CBool函数

C# 在Access SQL语句中返回整数的CBool函数,c#,ms-access,ado.net,ms-access-2010,C#,Ms Access,Ado.net,Ms Access 2010,我正在使用C#ExecuteReader方法从Access数据库读取数据。我在Access表中有一个字符串字段,在我的查询中,我使用以下代码将其转换为bool: IIF(IsXYZ = 'True',CBool(1=1),CBool(1=0)) AS IsXYZ 上述语句正在数据读取器中向我返回Int16值。按照 它应该返回bool,我在这里遗漏了什么?也许试试这个 CBool(IIf(IsXYZ = 'True',-1,0)) AS IsXYZ 值得一提的是,Access中的Yes/No

我正在使用C#
ExecuteReader
方法从Access数据库读取数据。我在Access表中有一个字符串字段,在我的查询中,我使用以下代码将其转换为bool:

IIF(IsXYZ = 'True',CBool(1=1),CBool(1=0)) AS IsXYZ
上述语句正在数据读取器中向我返回
Int16
值。按照

它应该返回
bool
,我在这里遗漏了什么?

也许试试这个

CBool(IIf(IsXYZ = 'True',-1,0)) AS IsXYZ

值得一提的是,Access中的Yes/No(True/False)字段在SQL Server中转换为位字段(如果已转换),并将转换为-1/0表示True/False。顺便说一句,0总是假的,任何“非零”数字都被认为是真的,所以9087也是真的

我错过了什么


我不认为你遗漏了什么。我已使用
System.Data.OleDb
System.Data.Odbc
,并使用
DAO.Recordset
在Access中重新创建了您的问题。似乎
CBool
将在VBA语句中返回
Boolean
,但在Access SQL语句中返回
Integer
:(

感谢您的帮助,但在我看来,这应该作为评论发布,因为它没有经过测试。我知道它没有经过测试,因为它无法解决问题。)我在MS Access即时窗口中测试了它,它对我有效。也许它应该由Deepak在他的C#代码中进行测试?嗨,我已经尝试了Dave的想法,但它仍然返回int16,我正在读取datareader的代码块在SQL db和access db之间很常见,所以现在我检查从数据读取器中重新运行(IsXYZ)datareader字段的数据类型,然后相应地强制转换它,SQL db将返回bool,而access db将返回int16(-1,0)。感谢Gord&Dave的帮助。值得一提的是Access中的Yes/No(True/False)字段在SQL Server中转换为位字段(如果已转换),并将转换为-1/0表示True/False。顺便说一句,0总是假的,任何“非零”数字都被认为是真的,所以9087也是真的!我编辑了我的答案以包含此内容。可能是驱动程序/提供程序问题和托管CLI类型问题。。但您确实没有在这里提供足够的代码示例。提供您正在使用的驱动程序/提供程序(在连接字符串中)以及您在派生DbCommand类型上执行Reader的代码段。我理解原因是Access仅部分实现SQL-92规范(甚至Access 2019!),以及以前的规范,SQL-89未定义
boolean
类型-最小的类型是
smallint
。OLE-DB有自己的
BOOL
,它将
-1
定义为
true
-1
需要有符号整数表示,最小值(当时)为
smallint
。所以我想这就解释了——但这并不权威。我很想加入微软的Access团队,通读源代码管理历史,找出到底发生了什么。。。