SqlConnection con = new SqlConnection("server=C23471744F6D4BC;database=OA_DB;integrated security=true");
string sql = "declare @pagesize int";
sql += " declare @str varchar(1000) ";
sql += "set @str='select top '+convert(varchar(4),@pagesize)+' * from TabMenu' ";
sql += "exec (@str)";
con.Open();
SqlCommand command = new SqlCommand(sql,con);
SqlDataReader reader = command.ExecuteReader(); command.Parameters.AddWithValue("@pagesize", 3);
List<Menu> list = new List<Menu>();
while (reader.Read())
{
Menu menu = new Menu();
menu.Id = Convert.ToInt32(reader["Id"].ToString());
list.Add(menu);
}
con.Close();
直接说问题: 首先申明 数据表连接正确,sql语句正确,代码没有错误。
问题在于 我怎样将@pagesize 这个参数传递进去,注意这的参数是 select top @pagesize * from 传递的参数是查询多少行,不是查询字段的值,希望大家这里看清楚。
我要怎样才能将这个参数传递进去,或者怎样修改这个sql语句可以查询达到相同的效果。
注意规则: (1)不用用什么拼接sql语句的方式,@pagesize 必须以参数占位符的方式传递
(2) 不能使用存储过程
(3) 你可以修改sql语句的格式,但是@pagesize 必须是占位符参数
说了这么多 希望大家明白,就帮我解决一下吧
我这么告诉你,SQL中的 declare @pagesize int 语句,就等同于
SqlParameter parm = new SqlParameter("@PageSize",SqlDbType.Int);
所以,把你的declare set exec 之类的都去掉,直接使用代码模式的参数配合
直接的 select 语句。
SqlDataReader reader = command.ExecuteReader(); command.Parameters.AddWithValue("@pagesize", 3);
换一下顺序,变为
command.Parameters.AddWithValue("@pagesize", 3);
SqlDataReader reader = command.ExecuteReader();
然后把
declare @pagesize int 这句sql删除
在SQL 2008之前的版本中,top后不可以加变量
看http://www.cnblogs.com/downmoon/archive/2007/12/29/1019686.html
以后版本,看
http://www.cnblogs.com/downmoon/archive/2010/10/12/1849248.html