zoukankan      html  css  js  c++  java
  • 牛腩购物网31:首页修改(商品销售排行) 查询的行数,字段,表名不能使用参数化传值,而只能用拼接字符串的方式传值

    今天遇到一个很郁闷的问题,当我们在使用参数化查询的时候,下面的方法,是错误的!(我想把前几行的行数,用参数化传入,结果报错)

    //获取商品销售的排行榜
            public DataSet getTopSales(int num)
            {
                string sql = "select top @num  proid,SUM(quantity) as 销售量 from shop_orderdetails group by proid order by 销售量 desc";
                Database db = DatabaseFactory.CreateDatabase();
                DbCommand cmd = db.GetSqlStringCommand(sql);
                db.AddInParameter(cmd, "@num", DbType.Int32, num);
                return db.ExecuteDataSet(cmd);
            }

     

    会报错

    image

    难道说,sql语句里面,from之前的字段是不能动态的传进来的?

    所以我们修改成,拼接字符串的方式。

    //获取商品销售的排行榜
            public DataSet getTopSales(int num)
            {
                string sql = "select top "+num+"  proid,SUM(quantity) as 销售量 from shop_orderdetails group by proid order by 销售量 desc";
                Database db = DatabaseFactory.CreateDatabase();
                DbCommand cmd = db.GetSqlStringCommand(sql);
                //db.AddInParameter(cmd, "@num", DbType.Int32, num);
                return db.ExecuteDataSet(cmd);
            }

    ,但是有网友测试之后,这个 top 后面的数字是可以传进来的,但是你想查询的字段,还是不能用参数化的方式查询,例如上面的 proid 是不能用参数化传入的,但是,

    我们可以拼接的方式来传入

    调用方式都是一样的,都是

     //显示商品排行
                    repSales.DataSource = new DAL.OrderdetailsDAO().getTopSales(10,"proid");
                    repSales.DataBind();

     

    但是如果是用参数化传入就会报错,而用拼接查询就可以。

    错误的参数化传入:(主要是看 string sql 这一行)

    //获取商品销售的排行榜
            //如果我们调用的时候 string ziduan是等于  proid的
            public DataSet getTopSales(int num,string ziduan)
            {
                string sql = "select top (@num)  @ziduan as proid,SUM(quantity) as 销售量 from shop_orderdetails group by proid order by 销售量 desc";
                Database db = DatabaseFactory.CreateDatabase();
                DbCommand cmd = db.GetSqlStringCommand(sql);
                db.AddInParameter(cmd, "@num", DbType.Int32, num);
                db.AddInParameter(cmd, "@ziduan", DbType.String, ziduan);
                return db.ExecuteDataSet(cmd);
            }
    这样会变成赋值,结果我们前台绑定的时候,全部直接变成了  proid 了 image 
     

    正确的拼接的方式传入:(主要是看 string sql 这一行)

     //获取商品销售的排行榜
            //如果我们调用的时候 string ziduan是等于  proid的
            public DataSet getTopSales(int num,string ziduan)
            {
                string sql = "select top (@num) "+ziduan+" ,SUM(quantity) as 销售量 from shop_orderdetails group by proid order by 销售量 desc";
                Database db = DatabaseFactory.CreateDatabase();
                DbCommand cmd = db.GetSqlStringCommand(sql);
                db.AddInParameter(cmd, "@num", DbType.Int32, num);
                return db.ExecuteDataSet(cmd);
            }
    image 

    这样我们的字段就动态的传入到sql里面了。同理,表名也是可以通过这样的拼接字符串来传入进去的。

    }NQ~MPW9HBXVQ~UP5N3HVUC

    (V~AGJ1TBVHM%J93Z{2ZV`W

  • 相关阅读:
    转载: JS 中 new 操作符
    转载: js的值,对象,原型
    php setcookie(name, value, expires, path, domain, secure) 参数详解
    转载:js数组对象操作
    转载: js数组与 json 的区别
    转载: js的Prototype属性 解释及常用方法
    行人检测程序对接景区测试人数比对数据库切换时间不准确排查
    TSINGSEE青犀视频行人检测集成票务系统读取票务系统数据库为空的问题
    EasyWasmPlayer播放视频报错Uncaught (in promise)DOMException
    名胜景区部署TSINGSEE青犀视频监控具备哪些现实意义?
  • 原文地址:https://www.cnblogs.com/iceicebaby/p/2467745.html
Copyright © 2011-2022 走看看