为什么得不到返回值?
查询分析器中执行存储过程可已返回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();
}
}
}

解决方案 »

  1.   

    我好像记得,在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是用来存放输出值的。 
      

  2.   

    自己搞定  结帖!  是nocount的问题改成off就可以了。