数量不多,就170多条,分页存储过程,select * from tablename
通用的存储过程 ,所以只能用 select * 在PL/SQL里测试存储过程,完全正常。在.net 里调用
OracleDataAdapter.Fill(ds,tablename) OCI-22053: 溢出错误另发现一个奇怪的问题: 当记录数是3的倍数,fill() 正常(如 174,177),不是3的倍数就会出异常请问各位,是什么原因呢?
解决方案 »
- 一个很简单的问题,但是自己钻牛角尖了见,帮忙看看。
- C#中怎样清楚ListView指定的一行
- 这种错误怎么解决
- axWebBrowser1怎么通过name获取元素??
- 如何实现在线下载,没分了大家帮帮忙
- winform中如何在 datagrid中 改变某个cell的内容
- 在安装最新的微软更新后,调用COM出错,“因为配置类型不正确,系统无法开始服务器进程。请检查用户名和密码。”?
- 请教各位高手,C#中如何调用Matlab文件
- Visual C#程序设计严月浩版课后练习答案
- 「玩一玩」Swift编程语言(中文版)(拜读原文中,未完待续)
- 请问c#操作word时,怎样将光标定位到某一页的第一行?
- 怎么改写DataGridView中某一列的值
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;
}
}
OracleDataAdapter dataAdapter = new OracleDataAdapter(selectCommand, connection);
DataSet ds = new DataSet();
ds.Locale = System.Globalization.CultureInfo.CurrentUICulture;
dataAdapter.Fill(ds); 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
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 的数据库哪里有不兼容的地方?
--根据页大小计算总页数
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);