执行存储过程return无法返回值

xuchanghao 2008-08-22 04:12:22
为什么得不到返回值?
查询分析器中执行存储过程可已返回1
在页面中:存储过程可以执行,也能把数据插入到表中,但总返回0。

表的脚本文件
CREATE TABLE [dbo].[UserLog] (
[LogID] [varchar] (30) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[LoginID] [varchar] (20) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[UserID] [varchar] (10) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[LoginIP] [varchar] (20) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[LogTime] [datetime] NOT NULL ,
[LogType] [varchar] (1) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[RecordStatus] [varchar] (1) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[Text] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL
)
CREATE TABLE [dbo].[HistoryOp] (
[HistoryID] [varchar] (14) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[OperateFunc] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
[OperateTable] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
[OperateValue] [varchar] (2000) COLLATE Chinese_PRC_CI_AS NULL ,
[OperateType] [varchar] (1) COLLATE Chinese_PRC_CI_AS NULL ,
[OperateBy] [varchar] (10) COLLATE Chinese_PRC_CI_AS NULL ,
[OperateDATE] [datetime] NULL ,
[RecordStatus] [varchar] (1) COLLATE Chinese_PRC_CI_AS NULL ,
[Memo] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL
)


存储过程
CREATE procedure exechistory
@sqlstr VARCHAR(2000),
@opkeyvalue VARCHAR(50),
@optable VARCHAR(50),
@opfunc VARCHAR(50),
@optype VARCHAR(50),
@opby VARCHAR(50),
@memo VARCHAR(50)
as
set nocount on
declare @logkeyvalue VARCHAR(30);
begin
exec(@sqlstr);
select @logkeyvalue=max(cast(historyid as bigint))+1 from historyop;
if @logkeyvalue is NULL
begin
set @logkeyvalue= convert(varchar(8),getdate(),112) + '000001';
end;
else
begin
if substring(@logkeyvalue,0,9) <>convert(varchar(8),getdate(),112)
begin
set @logkeyvalue= convert(varchar(8),getdate(),112) + '000001';
end;
end;
--执行日志记录,返回日志记录的值
insert into historyop(historyid,operatefunc,operatetable,
operatevalue,operatetype,operateby,operatedate,recordstatus,
memo) values(@logkeyvalue,@opfunc,@optable,@opkeyvalue,
@optype,@opby,getdate(),'1',@memo);
return 1
end
GO

执行存储过程
declare @id int;
execute @id=exechistory 'insert into userlog values(''10000007'',''admin'',''0000000003'',''127.0.0.1'',getdate(),''0'',''1'','' 正常登陆'')','10000002','shareinfo','共享设置','0','0000000003',''
print @id


页面代码
import java.io.IOException;
import java.sql.*;
import java.util.Date;

public class Test {

public static void main(String[] args) throws IOException {



//String sql = "select max(id) as id from test";

// 连接字符串,格式: "jdbc:公司名称:数据库驱动名称://数据库服务器ip:端口号;DatabaseName=数据库名称"
String url = "jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=btv";
String username = "sa";
String password = "sa";

try {
Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver").newInstance();
Connection conn = DriverManager.getConnection(url, username, password);
Statement stmt = conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE);
CallableStatement stmten=null;
stmten=conn.prepareCall("{call exechistory(?,?,?,?,?,?,?)}");
stmten.setString(1,"insert into userlog values('10000014','admin','0000000003','127.0.0.1',getdate(),'0','1','正常登陆')");
stmten.setString(2,"10000002");
stmten.setString(3,"shareinfo");
stmten.setString(4,"共享设置");
stmten.setString(5,"0");
stmten.setString(6,"0000000003");
stmten.setString(7,"");
int i=stmten.executeUpdate();
System.out.println("i========="+i);
conn.close();
stmt.close();
} catch (InstantiationException e) {
// TODO 自动生成 catch 块
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO 自动生成 catch 块
e.printStackTrace();
} catch (ClassNotFoundException e) {
// TODO 自动生成 catch 块
e.printStackTrace();
} catch (SQLException e) {
// TODO 自动生成 catch 块
e.printStackTrace();
}
}
}
...全文
245 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
xuchanghao 2008-08-22
  • 打赏
  • 举报
回复
自己搞定 结帖! 是nocount的问题改成off就可以了。
lihui820905 2008-08-22
  • 打赏
  • 举报
回复
到底是哪里返回0?这么长的代码,最好把你有疑问的地方红色标记出来。
javabeginner2006 2008-08-22
  • 打赏
  • 举报
回复
我好像记得,在java中如果想执行存储过程而有结果返回的话,存储过程用应该有输出的一个参数吧。
比如:
CREATE procedure exechistory
@sqlstr in VARCHAR(2000),
@opkeyvalue in VARCHAR(50),
@optable in VARCHAR(50),
@opfunc in VARCHAR(50),
@optype in VARCHAR(50),
@opby in VARCHAR(50),
@memo out VARCHAR(50)
这样就表示@memo是用来存放输出值的。
xuchanghao 2008-08-22
  • 打赏
  • 举报
回复
不是很难的问题吧 都没人答 ,嫌分少?
xuchanghao 2008-08-22
  • 打赏
  • 举报
回复
高手都不在啊?5555555555555555

81,094

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧