webdiyer大侠:
我下载安装了你的分页控件,按照你的例子建立一个页面,重写了存储过程,结果运行错误,自己怀疑是存储过程有问题,请重点指点一下,十分感谢。以下为错误信息及代码:
将 varchar 值 2-9-074 转换为数据类型为 int 的列时发生语法错误。
说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。
异常详细信息: System.Data.SqlClient.SqlException: 将 varchar 值 2-9-074 转换为数据类型为 int 的列时发生语法错误。
源错误:
行 30: cmd.Parameters.Add("@docount",false);
行 31: conn.Open();
行 32: Datagrid1.DataSource=cmd.ExecuteReader();
行 33: Datagrid1.DataBind();
行 34: conn.Close();
源文件: E:\dbserver\temp.aspx 行: 32
<%@ Page Language="C#" %>
<%@ Register TagPrefix="Webdiyer" Namespace="Wuqi.Webdiyer" Assembly="aspnetpager" %>
<%@ import Namespace="System.Data" %>
<%@ import Namespace="System.Data.SqlClient" %>
<%@ import Namespace="System.Configuration" %>
<script runat="server">
SqlConnection conn;
SqlCommand cmd;
void Page_Load(object src,EventArgs e){
conn=new SqlConnection(ConfigurationSettings.AppSettings["admin"]);
if(!Page.IsPostBack){
cmd=new SqlCommand("dt_query",conn);
cmd.CommandType=CommandType.StoredProcedure;
cmd.Parameters.Add("@pageindex",1);
cmd.Parameters.Add("@pagesize",1);
cmd.Parameters.Add("@docount",true);
conn.Open();
pager.RecordCount=(int)cmd.ExecuteScalar();
conn.Close();
BindData();
}
}
void BindData(){
cmd=new SqlCommand("dt_query",conn);
cmd.CommandType=CommandType.StoredProcedure;
cmd.Parameters.Add("@pageindex",pager.CurrentPageIndex);
cmd.Parameters.Add("@pagesize",pager.PageSize);
cmd.Parameters.Add("@docount",false);
conn.Open();
Datagrid1.DataSource=cmd.ExecuteReader();
Datagrid1.DataBind();
conn.Close();
}
void ChangePage(object src,PageChangedEventArgs e){
pager.CurrentPageIndex=e.NewPageIndex;
BindData();
}
</script>
<html>
<head>
<title>??</title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
</head>
<body>
<form id="Form1" runat="server">
<asp:DataGrid id="Datagrid1" runat="server"></asp:DataGrid>
<WEBDIYER:ASPNETPAGER id="pager" runat="server" OnPageChanged="ChangePage" HorizontalAlign="center" CssClass="mypager" ShowInputBox="always" ShowPageInfo="before" PageButtonCount="8" PageSize="8" />
</form>
</body>
</html>
存储过程:
CREATE procedure dt_query
(@pagesize int,
@pageindex int,
@docount bit)
as
set nocount on
if(@docount=1)
select count(统一编号) from jgqj_view
else
begin
declare @indextable table(id int identity(1,1),nid int)
declare @PageLowerBound int
declare @PageUpperBound int
set @PageLowerBound=(@pageindex-1)*@pagesize
set @PageUpperBound=@PageLowerBound+@pagesize
set rowcount @PageUpperBound
insert into @indextable(nid) select 统一编号 from jgqj_view order by 使用部门
select O.* from jgqj_view O,@indextable t where O.统一编号=t.nid
and t.id>@PageLowerBound and t.id<=@PageUpperBound order by t.id
end
set nocount off
GO
请问 “2-9-074” 是“统一编号”的一个值吗?如果是的话问题就在这,这个标识字段必须是int类型,你看存储过程中那个 nid,它是int类型,在选择记录时就是根据这个临时表的字段的值来和你要选择记录的表的标识字段比较是否相等,相等则选择此标识字段所在的行的记录,一般的标识字段都是int类型的,我没意识到varchar类型的字段也可以作为标识字段,以后有时间改一下。现在要解决你的问题,请修改存储过程中的:
declare @indextable table(id int identity(1,1),nid int)
将最后的 nid int 改为 nid varchar 试试。