今天遇到一个很郁闷的问题,当我们在使用参数化查询的时候,下面的方法,是错误的!(我想把前几行的行数,用参数化传入,结果报错)
//获取商品销售的排行榜 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); }
会报错
难道说,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 了
正确的拼接的方式传入:(主要是看 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); }
这样我们的字段就动态的传入到sql里面了。同理,表名也是可以通过这样的拼接字符串来传入进去的。