itares
发表于: 2011/3/14 19:51 引用 回复 只看该作者 1# TOP
江湖豪侠
性别: 男
积分:4689
阅读权限:2577
帖子: 355
加入时间: 2010/8/31
最后登录: 2015/2/21
select * from tb where id in(1,2)

-----------------这个只搜索出来一条数据。。。实际上是有两条的


articles = Article.find("Id in(:id)").set("id",RecArticleIds).list();
关键词 sql参数 修改tag
掷鸡蛋者
发表于: 2011/3/15 7:42 引用 回复 只看该作者 2# TOP
管理员
性别: 男
积分:52165
阅读权限:43377
帖子: 8314
加入时间: 2010/4/29
最后登录: 2018/10/18
多谢反馈,你直接拼接查询语句试试看,也就是:
Article.find("Id in("+RecArticleIds+")").list();

其中的 recArticleIds 可以先使用cvt.IsIdListValid( ids )验证是否是整数序列,避免注入
而死,不默而生
sparksustc
发表于: 2011/3/15 22:07 引用 回复 只看该作者 3# TOP
江湖豪侠
性别: 男
积分:1508
阅读权限:945
帖子: 192
加入时间: 2010/8/7
最后登录: 2018/9/4
还有此等bug?
掷鸡蛋者
发表于: 2011/3/16 9:36 引用 回复 只看该作者 4# TOP
管理员
性别: 男
积分:52165
阅读权限:43377
帖子: 8314
加入时间: 2010/4/29
最后登录: 2018/10/18
这个不算bug,其实是数据参数的一种特殊用法,在 IDbCommand 底层也不能这么使用,非常不方便,但没有办法。

IDbCommand 中原生的用法是这样的——
如果要在in语句中使用参数,必须将ids分开使用参数,比如sql语句应该这样:
            String sql = "select * from TCat where (Id in ( ?,?,? )) order by Id desc";
然后参数这样处理:
            cmd.Parameters.Add( new OleDbParameter( "@id1", "6" ) );
            cmd.Parameters.Add( new OleDbParameter( "@id2", "7" ) );
            cmd.Parameters.Add( new OleDbParameter( "@id3", "8" ) );  

在ORM中,如果要在in语句中使用参数,也需要相应调整为:
            List<TCat> cats = db.find<TCat>( "Id in (:id1,:id2,:id3)" )
                .set( "id1", 6 )
                .set( "id2", 7 )
                .set( "id8", 8 )
                .list();
当然,这样太麻烦,尤其是在ids不确定的情况下,只能直接拼接ids字符串了,推荐二楼的做法。

而死,不默而生
sparksustc
发表于: 2011/3/17 9:28 引用 回复 只看该作者 5# TOP
江湖豪侠
性别: 男
积分:1508
阅读权限:945
帖子: 192
加入时间: 2010/8/7
最后登录: 2018/9/4
这个不算bug,其实是数据参数的一种特殊用法,在 IDbCommand 底层也不能这么使用,非常不方便,但没有办法。

IDbCommand 中原生的用法是这样的——
如果要在in语句中使用参数,必须将ids分开使用参数,比如sql语句应该这样:
            String sql = "select * from TCat where (Id in ( ?,?,? )) order by Id desc";
然后参数这样处理:
            cmd.Parameters.Add( new OleDbParameter( "@id1", "6" ) );
            cmd.Parameters.Add( new OleDbParameter( "@id2", "7" ) );
            cmd.Parameters.Add( new OleDbParameter( "@id3", "8" ) );  

在ORM中,如果要在in语句中使用参数,也需要相应调整为:
            List<TCat> cats = db.find<TCat>( "Id in (:id1,:id2,:id3)" )
                .set( "id1", 6 )
                .set( "id2", 7 )
                .set( "id8", 8 )
                .list();
当然,这样太麻烦,尤其是在ids不确定的情况下,只能直接拼接ids字符串了,推荐二楼的做法。

掷鸡蛋者 at 2011/3/16 9:36

 

恩。受教了。

快速回复主题