错误:SQL语句的极端情况(Select之中的嵌套子循环)

错误发生场景

开发环境: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语句放到数据库中去执行。

  1. 子查询只查出一个数据,一对一关系时
    子查询只查出一个数据,一对一关系时
  2. 子查询查出多个数据,一对多关系时
    子查询查出多个数据,一对多关系时

此时,我们发现当有=号进行子查询,子查询结果为多个时。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

  1. In的一对一查询
     In的一对一查询

  2. In的一对多查询
    In的一对多查询

结论

其实还是我自己对SQL语句的不了解造成的错误。
这个错误说起来简单,只是In的一个适用情况
但是在实际报错的时候,却花了2个多小时去找个这个错误在哪里。

从这个错误中学到了

  1. 要对SQL语句更认真的再了解一遍,包括不同的适用情况。看书看资料是非常快的一件事情,而知识要能运用起来,需要更多的实践
  2. 对于任何IDE报错,不能简单的只看IDE报错的那一行。而是要抽丝剥茧,将报错前的语句都好好检查一遍。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值