• 牛腩购物网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

  • 相关阅读:
    struts2文件上传报错
    简述算法和程序的区别并举例说明
    JAVA中TreeMap集合筛选字母及每一个字符出现的次数
    Myeclipse2014破解步骤
    修改ubuntu的终端提示符
    gcc 引用math.h头文件,编译出现undefined reference to `pow‘等错误时,需要加参数lm.
    几篇文章
    gdb调试gcc出现:Missing separate debuginfos, use: debuginfoinstall glibcx.i686
    【达内C++学习培训学习笔记系列】C语言之三循环语句和数组
    code::block之spell checker配置
  • 原文地址:https://www.cnblogs.com/iceicebaby/p/2467745.html
Copyright © 2020-2023  润新知