none
求oracle分页存储过程在三层架构中的应用例子? RRS feed

  • 问题

  • oracle分页存储过程:
    CREATE OR REPLACE PROCEDURE FGK.prc_page
           (p_tableName        in  varchar2,   --表名
            p_strWhere         in  varchar2,   --查询条件
            p_orderColumn      in  varchar2,   --排序的列
            p_orderStyle       in  varchar2,   --排序方式
            p_curPage          in out Number,  --当前页
            p_pageSize         in out Number,  --每页显示记录条数
            p_totalRecords     out Number,     --总记录数
            p_totalPages       out Number,     --总页数
            v_cur              out pkg_page.cur_page)   --返回的结果集
    IS
       v_sql VARCHAR2(3000) := '';      --sql语句
       v_startRecord Number(4);         --开始显示的记录条数
       v_endRecord Number(4);           --结束显示的记录条数
    BEGIN
       --记录中总记录条数
       v_sql := 'SELECT TO_NUMBER(COUNT(*)) FROM ' || p_tableName || ' WHERE 1=1';
       IF p_strWhere IS NOT NULL or p_strWhere <> '' THEN
           v_sql := v_sql || p_strWhere;
       END IF;
       EXECUTE IMMEDIATE v_sql INTO p_totalRecords;
       
       --验证页面记录大小
       IF p_pageSize < 0 THEN
           p_pageSize := 0;
       END IF;
       
       --根据页大小计算总页数
       IF MOD(p_totalRecords,p_pageSize) = 0 THEN
           p_totalPages := p_totalRecords / p_pageSize;
       ELSE
           p_totalPages := p_totalRecords / p_pageSize + 1;
       END IF;
       
       --验证页号
       IF p_curPage < 1 THEN
           p_curPage := 1;
       END IF;
       IF p_curPage > p_totalPages THEN
           p_curPage := p_totalPages;
       END IF;
       
       --实现分页查询
       v_startRecord := (p_curPage - 1) * p_pageSize + 1;
       v_endRecord := p_curPage * p_pageSize;
       v_sql := 'SELECT * FROM (SELECT A.*, rownum r FROM ' ||
                '(SELECT * FROM ' || p_tableName;
       IF p_strWhere IS NOT NULL or p_strWhere <> '' THEN
           v_sql := v_sql || ' WHERE 1=1' || p_strWhere;
       END IF;
       IF p_orderColumn IS NOT NULL or p_orderColumn <> '' THEN
           v_sql := v_sql || ' ORDER BY ' || p_orderColumn || ' ' || p_orderStyle;
       END IF;
       v_sql := v_sql || ') A WHERE rownum <= ' || v_endRecord || ') B WHERE r >= '
                || v_startRecord;
       DBMS_OUTPUT.put_line(v_sql);
       OPEN v_cur FOR v_sql;
    END prc_page;
    /
    Model层代码:
     public class PageInfo
        {
    
            // 定义
            private string p_tableName;  //-表名
            private string p_strWhere;    //  --查询条件
            private string p_orderColumn; //  --排序的列
            private string p_orderStyle;  // --排序方式
            private int p_curPage;       //--当前页
            private int p_pageSize;      // --每页显示记录条数
            private int p_totalRecords;   // --总记录数
            private int p_totalPages;     // --总页数
    
            /// <summary>
            /// 定义函数
            /// </summary>
            public PageInfo() { }
    
            /// <summary>
            /// 
            /// </summary>
            /// <param name="fgmasterid"></param>
            /// <param name="fgmastertile"></param>
            public PageInfo(string p_tableName, string p_strWhere, string p_orderColumn, string p_orderStyle, int p_curPage, int p_pageSize, int p_totalRecords, int p_totalPages)
            {
                this.p_tableName = p_tableName;
                this.p_strWhere = p_strWhere;
                this.p_orderColumn = p_orderColumn;
                this.p_orderStyle = p_orderStyle;
                this.p_curPage = p_curPage;
                this.p_pageSize = p_pageSize;
                this.p_totalRecords = p_totalRecords;
                this.p_totalPages = p_totalPages;
    
            }
    
            /// <summary>
            /// 查询的表名
            /// </summary>
            public string P_tableName
            {
                get { return p_tableName; }
                set { p_tableName = value; }
            }
            /// <summary>
            /// 查询条件
            /// </summary>
            public string P_strWhere
            {
                get { return p_strWhere; }
                set { p_strWhere = value; }
            }
            /// <summary>
            /// 排序的列
            /// </summary>
            public string P_orderColumn
            {
                get { return p_orderColumn; }
                set { p_orderColumn = value; }
            }
            /// <summary>
            /// 排序方式
            /// </summary>
            public string P_orderStyle
            {
                get { return p_orderStyle; }
                set { p_orderStyle = value; }
            }
            /// <summary>
            /// 当前页
            /// </summary>
            public int P_curPage
            {
                get { return p_curPage; }
                set { p_curPage = value; }
            }
            /// <summary>
            /// 每页显示记录条数
            /// </summary>
            public int P_pageSize
            {
                get { return p_pageSize; }
                set { p_pageSize = value; }
            }
            /// <summary>
            /// 总记录数
            /// </summary>
            public int P_totalRecords
            {
                get { return p_totalRecords; }
                set { p_totalRecords = value; }
            }
            /// <summary>
            /// 总页数
            /// </summary>
            public int P_totalPages
            {
                get { return p_totalPages; }
                set { p_totalPages = value; }
            }
        }
    
    • 已移动 Sheng Jiang 蒋晟Moderator 2009年7月6日 16:05 请求的是数据库开发方面的帮助 (发件人:ASP.NET 与 AJAX)
    2009年7月5日 14:52

答案

全部回复

  • 请大家帮我完善DAL层的代码:谢谢各位我是刚学

    DAL层:
       /// <summary>
            /// 
            /// </summary>
            /// <param name="p_tableName"> 表名</param>
            /// <param name="p_strWhere">查询条件</param>
            /// <param name="p_orderColumn">排序字段</param>
            /// <param name="p_orderStyle">排序方式</param>
            /// <param name="p_curPage">当前页</param>
            /// <param name="p_pageSize">每页显示的记录数</param>
            /// <param name="p_totalRecords">总记录数</param>
            /// <param name="p_totalPages">总页数</param>
            /// <returns></returns>
            public List<PageInfo>  SelectId(string p_tableName, string p_strWhere, string p_orderColumn, string p_orderStyle, int p_curPage, int p_pageSize, int p_totalRecords, int p_totalPages)
            {
               
                OracleParameter [] pageparm=
                    {               
                        new OracleParameter(":p_tableName",OracleType.Char ,1000),
                        new OracleParameter(":p_strWhere",OracleType.Char ,1000),
                        new OracleParameter(":p_orderColumn",OracleType.Char ,1000),
                        new OracleParameter(":p_orderStyle",OracleType.Char ,1000),
                        new OracleParameter(":p_curPage",OracleType.Int32 ,1000),
                        new OracleParameter(":p_pageSize",OracleType.Int32 ,1000),
                        new OracleParameter(":p_totalRecords",OracleType.Int32 ,1000),
                        new OracleParameter(":p_totalPages",OracleType.Int32,1000),
                    };
                //给参数赋值
                pageparm[0].Value = p_tableName;
                pageparm[1].Value = p_strWhere;
                pageparm[2].Value = p_orderColumn;
                pageparm[3].Value = p_orderStyle;
                pageparm[4].Value = p_curPage;
                pageparm[5].Value = p_pageSize;
                pageparm[6].Value = p_totalRecords;
                pageparm[7].Value = p_totalPages;
                
                List<IfgtextInfo> Fgtextdm = new List<IfgtextInfo>();
    
                using (OracleDataReader rdr = OracleHelper.ExecuteReader(OracleHelper.ConnectionStringLocalTransaction, CommandType.StoredProcedure, prc_page, pageparm))
                {
                    while (rdr.Read())
                    {
                        IfgtextInfo fgtextcx = new IfgtextInfo(
                            rdr.GetValue(0).ToString(),
                            rdr.GetValue(1).ToString(),
                            rdr.GetValue(2).ToString(),
                            rdr.GetValue(3).ToString(),
                            rdr.GetValue(4).ToString(),
                            rdr.GetValue(5).ToString(),
                            rdr.GetValue(6).ToString(),
                            rdr.GetValue(7).ToString(),
                            rdr.GetValue(8).ToString(),
                            rdr.GetValue(9).ToString(),
                            rdr.GetValue(10).ToString(),
                            rdr.GetValue(11).ToString(),
                            rdr.GetValue(12).ToString());
                        //IfgtextInfo fgtextcx = new IfgtextInfo(null, rdr.GetString(0), null, null, null, rdr.GetString(1), rdr.GetString(2), rdr.GetString(3), null, rdr.GetString(4), null, null, null);
                        Fgtextdm.Add(fgtextcx);
    
                    }
                    return Fgtextdm;
                }
    
            }

    谢谢各位抽点时间帮我看看写一下DAL层的代码啊,或者给一个实例也行,谢谢!!!!

     

     

    2009年7月5日 14:54
  • 写的不错 你以为自己写得好就行了 每个人写的风格不同
    没必要写的最好 尽管写的最好 过段时间再来看觉得垃圾了
    2009年7月5日 15:37
  • 大家帮我改改DAL层的代码啊,我是刚学呀,上面的代码还运行不了呢?
    2009年7月6日 0:45
  • public DataTable SelectId(PageInfo fPageInfo)
    {
    
        OracleParameter[] pageparm =
                {               
                    new OracleParameter(":p_tableName",OracleType.Char ,1000),
                    new OracleParameter(":p_strWhere",OracleType.Char ,1000),
                    new OracleParameter(":p_orderColumn",OracleType.Char ,1000),
                    new OracleParameter(":p_orderStyle",OracleType.Char ,1000),
                    new OracleParameter(":p_curPage",OracleType.Int32 ,1000),
                    new OracleParameter(":p_pageSize",OracleType.Int32 ,1000),
                    new OracleParameter(":p_totalRecords",OracleType.Int32 ,1000),
                    new OracleParameter(":p_totalPages",OracleType.Int32,1000),
                };
        //给参数赋值
        pageparm[0].Value = fPageInfo.P_tableName;
        pageparm[1].Value = fPageInfo.P_strWhere;
        pageparm[2].Value = fPageInfo.P_orderColumn;
        pageparm[3].Value = fPageInfo.P_orderStyle;
        pageparm[4].Value = fPageInfo.P_curPage;
        pageparm[5].Value = fPageInfo.P_pageSize;
        pageparm[6].Value = fPageInfo.P_totalRecords;
        pageparm[7].Value = fPageInfo.P_totalPages;
    
        // 既然你的分页存储过程定位是通用的,那么这里你应该返回 DataTable 而不是具体的实体
        return OracleHelper.ExecuteDataSet(OracleHelper.ConnectionStringLocalTransaction, CommandType.StoredProcedure, prc_page, pageparm).Tables[0];
    }


    知识改变命运,奋斗成就人生!
    2009年7月6日 5:03
    版主
  • 谢谢X.X.Y版主的回复,我用的是Pet Shop 4.0里的OracleHelper数据库操作类,里面没有定义ExecuteDataSet方法,是不是要单独写一个ExecuteDataSet方法呢?要是单独写应该怎么写,谢谢!!!
    2009年7月6日 6:36
  • 你可以参照 SqlHelper 的写法,把数据操作对象换成 OracleClient 的
    知识改变命运,奋斗成就人生!
    2009年7月6日 6:49
    版主
  • 给个例子啊,我是刚学的,这个问题搞了几天了都没搞懂.

    2009年7月6日 6:54
  • 给个例子啊,我是刚学的,这个问题搞了几天了都没搞懂.


    建议你一开始用ADO.NET进行操作,理解一下ADO.NET,当别人给你建议的时候你说“我是刚学的,搞了几天没有搞懂”,那就是你自己的问题了,其实代码页不是很难,主要就是。

    打开连接
    创建cmd对象
    执行操作
    关闭连接

    PetShop里面的默认是SQL语句而不是存储过程,如果你需要的话,可以自己写一个存储过程的ExecuteDataSet方法,仿照里面的来写。

    我相信这样你会有更好的提高。
    我的博客,最近新写了一个Windows Mobile 6.5 Widget开发的文章,欢迎捧场
    尽力回答每一个问题,但不代表一定正确,希望初学者能够多自己尝试。。共勉。。:)
    2009年7月6日 7:20
    版主
  • // 在 OracleHelper 中加入 
    public static DataSet ExecuteDataset(OracleConnection connection, CommandType cmdType, string cmdText, params OracleParameter[] commandParameters)
    {
        OracleCommand cmd = new OracleCommand();
        PrepareCommand(cmd, connection, null, cmdType, cmdText, commandParameters);
    
        using (OracleDataAdapter da = new OracleDataAdapter(cmd))
        {
            DataSet ds = new DataSet();
            da.Fill(ds);
            cmd.Parameters.Clear();
            return ds;
        }
    }


    知识改变命运,奋斗成就人生!
    2009年7月6日 8:04
    版主
  •        /// <summary>
            /// 执行一条返回结果集的OracleCommand命令,通过专用的连接字符串。
            /// 使用参数数组提供参数
            /// </summary>
            /// <remarks>
            /// 使用示例:  
            ///  OracleDataReader r = ExecuteReader(connString, CommandType.StoredProcedure, "PublishOrders", new OracleParameter("@prodid", 24));
            /// </remarks>
            /// <param name="connectionString">一个有效的数据库连接字符串</param>
            /// <param name="commandType">OracleCommand命令类型 (存储过程, T-SQL语句, 等等。)</param>
            /// <param name="commandText">存储过程的名字或者 T-SQL 语句</param>
            /// <param name="commandParameters">以数组形式提供OracleCommand命令中用到的参数列表</param>
            /// <returns>返回一个包含结果的OracleDataReader</returns>
            public static OracleDataReader ExecuteReader(string connectionString, CommandType cmdType, string cmdText, params OracleParameter[] commandParameters)
            {
                OracleCommand cmd = new OracleCommand();
                OracleConnection conn = new OracleConnection(connectionString);
    
                // 在这里使用try/catch处理是因为如果方法出现异常,则OracleDataReader就不存在,
                //CommandBehavior.CloseConnection的语句就不会执行,触发的异常由catch捕获。
                //关闭数据库连接,并通过throw再次引发捕捉到的异常。
                try
                {
                    PrepareCommand(cmd, conn, null, cmdType, cmdText, commandParameters);
                    OracleDataReader rdr = cmd.ExecuteReader(CommandBehavior.CloseConnection);
                    cmd.Parameters.Clear();
                    return rdr;
                }
                catch
                {
                    conn.Close();
                    throw;
                }
            }
       楼上的朋友和OracleHelper里的ExecuteReader方法差不多,是不是可以用原来的那个?
    2009年7月6日 8:45
  • 你要看他支持的类型,是SQL语句还是存储过程
    我的博客,最近新写了一个Windows Mobile 6.5 Widget开发的文章,欢迎捧场
    尽力回答每一个问题,但不代表一定正确,希望初学者能够多自己尝试。。共勉。。:)
    2009年7月6日 9:01
    版主
  • 你使用 DataReader 也是可以的,只是返回的对象不一样而已
    知识改变命运,奋斗成就人生!
    2009年7月6日 9:13
    版主
  •         OracleParameter [] pageparm=
                    {               
                        new OracleParameter(":p_tableName",OracleType.Char ,1000),
                        new OracleParameter(":p_strWhere",OracleType.Char ,1000),
                        new OracleParameter(":p_orderColumn",OracleType.Char ,1000),
                        new OracleParameter(":p_orderStyle",OracleType.Char ,1000),
                        new OracleParameter(":p_curPage",OracleType.Int32 ,1000),
                        new OracleParameter(":p_pageSize",OracleType.Int32 ,1000),
                        new OracleParameter(":p_totalRecords",OracleType.Int32 ,1000),
                        new OracleParameter(":p_totalPages",OracleType.Int32,1000),
                    };
                //给参数赋值
                pageparm[0].Value = p_tableName;
                pageparm[1].Value = p_strWhere;
                pageparm[2].Value = p_orderColumn;
                pageparm[3].Value = p_orderStyle;
                pageparm[4].Value = p_curPage;
                pageparm[5].Value = p_pageSize;
                pageparm[6].Value = p_totalRecords;
                pageparm[7].Value = p_totalPages;
        
    上面的赋值要给参数添加输入输出类型吗?
    cmd.Parameters.Add("p_tableName",OracleType.VarChar,50);    //表  名
     cmd.Parameters["p_tableName"].Direction = ParameterDirection.Input;
     cmd.Parameters["p_tableName"].Value     = p_tableName;
    如果需要,应该怎么添加?
    2009年7月7日 4:08
  • 默认是 Input , OutPut 需要单独指定,建议你了解一下 ADO.NET 的基础知识
    知识改变命运,奋斗成就人生!
    2009年7月7日 4:10
    版主