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

posted @ 2012-04-24 11:35  asp_net老友记  阅读(360)  评论(1编辑  收藏  举报