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

  • 相关阅读:
    u3d Mecanim动画
    四元数的共轭和逆
    c++ 单例模式
    GVIM、VIM
    Linux磁盘管理——虚拟文件系统
    Linux磁盘管理——MBR 与 GPT
    Link monitoring
    Linux高级网络设置——将多个网卡设置成一个网卡
    Linux高级网络设置——给网卡绑定多个IP
    DNS原理极限剖析
  • 原文地址:https://www.cnblogs.com/iceicebaby/p/2467745.html
Copyright © 2011-2022 走看看