您的位置:首页 > 数据库

[ExtNet]Grid怎么实现服务器端分页、排序、查询?-MS SQL存储过程分页

2012-08-27 00:24 555 查看
存储过程:

CREATE	 procedure   [dbo].[AspNetPage]
@tblName       varchar(1000),        -- 表名
@SelectFieldName    varchar(4000),              -- 要显示的字段名(不要加select)
@strWhere       varchar(4000),              -- 查询条件(注意: 不要加 where)
@OrderFieldName      varchar(255),               -- 排序索引字段名
@PageSize       int ,                 -- 页大小
@PageIndex      int = 1,                  -- 页码
@iRowCount      int output,                 -- 返回记录总数
@OrderType      bit = 0                  -- 设置排序类型, 非 0 值则降序

AS
declare @strSQL    varchar(4000)       -- 主语句
declare @strTmp    varchar(4000)        -- 临时变量
declare @strOrder varchar(400)        -- 排序类型
declare @strRowCount    nvarchar(4000)      -- 用于查询记录总数的语句
set @OrderFieldName=ltrim(rtrim(@OrderFieldName))
if @OrderType != 0
begin
set @strTmp = '<(select min'
set @strOrder = ' order by ' + @OrderFieldName +' desc'
end
else
begin
set @strTmp = '>(select max'
set @strOrder = ' order by ' + @OrderFieldName +' asc'
end
set @strSQL = 'select top ' + str(@PageSize) + @SelectFieldName+' from '
+ @tblName + ' where ' + @OrderFieldName + @strTmp + '('
+ right(@OrderFieldName,len(@OrderFieldName)-charindex('.',@OrderFieldName)) + ') from (select top ' + str((@PageIndex-1)*@PageSize)
+ @OrderFieldName + ' from ' + @tblName + @strOrder + ') as tblTmp)'
+ @strOrder
if @strWhere != ''
set @strSQL = 'select top ' + str(@PageSize) + @SelectFieldName+' from '
+ @tblName + ' where ' + @OrderFieldName + @strTmp + '('
+ right(@OrderFieldName,len(@OrderFieldName)-charindex('.',@OrderFieldName)) + ') from (select top ' + str((@PageIndex-1)*@PageSize)
+ @OrderFieldName + ' from ' + @tblName + ' where ' + @strWhere + ' '
+ @strOrder + ') as tblTmp) and ' + @strWhere + ' ' + @strOrder
if @PageIndex = 1
begin
set @strTmp = ''
if @strWhere != ''
set @strTmp = ' where ' + @strWhere
set @strSQL = 'select top ' + str(@PageSize) + @SelectFieldName+' from '
+ @tblName + @strTmp + ' ' + @strOrder
end
exec(@strSQL)
if @strWhere!=''
begin
set @strRowCount = 'select @iRowCount=count(*) from ' + @tblName+' where '+@strWhere
end
else
begin
set @strRowCount = 'select @iRowCount=count(*) from ' + @tblName
end
exec sp_executesql @strRowCount,N'@iRowCount int out',@iRowCount out

HTML:

<ext:ResourceManager ID="ResourceManager1" runat="server">
</ext:ResourceManager>
<ext:Store runat="server" ID="ItemStore" OnRefreshData="Store1_RefershData">
<Reader>
<ext:JsonReader>
<Fields>
<ext:RecordField Name="MB001" />
<ext:RecordField Name="MB002" />
</Fields>
</ext:JsonReader>
</Reader>
<Proxy>
<ext:PageProxy>
</ext:PageProxy>
</Proxy>
</ext:Store>
<ext:TextField runat="server" ID="txtItem">
</ext:TextField>
<ext:Button runat="server" ID="btnQuery" Text="查询" Icon="Find">
<DirectEvents>
<Click OnEvent="ShowChage"></Click>
</DirectEvents>
</ext:Button>
<ext:GridPanel ID="ItemGrid" runat="server" Border="true" Margins="5 5 5 5" AnchorHorizontal="98%"
Height="550" Icon="Layers" TrackMouseOver="true" StripeRows="true" Title="品号基本信息"
StoreID="ItemStore">
<ColumnModel ID="ColumnModel1" runat="server">
<Columns>
<ext:Column Header="品号" DataIndex="MB001" Width="250">
</ext:Column>
<ext:Column Header="品名" DataIndex="MB002" Width="250">
</ext:Column>
</Columns>
</ColumnModel>
<LoadMask ShowMask="true" />
<SelectionModel>
<ext:RowSelectionModel ID="RowSelectionModel1" runat="server" />
</SelectionModel>
<BottomBar>
<ext:PagingToolbar ID="PagingToolBar1" StoreID="ItemStore" PageSize="3" runat="server" />
</BottomBar>
</ext:GridPanel>

CS:

protected void Store1_RefershData(object sender, StoreRefreshDataEventArgs e)
{
int PageSize = this.PagingToolBar1.PageSize; //获取当前在页面中PagingToolBar 的PageSize的值
int Count = 0;
int CurPage = e.Start / PageSize + 1; //获取当前的页码是多少,也就是第几页
string strWhere = "";
if (txtItem.Text.Trim() != "")
{
strWhere = "  MB001 like '%" + txtItem.Text.Trim() + "%'";
}

var store = this.ItemGrid.GetStore();

DataTable dt = GetPageList("INVMB", " MB001,MB002,MB003", strWhere, PageSize, CurPage, out Count); //连接数据库
e.Total = Count;
this.PagingToolBar1.DisplayMsg = CurPage + " - " + PageSize + "条 共 " + e.Total + " 条";
if (Count > 0)
{
store.DataSource = dt;//绑定数据
store.DataBind();
}
else
{
X.Msg.Alert("查询结果", "<font style='color:red;'>没有找到任何数据!</font>").Show();
}
}
/// <summary>
///
/// </summary>
/// <param name="TableName">表名称</param>
/// <param name="ReturnFields">要显示的字段名</param>
/// <param name="strwhere">查询条件</param>
/// <param name="PageSize">每页显示数据条数</param>
/// <param name="CurPage">当前第几页,页码</param>
/// <param name="RowCount">返回的总页数</param>
/// <returns></returns>
public DataTable GetPageList(string TableName, string ReturnFields, string strwhere, int PageSize, int CurPage, out int RowCount)
{
SqlCommand cmd = new SqlCommand("AspNetPage");//存储过程名称
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.AddWithValue("@tblName", TableName); //表名称
cmd.Parameters.AddWithValue("@OrderFieldName", "MB001");//排序索引字段名
cmd.Parameters.AddWithValue("@PageIndex", CurPage);//当前第几页,页码
cmd.Parameters.AddWithValue("@PageSize", PageSize);//每页显示数据条数
cmd.Parameters.AddWithValue("@SelectFieldName", ReturnFields);//要显示的字段名(不要加select)
cmd.Parameters.AddWithValue("@OrderType", 1);//设置排序类型, 非 0 值则降序
cmd.Parameters.AddWithValue("@strWhere", strwhere);//查询条件(注意: 不要加 where)
cmd.Parameters.Add(new SqlParameter("@iRowCount", SqlDbType.Int));
cmd.Parameters["@iRowCount"].Direction = ParameterDirection.Output;
DataTable dt = RunProcedureCmd(cmd);
RowCount = Convert.ToInt32(cmd.Parameters["@iRowCount"].Value.ToString()); //返回的总页数
return dt;
}
/// <summary>
/// 执行存储过程,返回DataTable
/// </summary>
/// <param name="cmd">存储过程名称</param>
/// <returns></returns>
public DataTable RunProcedureCmd(SqlCommand cmd)
{
DataTable result = new DataTable();
SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["DEMO"].ConnectionString);//你自己的链接字符串
try
{
if ((conn.State == ConnectionState.Closed))
{
conn.Open();
}
cmd.Connection = conn;
SqlDataAdapter da = new SqlDataAdapter(cmd);
da.Fill(result);
da.Dispose();
conn.Close();
conn.Dispose();
return result;
}
catch (Exception ex)
{
conn.Close();
conn.Dispose();
throw ex;
}

}

}

Oracle版本:

create or replace package pkg_AspNetPage is

type mycursor  is ref cursor;

procedure proc_AspNetPage(tblName in varchar2,SelectFieldName in varchar2,strWhere in varchar2,OrderFieldName in varchar2,OrderType in number, start1 in number,limit1 in number,RecoudCount out number,datatable out mycursor );

end pkg_AspNetPage;

create or replace package body pkg_AspNetPage is

procedure proc_AspNetPage(tblName in varchar2,SelectFieldName in varchar2,strWhere in varchar2,OrderFieldName in varchar2,OrderType in number, start1 in number,limit1 in number,RecoudCount out number,datatable out mycursor ) is
sqltxt varchar2(4000);
v_sql varchar2(4000);
v_ordertype varchar2(10);
begin
IF OrderType=0 THEN
v_ordertype:='asc';
ELSE
v_ordertype:='desc';
END IF;

sqltxt:='select * from ' || tblName || ' u where ' || strWhere ||' order by ' || OrderFieldName || ' ' || v_ordertype;
sqltxt:='select rownum rn,t.* from ('||sqltxt||') t';
v_sql:='select count(*) from('||sqltxt||')';

execute immediate v_sql into RecoudCount;
v_sql := 'select '|| SelectFieldName ||' from (' || sqltxt || ') where rn between ' ||start1 || ' and ' || limit1;

open datatable for v_sql;
end proc_AspNetPage;
end pkg_AspNetPage;

CS

using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data;
using System.Text;
using System.Data.OracleClient;
using System.Collections;
//操作函数
public static readonly string CONN_STRING_Oracle = "Data Source=XXXX;Password=XXXX;User ID=XXXX";

public static OracleConnection conn = new OracleConnection(CONN_STRING_Oracle);

public static void OpenConnection()
{
if (conn.State != ConnectionState.Open)
conn.Open();
}

public static void CloseConnection()
{
if (conn.State == ConnectionState.Open)
conn.Close();
}

public static DataTable GetPageList_Oracle(string tblName, string selectFieldName, string strWhere, string OrderFieldName, int OrderType, int start, int limit, out int RecoudCount)
{

try
{
OracleParameter[] optr = new OracleParameter[9];  // 初始化参数

optr[0] = new OracleParameter();
optr[0].ParameterName = "tblName";
optr[0].OracleType = OracleType.VarChar;
optr[0].Value = tblName;

optr[1] = new OracleParameter();
optr[1].ParameterName = "SelectFieldName";
optr[1].OracleType = OracleType.VarChar;
optr[1].Value = selectFieldName;

optr[2] = new OracleParameter();
optr[2].ParameterName = "strWhere";
optr[2].OracleType = OracleType.VarChar;
optr[2].Value = strWhere;

optr[3] = new OracleParameter();
optr[3].ParameterName = "OrderFieldName";
optr[3].OracleType = OracleType.VarChar;
optr[3].Value = OrderFieldName;

optr[4] = new OracleParameter();
optr[4].ParameterName = "OrderType";
optr[4].OracleType = OracleType.Number;
optr[4].Value = OrderType;

optr[5] = new OracleParameter();
optr[5].ParameterName = "start1";
optr[5].OracleType = OracleType.Number;
optr[5].Value = start;

optr[6] = new OracleParameter();
optr[6].ParameterName = "limit1";
optr[6].OracleType = OracleType.Number;
optr[6].Value = limit;

optr[7] = new OracleParameter();
optr[7].ParameterName = "RecoudCount";
optr[7].OracleType = OracleType.Number;
optr[7].Direction = ParameterDirection.Output;

optr[8] = new OracleParameter();
optr[8].ParameterName = "datatable";
optr[8].OracleType = OracleType.Cursor;
optr[8].Direction = ParameterDirection.Output;

OracleCommand cmd = new OracleCommand();
cmd.CommandText = "pkg_AspNetPage.proc_AspNetPage";
cmd.CommandType = CommandType.StoredProcedure;

foreach (OracleParameter soptr in optr)
{
cmd.Parameters.Add(soptr);
}

DataTable dt = RunProcedureCmd(cmd);   //执行存储过程
RecoudCount = Int32.Parse(optr[7].Value.ToString());
return dt;

}
catch
{
RecoudCount = 0;
return null;
}
}

public static DataTable RunProcedureCmd(OracleCommand cmd)
{
DataTable result = new DataTable();
try
{
OpenConnection();
cmd.Connection = conn;
OracleDataAdapter da = new OracleDataAdapter(cmd);
da.SelectCommand.ExecuteNonQuery();
da.Fill(result);
return result;
}
catch (Exception ex)
{
throw ex;
}
finally
{
CloseConnection();
}
}
protected void Store1_RefreshData(object sender, StoreRefreshDataEventArgs e)
{
int PageSize = this.PagingToolBar1.PageSize; //获取当前在页面中PagingToolBar 的PageSize的值
int Count = 0;
int CurPage = e.Start / PageSize + 1; //获取当前的页码是多少,也就是第几页

int start = PageSize * (CurPage - 1) + 1;
int limit = start + PageSize - 1;

string strWhere = "1=1"; //编辑条件
int order=1; //1为倒序,0为顺序
DataTable dt = new DataTable();
dt = Opp.OracleOpp.GetPageList_Oracle("(表名)", "ID,...(字段列表)", strWhere, "ID", order, start, limit, out Count);
Store1.DataSource = dt;
Store1.DataBind();
e.Total = Count;
}

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: