由于客户对速度和性能上的要求越来越变态,而数据量一天天的庞大,因此本人产生了数据的查询和分页完全由客户端回调来实现。想法看上去复杂,实现起来也不难。废话不多说,看程序吧。
一、存储过程
包头:
create or replace package H_QUERYPACK is
 -- Author : Evorul
 -- Created : 2007-3-29
 -- Purpose : 查询机构表
 
 -- Public type declarations
 type MYCURSOR is REF CURSOR;
 PROCEDURE QUERYLOG (RET_CURSOR OUT MYCURSOR,ERRORCODE OUT INT,p_logID int,p_StartTime Date,p_EndTime Date,p_Operator varchar2 ,p_OrderField varchar2 ,
 p_Desc int,p_PageSize Int,p_PageIndex Int,p_RecordCount Out Int);
end H_QUERYPACK;
 
包体:
 create or replace package body H_QUERYPACK Is
 -- Author : Evorul
 -- Created : 2007-3-29
 -- Purpose : 查询
 
 -- 查询公司,分页用
 PROCEDURE QUERYLOG (RET_CURSOR OUT MYCURSOR,ERRORCODE OUT INT,p_logID int,p_StartTime Date,p_EndTime Date,p_Operator varchar2 ,p_OrderField varchar2 ,
 p_Desc int,p_PageSize Int,p_PageIndex Int,p_RecordCount Out Int)
 AS
 v_sql varchar2(3000);
 v_sqlcount varchar2(3000);
 v_orderfield varchar2(100);
 v_order VARCHAR2(5); --顺序
 v_count int;
 v_heiRownum int;
 v_lowRownum int;
 BEGIN
 ERRORCODE:=0;
 v_sql:='select * from LOG Where 1=1 ';
 if(p_logID <> 0)then
 v_sql := v_sql || ' and id = ' || TO_CHAR(p_logID);
 end if;
 IF p_Operator Is Not Null Then then
 v_sql := v_sql || 'And operator LIKE ''%' || RTRIM(LTRIM(p_Operator))||'%'''; 
 end if;
 v_sql := v_sql ||' and (TO_CHAR(time,''YYYYMMDD'') between ''' || to_char(p_StartTime, 'YYYYMMDD') ||''' and ''' || to_char(p_EndTime, 'YYYYMMDD') ||''')';
 
 ----取记录总数
 v_sqlcount := 'select count(*) from (' || v_sql || ')';
 execute immediate v_sqlcount into v_count;
 p_RecordCount := v_count;
 --排序字段
 IF p_OrderField IS NOT NULL THEN
 v_orderfield:=p_OrderField;
 Else
 v_orderfield:='ID';
 END IF;
 --是否降序
 IF p_Desc <>0 THEN
 v_order:=' ASC';
 Else
 v_order:=' DESC';
 END IF;
 
 v_sql:=v_sql || 'ORDER BY '|| v_orderfield || v_order;
 ----执行分页查询
 v_heiRownum := p_PageIndex * p_PageSize;
 v_lowRownum := v_heiRownum - p_PageSize + 1;
 v_sql := 'SELECT * FROM (
 SELECT A.*, rownum rn FROM ('|| v_sql ||') A WHERE rownum <= '|| to_char(v_heiRownum) || ') B WHERE rn >= ' || to_char(v_lowRownum) ;
 OPEN RET_CURSOR FOR v_sql;
 EXCEPTION
 WHEN NO_DATA_FOUND THEN
 ERRORCODE:=9999;
 WHEN OTHERS THEN
 ERRORCODE:=9999;
 END QUERYLOG;
 
 END H_QUERYPACK;
 二、程序
DataAccess.cs
 
using System;
using System.Data;
using System.Data.OracleClient;
using System.Collections;
using System.Collections.Specialized;
/**//// 
///数据层 author: EvoRul date:2007-03-29
/// 
public class DataAccess
...{
 /**//// 
 /// 返回数据库连接字符串
 /// 
 public static String DatabaseConnectionString
 ...{
 get
 ...{
 NameValueCollection configSettings = (NameValueCollection)System.Configuration.ConfigurationManager.GetSection("appSettings");
 return configSettings["connectionString"];
 }
 }
 /**//// 
 /// 返回每一页显示的纪录数
 /// 
 public static int RowsPerPage
 ...{
 get
 ...{
 NameValueCollection configSettings = (NameValueCollection)System.Configuration.ConfigurationManager.GetSection("appSettings");
 return Convert.ToInt32(configSettings["rowsPerPage"]);
 }
 }
 /**//// 
 /// 获取特定日志集合
 /// 
 /// 日志类型
 /// 操作人
 /// 排序字段
 /// 是否升序 0-降序,1-升
 /// 页码
 /// 页行数
 /// 符合条件的总记录数
 /// 
 public static ArrayList QueryLog(string strOperator,DateTime dtStartTime,DateTime dtEndTime, string strOrderField,
 int intASC, int PageIndex, int rowCount, out int recordSum)
 ...{
 // 返回集合
 ArrayList myArrayList = new ArrayList();
 // 创建连接
 OracleConnection myConnection = new OracleConnection(DatabaseConnectionString);
 try
 ...{
 // 打开连接
 myConnection.Open();
 }
 catch (Exception ex)
 ...{
 throw (ex);
 }
 try
 ...{
 // 创建存储过程
 OracleCommand myCommand = new OracleCommand("H_QUERYPACK.QUERYLOG", myConnection);
 myCommand.CommandType = CommandType.StoredProcedure;
 OracleDataReader dr;
 // ============================== 参数定义 ==============================
 // 返回值
 myCommand.Parameters.Add("RET_CURSOR", OracleType.Cursor);
 myCommand.Parameters["RET_CURSOR"].Direction = ParameterDirection.Output;
 OracleParameter ret = myCommand.Parameters.Add("ERRORCODE", OracleType.Int32);
 ret.Direction = ParameterDirection.Output;
 OracleParameter retCountSum = myCommand.Parameters.AddWithValue("p_RecordCount", OracleType.Int32);
 retCountSum.Direction = ParameterDirection.Output;
 // 编号
 myCommand.Parameters.AddWithValue("p_logID", OracleType.Int32).Value = 0;
 // 用户编号
 myCommand.Parameters.AddWithValue("p_Operator", OracleType.VarChar).Value = strOperator;
 // 时间下限
 myCommand.Parameters.AddWithValue("p_StartTime", OracleType.DateTime).Value = dtStartTime;
 // 时间上限
 myCommand.Parameters.AddWithValue("p_EndTime", OracleType.DateTime).Value =dtEndTime;
 // 排序字段
 myCommand.Parameters.AddWithValue("p_OrderField", OracleType.VarChar).Value = strOrderField;
 // 怎么排序
 myCommand.Parameters.AddWithValue("p_Desc", OracleType.Int32).Value = intASC;
 // 每页行数
 myCommand.Parameters.AddWithValue("p_PageSize", OracleType.Int32).Value = rowCount;
 //页码
 myCommand.Parameters.AddWithValue("p_PageIndex", OracleType.Int32).Value = PageIndex;
 
 // ============================ 参数定义完毕 ============================
 // 执行存储过程
 dr = myCommand.ExecuteReader();
 // 执行未成功
 if (Convert.ToInt32(ret.Value) != 0)
 throw new Exception("执行存储过程出错!");
 // 总记录数
 recordSum = Convert.ToInt32(retCountSum.Value);
 while (dr.Read())
 ...{
 // 创建新日志
 Log log = new Log();
 //操作业务类型
 if (dr["operationtype"] != DBNull.Value)
 ...{
 log.OperationType = Convert.ToString(dr["operationtype"]);
 }
 // 时间
 if (dr["time"] != DBNull.Value)
 log.Time = Convert.ToDateTime(dr["time"]);
 // 用户
 if (dr["operator"] != DBNull.Value)
 ...{
 log.Operator = Convert.ToString(dr["operator"]);
 }
 // 信息
 if (dr["info"] != DBNull.Value)
 log.Info = Convert.ToString(dr["info"]);
 // 加入返回集合
 myArrayList.Add(log);
 }
 dr.Close();
 return myArrayList;
 }
 catch (Exception ex)
 ...{
 throw (ex);
 }
 finally
 ...{
 myConnection.Close();
 }
 }
}
 
DataLogic.cs
 
using System;
using System.Data;
using System.Configuration;
using System.Collections;
/**//// 
/// 业务逻辑层 author: EvoRul date:2007-03-29
/// 
public class DataLogic
...{
 public DataLogic()
 ...{
 }
 public static int recordSum = 0;
 
 /**//// 
 /// 查询日志
 /// 
 /// 操作人
 /// 时间范围下限
 /// 时间上限
 /// 页码
 /// 
 public static IEnumerable GetLogData(string strOperator,DateTime dtStarTime,DateTime dtEndTime, string Pageid)
 ...{
 return Log.GetList(strOperator,dtStarTime,dtEndTime,"time",1, Convert.ToInt32(Pageid),DataAccess.RowsPerPage,out recordSum);
 }
}
 
Log.cs
 
using System;
using System.Data;
using System.Collections;
/**//// 
/// 日志类
/// 
public class Log
...{
 // ============================== 成员 ==============================
 protected string operationType;
 /**//// 
 /// 时间
 /// 
 protected DateTime time = new DateTime();
 /**//// 
 /// 用户
 /// 
 protected string m_operator;
 /**//// 
 /// 信息
 /// 
 protected string info = "";
 // ============================== 属性 ==============================
 public string OperationType
 ...{
 get ...{ return operationType; }
 set ...{ operationType = value; }
 }
 /**//// 
 /// 时间
 /// 
 public DateTime Time
 ...{
 get ...{ return time; }
 set ...{ time = value; }
 }
 /**//// 
 /// 用户
 /// 
 public string Operator
 ...{
 get ...{ return m_operator; }
 set ...{ m_operator = value; }
 }
 /**//// 
 /// 信息
 /// 
 public string Info
 ...{
 get ...{ return info; }
 set ...{ info = value; }
 }
 // ============================== 方法 ==============================
 /**//// 
 /// 创建空日志实例
 /// 
 public Log()
 ...{
 }
 /**//// 
 /// 新增日志
 /// 
 public void Add()
 ...{
 try
 ...{
 // 暂不支持该方法
 throw new Exception("新增日志");
 }
 catch (Exception ex)
 ...{
 throw (ex);
 }
 }
 /**//// 
 /// 修改日志(不支持)
 /// 
 public void Modify()
 ...{
 // 暂不支持该方法
 throw new Exception("修改日志");
 }
 /**//// 
 /// 删除日志
 /// 
 public void Del()
 ...{
 // 暂不支持该方法
 throw new Exception("修改日志");
 }
 /**//// 
 /// 获取特定的日志集
 /// 
 /// 操作人
 /// 开始时间
 /// 结束时间
 /// 排序字段
 /// 0-降序,1-升序
 /// 页码
 /// 页行数
 /// 总记录数
 /// 
 public static ArrayList GetList(string strOperator,DateTime dtStartTime,DateTime dtEndTime,string strOrderField,int intASC, int PageIndex, int rowCount, out int recordSum)
 ...{
 return DataAccess.QueryLog(strOperator,dtStartTime,dtEndTime,strOrderField, intASC, PageIndex, rowCount, out recordSum);
 }
}
 
前台页 Default.aspx
 
<%...@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>
http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
http://www.w3.org/1999/xhtml" >
 客户端回调    
Default.aspx.cs
 
using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.IO;
using System.Text;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;
using System.Globalization;
public partial class _Default : System.Web.UI.Page,ICallbackEventHandler
...{
 protected void Page_Load(object sender, EventArgs e)
 ...{
 this.Submit.Attributes.Add("onclick", "QueryServer(txtOperator,TxtStartTime,TxtEndTime,1,"true");return false;");
 this.DownListIndex.Attributes.Add("onchange", "QueryServer(txtOperator,TxtStartTime,TxtEndTime,this.value,"false");return false;");
 }
 回调分页#region 回调分页
 private string serverReturn;
 public string GetCallbackResult()
 ...{
 string[] parts = serverReturn.Split('|');
 //根据传递的方法名进行调用,并传递相应的参数,目前只支持一个参数
 return (string)GetType().GetMethod(parts[0]).Invoke(this, new object[] ...{ parts[1] });
 }
 public void RaiseCallbackEvent(string eventArgument)
 ...{
 serverReturn = eventArgument;
 }
 /**//// 
 /// 根据从客户端传来的值,对GridView的内容进行更新,并将更新后的GridView的html返回
 /// 
 /// 
 /// 
 public string ServerMethodQuery(string arg)
 ...{
 Logs.DataSourceID = "DataSourceLog";
 string[] arrayArg = arg.Split('$');
 this.txtOperator.Text = arrayArg[0];
 this.TxtStartTime.Text= arrayArg[1];
 this.TxtEndTime.Text = arrayArg[2];
 intialPageSelect();
 this.DownListIndex.SelectedValue = arrayArg[3];
 Logs.DataBind();
 //传入客户端字符串,并用"$"分割
 StringBuilder strHtml = new StringBuilder();
 strHtml.Append(RenderControl(Logs));
 strHtml.Append("$");
 strHtml.Append(DataLogic.recordSum.ToString());
 strHtml.Append("$");
 strHtml.Append(Convert.ToString(DataLogic.recordSum / DataAccess.RowsPerPage + 1));
 strHtml.Append("$");
 strHtml.Append(arrayArg[3]);
 if (arrayArg[4] == "true")
 ...{
 strHtml.Append("$");
 intialPageSelect();
 strHtml.Append(RenderControl(DownListIndex));
 }
 return strHtml.ToString();
 }
 private string RenderControl(Control control)
 ...{
 StringWriter writer1 = new StringWriter(CultureInfo.InvariantCulture);
 HtmlTextWriter writer2 = new HtmlTextWriter(writer1);
 control.RenderControl(writer2);
 writer2.Flush();
 writer2.Close();
 return writer1.ToString();
 }
 /**//// 
 /// 初始化页下拉单
 /// 
 private void intialPageSelect()
 ...{
 DownListIndex.Items.Clear();
 for (int i = 0; i < (DataLogic.recordSum / DataAccess.RowsPerPage + 1); i++)
 ...{
 this.DownListIndex.Items.Add(Convert.ToString(i + 1));
 }
 }
 #endregion 
}
 如有错误,欢迎指正!
赞
If you have any requirements, please contact webmaster。(如果有什么要求,请联系站长)
 
 
QQ:154298438
QQ:417480759