首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > Java Web开发 >

java调用mssql存储过程后,记录集的返回为null解决方案

2012-04-01 
java调用mssql存储过程后,记录集的返回为null存储过程:createprocproc_pageList(@tabNamevarchar(100),@co

java调用mssql存储过程后,记录集的返回为null
存储过程:
create   proc   proc_pageList
(
        @tabName   varchar(100),
        @columnName   varchar(200),
        @idName   varchar(100),
        @pageSize   int,
        @pageIndex   int,
        @pageCounts   int   output,
        @rowCounts   int   output
)
as
select   @rowCounts   =   count(*)   from   buymessageinfo--@tabName
set   @pageCounts   =   Ceiling(@rowCounts   *1.0   /   @pageSize)
Declare   @sql   nvarchar(200)
if   @pageIndex   <   @pageCounts
        set   @sql   =   'Select   '+@columnName+ '   from   (select   top   '+   str(@pageSize)   + '   *   from   (select   top   '+   str(@pageIndex   *   @pageSize)   + '   *   from   buymessageinfo)   as   tab1   order   by   '+@idName+ '   desc)   as   tab2   order   by   '+@idName
else
        set   @sql   =   'Select   '+@columnName+ '   from   (select   top   '+   str(@rowCounts-(@pageIndex-1)*@pageSize)   + '   *   from   (select   *   from   buymessageinfo)   as   tab1   order   by   '+@idName+ '   desc)   as   ta2   order   by   '+@idName
exec   (@sql)


java:
public   static   ArrayList   execProcPageList(String   procSql,String   tableName,String   colunm,String   IdName,int   pageSize,   int   pageIndex)
{
ArrayList   al   =   new   ArrayList();
try   {
getConn();
cstmt   =   conn.prepareCall(procSql);
cstmt.setString(1,tableName);
cstmt.setString(2,colunm);
cstmt.setString(3,   IdName);
cstmt.setInt(4,   pageSize);
cstmt.setInt(5,pageIndex);
cstmt.registerOutParameter(6,   java.sql.Types.INTEGER);
cstmt.registerOutParameter(7,   java.sql.Types.INTEGER);
//cstmt.execute();
rs   =   cstmt.executeQuery();
rs   =   cstmt.getResultSet();
int   pageCounts   =   cstmt.getInt(6);
int   rowCounts   =   cstmt.getInt(7);
System.out.println(rs.next());
System.out.println(pageCounts);
System.out.println(rowCounts);
}   catch   (Exception   e)   {e.printStackTrace();}
finally
{
try   {
if(!conn.isClosed())
{
cstmt.close();
rs.close();
conn.close();
}
}   catch   (SQLException   e)   {e.printStackTrace();}
}
return   al;

}

打印出来的结果:
false
4
14
0

为什么rs.next()这false的呢?基本上其它的方法都试过了。

[解决办法]
你的方法用错了,首先要用registerOutParameter方法注册你要返回的参数,给你个例子吧
public String getSQL(String message_id){
String result = " ";
String sql = "{call dbo.usp_generate_filter_query(?,?)} ";
Connection conn = null;
CallableStatement cstmt = null;
try{
conn = ConnectionManager.getConn(GlobalSettings.CLIENT_ADMIN_DB);


cstmt = conn.prepareCall(sql);
cstmt.setInt(1,Integer.parseInt(message_id));
cstmt.registerOutParameter(2,Types.VARCHAR);
cstmt.execute();
result = cstmt.getString(2);
cstmt.close();
ConnectionManager.close(conn);
}catch(Exception e){
logger.debug( "Exception in getSQL in SqlFunc ");
ConnectionManager.close(conn);
e.printStackTrace();
}
return result;
}
[解决办法]
给你个oracle存储分页功能的:
create or replace procedure Show_Veh_pagination
(p_pageSize in int,
p_pageNo in int,
p_SqlSelect in varchar2,
p_SqlCountSelect in varchar2,
p_outCount out int,
p_outCursor out sys_refcursor)
is
v_sql varchar2(3000);
v_count int;
v_heiRowcount int;
v_lowRowcount int;
begin
p_outCount := 0 ;
if length(p_SqlCountSelect) > 0 then
execute immediate p_SqlCountSelect into v_count;
p_outCount := v_count;
end if;

v_heiRowcount := p_pageSize * p_pageNo;
v_lowRowcount := v_heiRowcount – p_pageSize + 1;

v_sql := ‘select t.* from
(select v.*,rownum as r from (‘||p_SqlSelect ||’) v
where rownum <= ‘|| v_heiRowcount ||’) t
where t.r > = ‘|| v_lowRowcount ||’’;

open p_outCursor for v_sql;
end Show_Veh_pagination;

//------在页面中的调用,因为我使用的是c#.net,所以,只能给你这个了
Oracleconnection Cn = new Oracleconnection(…..);
Cn.open();
DataTable dt = GetData(10,1,”select * from TableName order by column [ desc | asc ]”,Cn);
DataGrid.DataSouce = dt;
DataGrid.DataBind();

Private DataTable GetData (int pageSize,int pageNo,string sql,Oracleconnection cn)
{
Oraclecommand Comm. = new Oraclecommand();
Comm.connection = cn;
Comm..commandText = “Show_page”;
Comm..commandType = commandType. StoredProcedure;

Comm.Parameters.add(“p_pageSize”,Oracle.Float,50);
Comm.Parameters[“p_pageSize”].Direction = ParameterDirection.Intput;
Comm.Parameters[“p_pageSize”].Value = pageSize ;

Comm.Parameters.add(“p_pageNo”.OracleType.Float,50);
Comm.Parameters[“p_pageNo”].Direction = ParameterDirection.Intput;
Comm.Parameters[“p_pageNo”].Value = pageNo;

Comm.Parameters.add(“p_SqlSelect”,OracleType.VarChar,3000);
Comm.Parameters[“p_SqlSelect”].Direction = ParameterDirection.Intput;
Comm.Parameters[“p_SqlSelect”].Value = sql;

Comm.Parameters.add(“p_outRecordcount”,OraclType.Float);
Comm.Parameters[“p_outRecordcount”].Direction = ParameterDirection.Output;
Comm.Parameters[“p_outRecordcount”].Value = 0;

Comm.Parameters.add(“p_outReturnCursor”,OracleType.Cursor);
Comm.Parameters[“p_outReturnCursor”].Direction = ParameterDirection.Output;

OracleDataAdapter oDa = new OracleDataAdapter(Comm);
DataSet ds = new DataSet();
ODa.Fill(ds);

Lable.text = “共有记录 ”+int.parse(comm.Parameters[“p_outRecordcount”].Value.ToString())+” 条”;

Return ds.Table[0];
}

[解决办法]
只是单一的使用调用储存分页功能,别的都去掉了,需要你自己完善!

热点排行