servlet接收post数据为null_关于SQL SERVER bit类型数据为NULL导致EF Core查不出数据问题

问题描述

今天遇到一个非常奇葩的问题,使用EF Core对一个旧表作查询,查询出来的实体集,可以看到有多少条数据,但却报错说这个实体集为null

990e975bd718bcb48067fc2ff6dc3074.png

而这个实体集的数目其实是符合我表中的数据,

d70e62f532b8b25ed52b231d9f099979.png

当我继续运行的时候就会报以下错误,这个错误的提示很明显,就是说这个实体集是null,所以是没有对应的方法或属性使用。

e003a930784d50722a3b71b028e57711.png

所以我直接监视这个实体集,其实也是可以看到Results View里面是没有数据的。

a922c9409163dd48bd5fbbdbaad964ff.png

排查问题&解决历程

心里第一反应,“卧槽,又出bug了”,(哭丧脸.jpg)还是开始检查代码吧,但经过我一番检查,我是确信自己没有写错代码的,因为这个都只是最基础的EF查询。

bb35c05f0e1e9e31956615f196890355.png

没办法了只能出必杀技了,开始监控数据库,使用SQL SERVER自带的工具Profiler监控所有调用记录。如下图,可以看到整个记录中,只看到曾经有调用过查询数据总量的记录,其他的都没有,这样也符合VS的监控结果,实体集没有结果,但却有数据总量

0cd54b79747ed53fe7d0a1f87e8e193a.png

来到这一步,感觉就神了,感觉越来越接近真相,但却触不可及。
现在需要思考的是,为什么以下这行代码没有生效,不能生成SQL语句到数据库执行?

var basicData = BasicDataDtlDAL.Entities; 

f980a87492fea61b308bc5b52d36be66.png

瞎搞了半天,因为在度娘中也找不出任何相似解决方案,所以也没啥办法了,只能逐个排查,我先使用相同的代码查询另一张表,发现是完全没有问题,那么也证实了一开始的想法,代码没有问题。

然后猜测可能就是数据问题,对比两张表的数据,大体相差不大,最大的不同可能就是目标表的有一个字段类型为bit并且所有数据都是null,数据库的bit类型对应C#的就是bool类型,理论上就是它的值应该是0或1,于是猜会不会是因为这个数据的问题,我就是尝试将这张表的bit类型这个字段的值全赋了0。

91e9af71f2151edf5fd23b77628f7a63.png

然后再重新执行了一次代码,见证奇迹的时候到了,如下图:

456d72d71605f8cefc7109808c60f719.png

虽然代码正确运行了,但当时我的想法是,哈?怎么就正确了?

5b59611c48ea074c240d58ce8fecee92.png

具体是什么原因我的知识有限也没找到相关的说明,不过我的猜测是sqlserver里bit类型是不能为null,如果直接使用http://ADO.NET直接使用SQL语句来查询应该是没问题的,因为我直接在数据库查询也是没问题的,但现在使用EF Core来查询的话,这个问题就暴露了。查询直接到不了数据库。这是一个巨坑啊!!

最后科普

这次的坑最主要的问题,应该是对SqlServer bit类型的不了解,所以重新复习一下这个类型。
SqlServer的bit类型是只0或者1,默认不输入值时为null,但是如果输入的值不是0或空字符串或“false”这三种情况时,输入其他的值都会自动转换为1。
不过其实bit对应的c#的bool类型,那么最好还对它赋值0或1,不要留null,避免发生一些意想不到的情况。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值