数量不多,就170多条,分页存储过程,select *  from tablename
通用的存储过程 ,所以只能用 select * 在PL/SQL里测试存储过程,完全正常。在.net 里调用
OracleDataAdapter.Fill(ds,tablename) OCI-22053: 溢出错误另发现一个奇怪的问题:  当记录数是3的倍数,fill() 正常(如 174,177),不是3的倍数就会出异常请问各位,是什么原因呢?

解决方案 »

  1.   

    --存储过程
    CREATE OR REPLACE PROCEDURE prc_query
     (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_query.cur_query) --返回的结果集
    IS
     v_sql VARCHAR2(1000) := ''; --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 ||   ' and ' || 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' ||   ' and ' || 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_query;--调用 public DataSet GetList(string tableName, int PageSize, int PageIndex, string strWhere, string strOrderField, string strOrderStyle) {
                OracleParameter[] parameters = {
                        new OracleParameter("p_tablename", OracleType.VarChar, 255),
                        new OracleParameter("p_strwhere", OracleType.VarChar,1000),
                        new OracleParameter("p_ordercolumn", OracleType.VarChar, 255),
                        new OracleParameter("p_orderstyle",  OracleType.VarChar, 255),
                        new OracleParameter("p_curpage", OracleType.Number),
                        new OracleParameter("p_pagesize", OracleType.Number),
                        new OracleParameter("p_totalrecords", OracleType.Number),
                        new OracleParameter("p_totalpages", OracleType.Number),
                        new OracleParameter("v_cur", OracleType.Cursor),
                        };
                parameters[0].Value = tableName;
                parameters[1].Value = strWhere;
                parameters[2].Value = strOrderField;
                parameters[3].Value = strOrderStyle;
                parameters[4].Value = PageIndex;
                parameters[5].Value = PageSize;
                parameters[6].Direction = ParameterDirection.Output;
                parameters[7].Direction = ParameterDirection.Output;
                parameters[8].Direction = ParameterDirection.Output;            return DbHelperOra.RunProcedure("prc_query", parameters, "ds");
            } public static DataSet RunProcedure(string storedProcName, IDataParameter[] parameters, string tableName)
    {
    using (OracleConnection connection = new OracleConnection(connectionString))
    {
    DataSet dataSet = new DataSet();
    connection.Open();
    OracleDataAdapter sqlDA = new OracleDataAdapter();
    sqlDA.SelectCommand = BuildQueryCommand(connection, storedProcName, parameters );
    sqlDA.Fill(dataSet, tableName );--异常的地方就是这里 OCI-22053: 溢出错误
    connection.Close();
    return dataSet;
    }
    }
      

  2.   

    楼主,你先直接把这个存储过程放到Oracle数据库执行,看看是否有问题
      

  3.   

    感觉是“sqlDA.SelectCommand = BuildQueryCommand(connection, storedProcName, parameters );”有问题!楼主,Oracle的语法与Sql Server有差别,你把断点设置到这里,看看SelectCommand 的值是什么,把这个sql字符串copy到oracle里执行,问题应该处在这里
      

  4.   

     
    OracleDataAdapter   dataAdapter   =   new   OracleDataAdapter(selectCommand,   connection); 
                                    DataSet   ds   =   new   DataSet(); 
                                    ds.Locale   =   System.Globalization.CultureInfo.CurrentUICulture; 
                                    dataAdapter.Fill(ds); LZ试试这个看
      

  5.   

    LZ以下是我刚找的对应你错误的资料
    ----------------------------
    Oracle 数值数据类型最多可存储 38 个字节的精度。
    当将 Oracle 数值转换为公共语言运行库数据类型时,
    Oracle 值可能会变得过大。这会导致 Oracle OCI-22053 溢出错误。解决方法是用round函数。如何使用 Oracle Round 函數 (四捨五入)描述 : 傳回一個數值,該數值是按照指定的小數位元數進行四捨五入運算的結果。SELECT ROUND( number, [ decimal_places ] ) FROM DUAL參數:number : 欲處理之數值decimal_places : 四捨五入 , 小數取幾位 ( 預設為 0 )Sample :select round(123.456) from dual;              回傳 123select round(123.456, 0) from dual;          回傳 123select round(123.456, 1) from dual;          回傳 123.5select round(123.456, 2) from dual;          回傳 123.46select round(123.456, 3) from dual;          回傳 123.456select round(-123.456, 2) from dual;        回傳 -123.46
      

  6.   

    sqlDA.SelectCommand = BuildQueryCommand(connection, storedProcName, parameters );没发现什么异常呀?
    sqlDA.SelectCommand.Connection.ServerVersion
    "10.2.0.1.0 Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production\nWith the Partitioning, OLAP and Data Mining options"难道  .net 与 10g 的数据库哪里有不兼容的地方?
      

  7.   

    存储过程有误,这段代码是错误的,虽然ORACLE中没报错,但是不符合实际,因为页数必须整数,而你的结果有可能是小数,而且小数位数太大,导致数据溢出:
    --根据页大小计算总页数
     IF MOD(p_totalRecords,p_pageSize) = 0 THEN
     p_totalPages := p_totalRecords / p_pageSize;
     ELSE
     p_totalPages := p_totalRecords / p_pageSize + 1;
     END IF;
    改为这样就可以通过了:
    --根据页大小计算总页数
     p_totalPages := CEIL(p_totalRecords / p_pageSize);
      

  8.   

    --根据页大小计算总页数 p_totalPages := CEIL(p_totalRecords / p_pageSize);这个是正确的