错误发生场景
开发环境:VS2012
ASP.NET :WebForm项目
在执行查询操作的时候。报出异常
报错
System.ArgumentException:列”Exchanged_qty”不属于表inquire.
分析
首先,点开数据库,发现数据库表中时有数据的,代表查询语句一定可以查询出数据。
其次,报错代码行,位置在自己写的toModel方法中。
toModel方法的原理是,通过反射技术将传进来的Datarow转化成对应的Model
如果这个地方报错的话,一般代表映射时有问题。Model中的成员和对应的表结构中的字段,没有一一映射。
于是去Model类里仔细查找,发现成员和字段是完全对应的。
那么这个问题,就不是出在映射失败上。
toModel方法要接受的参数为select查询语句后的Datarow,既然错误不在方法中。那么就可能是Select传进来的datarow为空。
这样问题又转回到查询语句是否查询出数据。
分析SQL语句
select * from wms_exchange_line where exchange_header_id = (select exchange_header_id from wms_exchange_header where invoice_no = @invoice_no)
SQL语句是完全正确的,那么为什么有些情况查询不出来数据呢?
因为要考虑SQL语句的正确性。我们将该SQL语句放到数据库中去执行。
- 子查询只查出一个数据,一对一关系时
- 子查询查出多个数据,一对多关系时
此时,我们发现当有=号进行子查询,子查询结果为多个时。MySQL就会报错。
错误信息:Subquery returned more than 1 value. This is not permitted when the subquery follows =,!=,<,<=,>,>= or when the subquery is used as an expression。
错误翻译过来就是说,当返回多个值时,不能用=,!=,<,<=,>,>=通配符适应。
那么我们就找到错误的原因了。
解决方法
将=号换成In
In的一对一查询
In的一对多查询
结论
其实还是我自己对SQL语句的不了解造成的错误。
这个错误说起来简单,只是In的一个适用情况
但是在实际报错的时候,却花了2个多小时去找个这个错误在哪里。
从这个错误中学到了
- 要对SQL语句更认真的再了解一遍,包括不同的适用情况。看书看资料是非常快的一件事情,而知识要能运用起来,需要更多的实践
- 对于任何IDE报错,不能简单的只看IDE报错的那一行。而是要抽丝剥茧,将报错前的语句都好好检查一遍。