下面是我2005中的存储过程set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
GOALTER  PROCEDURE [dbo].[spqMemOSPointsDtil]
    ( 
        @pMemCode nvarchar(12),
        @pStatusDesc nvarchar(50) output    
    )
AS    
BEGIN
    SET NOCOUNT ON    CREATE TABLE #TempList
    (        
        rSiteNo int,
        rSiteName nvarchar(30)  COLLATE Chinese_Taiwan_Stroke_CI_AS null,                    
        rMemCode  nvarchar(12)  COLLATE Chinese_Taiwan_Stroke_CI_AS null,
        rMemName  nvarchar(40)  COLLATE Chinese_Taiwan_Stroke_CI_AS null,
        rMemCName nvarchar(15)  COLLATE Chinese_Taiwan_Stroke_CI_AS null, 
        rTransDate  DateTime null,
        rTransDateTime nvarchar(8),
        rTransType nvarchar(2),
        rTransTypeDesc nvarchar(20),
        rTransPoints float null,
        rOSPoint float null,
        rExpiryDate DateTime null                
    )
    DECLARE @sMemCodeIn nvarchar(8)
    Declare @sStatus int    
    Declare @sOSPoints float
    Declare @sRealOSPoints float
    
    set @sStatus=0
    
    Select @sMemCodeIn=MemCodeIn from dbo.mstMember Where memCode=@pMemCode
    if isnull(@sMemCodeIn,'')='' begin
        set @sStatus=-1
        set @pStatusDesc='Member Code Not Found' 
        goto ERROREXIT
    end
    insert into #TempList (rSiteNo, rSiteName,rMemCode,rMemName,rMemCName, rTransDate,
                            rTransDateTime, 
                            rTransType, rTransTypeDesc,rTransPoints,rOSPoint,rExpiryDate)
    SELECT               t.CompNo, CoName, @pMemCode, m.MemName, m.MemCName, TransDate,
                           substring(TransSortID, 9,2) +':'+substring(TransSortID, 9+2,2)+':'+substring(TransSortID, 9+2+2,2) as rTime,
                         tr.trCode, tr.trDesc, TransPoints, rOutPoints ,convert(datetime, ExpirePeriod,112) as rExpiryDate                     
                           FROM  vwMemberHist t left join mstTranType tr on tr.trCode=t.TransType
                                                left join mstMember m on m.MemCodeIn=t.MemCode
                                                left join mCompany co on co.coCode=t.CompNo
                            WHERE t.MemCode=@sMemCodeIn and TransPoints > 0 and 
                                      rOutPoints>0 and 
                                      ExpirePeriod>=convert(nvarchar(8), getdate(),112)                
    set @sRealOSPoints = dbo.fnMemOsPoints2(@sMemCodeIn, convert(nvarchar(8), getdate(),112)+'2359')
    
    if @sOSPoints <>@sRealOSPoints begin
        set @sStatus=-2
        set @pStatusDesc='Details O/S Points Not match O/S Points Summary' 
        goto ERROREXIT
    end    
    else if @sOSPoints=0 begin
        set @sStatus=-3
        set @pStatusDesc='No Points Available' 
        goto ERROREXIT
    end
    Select rSiteNo, rSiteName,rMemCode,rMemName,rMemCName,rTransDate,
           rTransDateTime, rTransType, rTransTypeDesc,rTransPoints,rOSPoint,rExpiryDate 
           from #TempList Order by rTransDate, rTransDateTime
    set @sStatus=1
    set @pStatusDesc='Successful' 
    
    
ERROREXIT:    
    RETURN @sStatus
END下面是我MS SQL2005中掉用的存储过程DECLARE @return_value int,
  @pStatusDesc nvarchar(50)
EXEC @return_value = [dbo].[spqMemOSPointsDtil]
  @pMemCode = N'110106666666',
  @pStatusDesc = @pStatusDesc OUTPUTSELECT @pStatusDesc as N'@pStatusDesc'
SELECT 'Return Value' = @return_value下面是我在JAVA中的掉用cstmt = conn.prepareCall("{call dbo.spqMemOSPointsDtil(?,?)}");
cstmt.setString(1,"110106666666");
cstmt.registerOutParameter(2,java.sql.Types.INTEGER);
resSet = cstmt.executeQuery();
System.out.println(cstmt.getInt(2));
//报错com.microsoft.sqlserver.jdbc.SQLServerException: 没有为参数号 0 设置值。

解决方案 »

  1.   

    第一: 确保你的存储过程没有问题第二:把你的代码换成这个,试试
    cstmt = conn.prepareCall("{call dbo.spqMemOSPointsDtil(?,?)}");
    cstmt.setString(1,"110106666666");
    cstmt.registerOutParameter(2,java.sql.Types.INTEGER);
    cstmt.execute();
    int i=cstmt.getInt(2);
    System.out.println(i);
      

  2.   

     如果还不行 设置个断点 调试一下
    看看 cstmt.getInt(2)有没有取到值
      

  3.   

    不行啊!存儲過程肯定沒問題!樓上的方法我也用過,拿不到返回!
    報錯還是//报错com.microsoft.sqlserver.jdbc.SQLServerException: 没有为参数号 0 设置值。
      

  4.   

    cstmt.setString(1,"110106666666");
    cstmt.registerOutParameter(2,java.sql.Types.INTEGER);改成cstmt.setString(1,"110106666666");
    cstmt.setString(2,"");
    cstmt.registerOutParameter(2,java.sql.Types.VARCHAR);试试~~
      

  5.   

    用cstmt.execute();另外cstmt.getInt(2);改成cstmt.getString(2);
      

  6.   

    //报错com.microsoft.sqlserver.jdbc.SQLServerException: 没有为参数号 0 设置值。
    调试 看看  conn  有没有拿到一个 连接另外cstmt = conn.prepareCall("{call dbo.spqMemOSPointsDtil(?,?)}");改为:cstmt = conn.prepareCall("{call spqMemOSPointsDtil(?,?)}");
      

  7.   


    cstmt.setString(1,"110106666666");
    cstmt.setString(2,"");
    cstmt.registerOutParameter(2,java.sql.Types.VARCHAR);
    //能拿到一個返回值了,但我有兩個返回值,請高手再指教!
      

  8.   

    不好意思看错了,是一个返回参数!cstmt.execute();
    我怎么拿到结果集呢?