我是这样写的,不知道行不行 SqlParameter[] pars = new SqlParameter[9]; pars[0] = new SqlParameter("@sTable", SqlDbType.VarChar, 30); pars[0].Value = Pager.tablename; pars[1] = new SqlParameter("@sField", SqlDbType.VarChar, 200); pars[1].Value = Pager.Fields; pars[2] = new SqlParameter("@sCondition", SqlDbType.VarChar, 500); pars[2].Value = Pager.Condition;
有点问题: sCondition是你构造好的查询条件吗?这样是不行的,必须为每个要查询的字段传递参数。构造SQL语句的方法不能完全避免注入,包括在存储过程中构造SQL语句。正确的方法应该这样:Select * from table where name = @Name and Gender=@Gender
我只是一个菜鸟,但是我们做项目用分页的时候有两种方式,1、利用sql语句进行分页,例如:select top PageSize from Nuser where id not in(select top ((currpage - 1) * PageSize) id from Nuser order by id) order by id;其中PageSize表示每一页显示多少条数据,可以用int的类型代入,currpage表示当前是第几页,当不能等于0或小于0!然后我们可以利用两个按钮来控制currpage来进行分页!虽然这种方式是把数据分成几部分读取,速度不是很快,因为你每一按上一页或者是下一页的时候都要进行数据库的访问,但是无论你这是开发C/S还是开发B/S的都可以用这种方式,并且这种方式可以结合第三方控件使用!个人建议:你是开发ASP或者ASP.NET的话最好自己做个自定义控件! 2、利用第三方控件!我个人建议利用第一种方式比较好! 但是如果是以一次性读取数据库里的数据,再进行分页的话,建议保存在Session中,Session的时间我们可以修改,ViewState也可以,但是要知道ViewState是不可以在窗体之间中传递的,因为ViewState这是保存在当前页面中的!而Session可以保存一个实体类,个人觉得还是Session好!地址栏的话不好看而且还浪费时间!
我觉得还是得看实际情况吧!
1. 放地址栏里面是最方便的,虽然放上去不好看,安全方面,可以写程序的过程中来弥补,比如说,在查询前做一些校验,过滤掉一些非法的参数。
2. 放到session里面比较省心,不过前提是没有在iis里面做负载均衡,如果涉及到多台web服务器,而你的session是放在服务器内存里面,状态容易丢失;如果只是单台的web服务器,放session里面也是比较方便的。
3. cookie的话,放得最长久,哪怕你关闭了浏览器,刷新不及时的问题应该是你操作cookie有误所导致,操作cookie要注意几个方面:
1). cookie是通过domain和path来控制作用范围的,尤其是后面那个属性,js中经常操作cookie失效,主要是由于没有设置path的原因
2). 如果你通过asp.net后台的response来设置cookie,那么,要注意response只有返回到客户端,才能影响cookie的值,如果是ajax的方式,可能你在服务端已经设置了cookie,但是它这个响应没有返回客户端,导致客户端的cookie并没有被修改。
4. 如果在webform下,用viewstate是个不错的选择
5. 如果使用asp.net mvc,用ViewData来缓存查询条件吧
{
Pager.intPageNo = 1;
string fields = ddl_field.Text.ToString().Trim();
string Key = tb_key.Text.ToString().Trim();
string str_flyso = fields + " like '%" + Key + "%'";
ViewState[tablename] = HttpUtility.UrlEncode(str_flyso);
}//........................
protected void Page_Load(object sender, EventArgs e)
{
if (Request.Cookies["Admin"] == null)
{
Response.Write("<script>window.parent.window.location.href='login.html';</script>");
}
Pager.intPageSize = 10;
if (Request["CurrentPage"] == null)
{
Pager.intPageNo = 1;
}
else
{
Pager.intPageNo = Int32.Parse(Request["CurrentPage"]);
}
//初始变量
string str_Condition = "";
try
{
str_Condition = HttpUtility.UrlDecode(ViewState[tablename].ToString());
}
catch
{
str_Condition = "";
} if (!IsPostBack)
{
if (Request["CurrentPage"] == null && Request.QueryString["act"] == null && str_Condition != "")
{
ViewState[tablename] = "";
Response.Redirect(pagename);
return;
}
}
Response.Write(str_Condition);
try
{
分页代码省略
}
//失败处理
catch //(Exception ex)
{
//Response.Write(ex.Message);
Response.Write("数据库连接出错!");
Response.End();
}
}
局部刷新的用 隐藏域储存
count = pg.GetCount();
if (!IsPostBack)
{
int pagecount = 10;
int pageindex = 1;
Repeater1.DataSource = pg.SelectAllDataset(pageindex, pagecount);
Repeater1.DataBind();
ViewState["pageindex"] = 1;
ViewState["paixu"] = "";
if (count / 10 == 0)
{
pageco = count / 10;
}
else
{
pageco = (count / 10) + 1;
}
ViewState["pageco"] = pageco;
}
我用viewState分页表示毫无压力,。
比如一个列表查询页面:1、进入页面后首先根据Url参数构造查询条件,同时设置页面上查询项目的值,2、根据查询条件,查询数据,3、分页处理,使用AspNetPager,可以自动生成分页列表,并且参数都被自动保存下来,分页的时候也不会出问题,4、点击查询的时候,将各个查询参数绑定到Url上重新加载这个页面。这样没有使用ViewState,没有Session,没有cookie,搜索引擎也比较容易收录吧
ViewState保存在当前页面中,Seesion保存在服务器,Cookie保存在浏览器,ViewState进入一个新的页面,当然就没了。
这个还需要你根据page去查询数据的
URL的安全性问题就是SQL注入的问题,参数值、参数名这些东西大家都找的出来。SQL注入的问题可以通过参数化查询的方式解决,也就是使用Parameter封装参数。
pars[0] = new SqlParameter("@sTable", SqlDbType.VarChar, 30);
pars[0].Value = Pager.tablename;
pars[1] = new SqlParameter("@sField", SqlDbType.VarChar, 200);
pars[1].Value = Pager.Fields;
pars[2] = new SqlParameter("@sCondition", SqlDbType.VarChar, 500);
pars[2].Value = Pager.Condition;
sCondition是你构造好的查询条件吗?这样是不行的,必须为每个要查询的字段传递参数。构造SQL语句的方法不能完全避免注入,包括在存储过程中构造SQL语句。正确的方法应该这样:Select * from table where name = @Name and Gender=@Gender
翻页你没用服务器控件吧,你用的是asp方式的连接吧,用IsPostBack测试一下,如果是第一次哪来的值,只能利用post、get传值
2、利用第三方控件!我个人建议利用第一种方式比较好!
但是如果是以一次性读取数据库里的数据,再进行分页的话,建议保存在Session中,Session的时间我们可以修改,ViewState也可以,但是要知道ViewState是不可以在窗体之间中传递的,因为ViewState这是保存在当前页面中的!而Session可以保存一个实体类,个人觉得还是Session好!地址栏的话不好看而且还浪费时间!
Session就像一颗定时炸弹一样!
还是少用他!
ViewState保存在当前页面中,Seesion保存在服务器,Cookie保存在浏览器,ViewState进入一个新的页面,当然就没了。
说得好,谢谢