SQL2000存储过程有四个输出参数 正常测试得到四个参数得到正确结果分别是 8 7 6 9  在程序中调之后总是得到 8 7DBNULL DBNULL
存储过程太长 不让往上贴 正常输入测试条件 8   5   2007-5-1   2007-5-8 得到正确结果8  7  6  9
程序中调用  8   5   2007-5-1   2007-5-8 得到正确结果8  7  DBNULL  DBNULL
抛出异常 无法将DBNULL转换为其它值类型SqlConnection conn = null;
        SqlParameter sp;
        SqlParameter sprunum;
        SqlParameter sprdnum;
        SqlParameter sprlnum;
        SqlParameter sprrnum;
        ArrayList arr = new ArrayList();
        int[] returns = new int[4];        
            this.objSqlCommand = new SqlCommand();
            this.objSqlCommand.CommandText = "proc_select_rollbook";
            this.objSqlCommand.CommandType = CommandType.StoredProcedure;
            sp = new SqlParameter();
            sp.ParameterName = "@DAYS";
            sp.SqlDbType = SqlDbType.Int;
            sp.Value = 8;
            this.objSqlCommand.Parameters.Add(sp);            sp = new SqlParameter();
            sp.ParameterName = "@LID";
            sp.SqlDbType = SqlDbType.Int;
            sp.Value = 5;
            this.objSqlCommand.Parameters.Add(sp);            sp = new SqlParameter();
            sp.ParameterName = "@BTIME";
            sp.SqlDbType = SqlDbType.VarChar;
            sp.Value = "2007-5-1";
            this.objSqlCommand.Parameters.Add(sp);            sp = new SqlParameter();
            sp.ParameterName = "@ETIME";
            sp.SqlDbType = SqlDbType.VarChar;
            sp.Value = "2007-5-8";
            this.objSqlCommand.Parameters.Add(sp);            sprunum = new SqlParameter();
            sprunum.ParameterName = "@RUNUM";
            sprunum.SqlDbType = SqlDbType.Int;
            sprunum.Direction = ParameterDirection.Output;
            sprunum.Value = 0;
            this.objSqlCommand.Parameters.Add(sprunum);            sprdnum = new SqlParameter();
            sprdnum.ParameterName = "@RDNUM";
            sprdnum.SqlDbType = SqlDbType.Int;
            sprdnum.Value = 0;
            sprdnum.Direction = ParameterDirection.Output;
            this.objSqlCommand.Parameters.Add(sprdnum);            sprlnum = new SqlParameter();
            sprlnum.SqlDbType = SqlDbType.Int;
            sprlnum.ParameterName = "@RLNUM";
            sprlnum.Direction = ParameterDirection.Output;
            this.objSqlCommand.Parameters.Add(sprlnum);            sprrnum = new SqlParameter();
            sprrnum.SqlDbType = SqlDbType.Int;
            sprrnum.ParameterName = "@RRNUM";
            sprrnum.Direction = ParameterDirection.Output;
            this.objSqlCommand.Parameters.Add(sprrnum);            conn = new SqlConnection(this.conString);
            this.objSqlCommand.Connection = conn;
            try
            {
                if (conn.State == ConnectionState.Closed)
                    conn.Open();
                this.objSqlCommand.ExecuteNonQuery();
            }
            catch
            {
                return null;
            }
            finally
            {
                if (conn.State == ConnectionState.Open)
                {
                    conn.Close();
                }
            }
            try
            {
                
                returns[0] = Convert.ToInt32(sprunum.Value);
                returns[1] = Convert.ToInt32(sprdnum.Value);
                returns[2] = Convert.ToInt32(sprlnum.Value);
                returns[3] = Convert.ToInt32(sprrnum.Value);
                arr.Add(returns);
            }
            catch
            {
                return null;
            }

解决方案 »

  1.   

    存储过程如下
    ALTER PROCEDURE PROC_SELECT_ROLLBOOK 
    @DAYS INT=1,
    @LID INT,
    @BTIME VARCHAR(50),
    @ETIME VARCHAR(50),
    @RUNUM INT OUTPUT,
    @RDNUM INT OUTPUT,
    @RLNUM INT OUTPUT,
    @RRNUM INT OUTPUT
    AS
    DECLARE @DAYNUMS INT
    DECLARE @FACTRUNUM INT
    DECLARE @FACTRDNUM INT
    DECLARE @TEMP INT
    DECLARE @TUTIME1 VARCHAR(50)
    DECLARE @TUTIME2 VARCHAR(50)
    DECLARE @TUTIME3 VARCHAR(50)
    DECLARE @TDTIME1 VARCHAR(50)
    DECLARE @TDTIME2 VARCHAR(50)
    DECLARE @TDTIME3 VARCHAR(50)
    DECLARE @DAYNUM INT

    SET @FACTRUNUM=0
    SET @FACTRDNUM=0
    SELECT @TUTIME1=TIME1,@TUTIME2=TIME3,@TUTIME3=TIME5,@TDTIME1=TIME2,@TDTIME2=TIME4,@TDTIME3=TIME6 FROM RBTIME_SET

    IF @TUTIME3<>''
    BEGIN
    SET @DAYNUM=3
    END
    ELSE IF @TUTIME2<>''
    BEGIN
    SET @DAYNUM=2
    END
    ELSE IF @TUTIME1<>''
    BEGIN
    SET @DAYNUM=1
    END

    SET @DAYNUMS=@DAYNUM*@DAYS

    IF @DAYS<>1
    BEGIN

    IF @DAYNUM=3
    BEGIN
    SELECT @TEMP=COUNT(*) FROM V_ROLLBOOK WHERE LOGIN_ID=@LID AND ROLLBOOK_DATE>=@BTIME AND ROLLBOOK_DATE<=@ETIME AND TIME1<>'' 
    SET @FACTRUNUM=@FACTRUNUM+@TEMP
    SELECT @TEMP=COUNT(*) FROM V_ROLLBOOK WHERE LOGIN_ID=@LID AND ROLLBOOK_DATE>=@BTIME AND ROLLBOOK_DATE<=@ETIME AND TIME3<>'' 
    SET @FACTRUNUM=@FACTRUNUM+@TEMP
    SELECT @TEMP=COUNT(*) FROM V_ROLLBOOK WHERE LOGIN_ID=@LID AND ROLLBOOK_DATE>=@BTIME AND ROLLBOOK_DATE<=@ETIME AND TIME5<>'' 
    SET @FACTRUNUM=@FACTRUNUM+@TEMP

    SELECT @TEMP=COUNT(*) FROM V_ROLLBOOK WHERE LOGIN_ID=@LID AND ROLLBOOK_DATE>=@BTIME AND ROLLBOOK_DATE<=@ETIME AND TIME2<>''
    SET @FACTRDNUM=@FACTRDNUM+@TEMP
    SELECT @TEMP=COUNT(*) FROM V_ROLLBOOK WHERE LOGIN_ID=@LID AND ROLLBOOK_DATE>=@BTIME AND ROLLBOOK_DATE<=@ETIME AND TIME4<>''
    SET @FACTRDNUM=@FACTRDNUM+@TEMP
    SELECT @TEMP=COUNT(*) FROM V_ROLLBOOK WHERE LOGIN_ID=@LID AND ROLLBOOK_DATE>=@BTIME AND ROLLBOOK_DATE<=@ETIME AND TIME6<>''
    SET @FACTRDNUM=@FACTRDNUM+@TEMP


    SELECT @TEMP=COUNT(*) FROM V_ROLLBOOK WHERE LOGIN_ID=@LID AND TIME1>@TUTIME1 AND ROLLBOOK_DATE>=@BTIME AND ROLLBOOK_DATE<=@ETIME
    SET @RLNUM=@RLNUM+@TEMP
    SELECT @TEMP=COUNT(*) FROM V_ROLLBOOK WHERE LOGIN_ID=@LID AND TIME3>@TUTIME2 AND ROLLBOOK_DATE>=@BTIME AND ROLLBOOK_DATE<=@ETIME
    SET @RLNUM=@RLNUM+@TEMP
    SELECT @TEMP=COUNT(*) FROM V_ROLLBOOK WHERE LOGIN_ID=@LID AND TIME5>@TUTIME3 AND ROLLBOOK_DATE>=@BTIME AND ROLLBOOK_DATE<=@ETIME
    SET @RLNUM=@RLNUM+@TEMP


    SELECT @TEMP=COUNT(*) FROM V_ROLLBOOK WHERE LOGIN_ID=@LID AND TIME2<@TDTIME1 AND ROLLBOOK_DATE>=@BTIME AND ROLLBOOK_DATE<=@ETIME
    SET @RRNUM=@RRNUM+@TEMP
    SELECT @TEMP=COUNT(*) FROM V_ROLLBOOK WHERE LOGIN_ID=@LID AND TIME4<@TDTIME2 AND ROLLBOOK_DATE>=@BTIME AND ROLLBOOK_DATE<=@ETIME
    SET @RRNUM=@RRNUM+@TEMP
    SELECT @TEMP=COUNT(*) FROM V_ROLLBOOK WHERE LOGIN_ID=@LID AND TIME6<@TDTIME3 AND ROLLBOOK_DATE>=@BTIME AND ROLLBOOK_DATE<=@ETIME
    SET @RRNUM=@RRNUM+@TEMP
    END
    ELSE IF @DAYNUM=2
    BEGIN
    SELECT @TEMP=COUNT(*) FROM V_ROLLBOOK WHERE LOGIN_ID=@LID AND ROLLBOOK_DATE>=@BTIME AND ROLLBOOK_DATE<=@ETIME AND TIME1<>'' 
    SET @FACTRUNUM=@FACTRUNUM+@TEMP
    SELECT @TEMP=COUNT(*) FROM V_ROLLBOOK WHERE LOGIN_ID=@LID AND ROLLBOOK_DATE>=@BTIME AND ROLLBOOK_DATE<=@ETIME AND TIME3<>'' 
    SET @FACTRUNUM=@FACTRUNUM+@TEMP

    SELECT @TEMP=COUNT(*) FROM V_ROLLBOOK WHERE LOGIN_ID=@LID AND ROLLBOOK_DATE>=@BTIME AND ROLLBOOK_DATE<=@ETIME AND TIME2<>''
    SET @FACTRDNUM=@FACTRDNUM+@TEMP
    SELECT @TEMP=COUNT(*) FROM V_ROLLBOOK WHERE LOGIN_ID=@LID AND ROLLBOOK_DATE>=@BTIME AND ROLLBOOK_DATE<=@ETIME AND TIME4<>''
    SET @FACTRDNUM=@FACTRDNUM+@TEMP


    SELECT @TEMP=COUNT(*) FROM V_ROLLBOOK WHERE LOGIN_ID=@LID AND TIME1>@TUTIME1 AND ROLLBOOK_DATE>=@BTIME AND ROLLBOOK_DATE<=@ETIME
    SET @RLNUM=@RLNUM+@TEMP
    SELECT @TEMP=COUNT(*) FROM V_ROLLBOOK WHERE LOGIN_ID=@LID AND TIME3>@TUTIME2 AND ROLLBOOK_DATE>=@BTIME AND ROLLBOOK_DATE<=@ETIME
    SET @RLNUM=@RLNUM+@TEMP
    SELECT @TEMP=COUNT(*) FROM V_ROLLBOOK WHERE LOGIN_ID=@LID AND TIME2<@TDTIME1 AND ROLLBOOK_DATE>=@BTIME AND ROLLBOOK_DATE<=@ETIME
    SET @RRNUM=@RRNUM+@TEMP
    SELECT @TEMP=COUNT(*) FROM V_ROLLBOOK WHERE LOGIN_ID=@LID AND TIME4<@TDTIME2 AND ROLLBOOK_DATE>=@BTIME AND ROLLBOOK_DATE<=@ETIME
    SET @RRNUM=@RRNUM+@TEMP
    END
    ELSE IF @DAYNUM=1
    BEGIN
    SELECT @TEMP=COUNT(*) FROM V_ROLLBOOK WHERE LOGIN_ID=@LID AND ROLLBOOK_DATE>=@BTIME AND ROLLBOOK_DATE<=@ETIME AND TIME1<>'' 
    SET @FACTRUNUM=@FACTRUNUM+@TEMP

    SELECT @TEMP=COUNT(*) FROM V_ROLLBOOK WHERE LOGIN_ID=@LID AND ROLLBOOK_DATE>=@BTIME AND ROLLBOOK_DATE<=@ETIME AND TIME2<>''
    SET @FACTRDNUM=@FACTRDNUM+@TEMP

    SELECT @TEMP=COUNT(*) FROM V_ROLLBOOK WHERE LOGIN_ID=@LID AND TIME1>@TUTIME1 AND ROLLBOOK_DATE>=@BTIME AND ROLLBOOK_DATE<=@ETIME
    SET @RLNUM=@RLNUM+@TEMP
    SELECT @TEMP=COUNT(*) FROM V_ROLLBOOK WHERE LOGIN_ID=@LID AND TIME2<@TDTIME1 AND ROLLBOOK_DATE>=@BTIME AND ROLLBOOK_DATE<=@ETIME
    SET @RRNUM=@RRNUM+@TEMP

    END
    SET @RUNUM=@DAYNUMS-@FACTRUNUM
    SET @RDNUM=@DAYNUMS-@FACTRDNUM
    END
      

  2.   

    ELSE
    BEGIN
    IF @DAYNUM=3
    BEGIN
    SELECT @TEMP=COUNT(*) FROM V_ROLLBOOK WHERE LOGIN_ID=@LID AND ROLLBOOK_DATE=@BTIME AND TIME1<>''
    SET @FACTRUNUM=@FACTRUNUM+@TEMP
    SELECT @TEMP=COUNT(*) FROM V_ROLLBOOK WHERE LOGIN_ID=@LID AND ROLLBOOK_DATE=@BTIME AND TIME3<>''
    SET @FACTRUNUM=@FACTRUNUM+@TEMP
    SELECT @TEMP=COUNT(*) FROM V_ROLLBOOK WHERE LOGIN_ID=@LID AND ROLLBOOK_DATE=@BTIME AND TIME5<>''
    SET @FACTRUNUM=@FACTRUNUM+@TEMP


    SELECT @TEMP=COUNT(*) FROM V_ROLLBOOK WHERE LOGIN_ID=@LID AND ROLLBOOK_DATE=@BTIME AND TIME2<>'' 
    SET @FACTRDNUM=@FACTRDNUM+@TEMP
    SELECT @TEMP=COUNT(*) FROM V_ROLLBOOK WHERE LOGIN_ID=@LID AND ROLLBOOK_DATE=@BTIME AND TIME4<>'' 
    SET @FACTRDNUM=@FACTRDNUM+@TEMP
    SELECT @TEMP=COUNT(*) FROM V_ROLLBOOK WHERE LOGIN_ID=@LID AND ROLLBOOK_DATE=@BTIME AND TIME6<>'' 
    SET @FACTRDNUM=@FACTRDNUM+@TEMP


    SELECT @TEMP=COUNT(*) FROM V_ROLLBOOK WHERE LOGIN_ID=@LID AND TIME1>@TUTIME1 AND ROLLBOOK_DATE=@BTIME
    SET @RLNUM=@RLNUM+@TEMP
    SELECT @TEMP=COUNT(*) FROM V_ROLLBOOK WHERE LOGIN_ID=@LID AND TIME3>@TUTIME2 AND ROLLBOOK_DATE=@BTIME
    SET @RLNUM=@RLNUM+@TEMP
    SELECT @TEMP=COUNT(*) FROM V_ROLLBOOK WHERE LOGIN_ID=@LID AND TIME5>@TUTIME3 AND ROLLBOOK_DATE=@BTIME
    SET @RLNUM=@RLNUM+@TEMP
    SELECT @TEMP=COUNT(*) FROM V_ROLLBOOK WHERE LOGIN_ID=@LID AND TIME2<@TDTIME1 AND ROLLBOOK_DATE=@BTIME
    SET @RRNUM=@RRNUM+@TEMP
    SELECT @TEMP=COUNT(*) FROM V_ROLLBOOK WHERE LOGIN_ID=@LID AND TIME4<@TDTIME2 AND ROLLBOOK_DATE=@BTIME
    SET @RRNUM=@RRNUM+@TEMP
    SELECT @TEMP=COUNT(*) FROM V_ROLLBOOK WHERE LOGIN_ID=@LID AND TIME6<@TDTIME3 AND ROLLBOOK_DATE=@BTIME
    SET @RRNUM=@RRNUM+@TEMP
    END
    ELSE IF @DAYNUM=2
    BEGIN
    SELECT @TEMP=COUNT(*) FROM V_ROLLBOOK WHERE LOGIN_ID=@LID AND ROLLBOOK_DATE=@BTIME AND TIME1<>''
    SET @FACTRUNUM=@FACTRUNUM+@TEMP
    SELECT @TEMP=COUNT(*) FROM V_ROLLBOOK WHERE LOGIN_ID=@LID AND ROLLBOOK_DATE=@BTIME AND TIME3<>''
    SET @FACTRUNUM=@FACTRUNUM+@TEMP



    SELECT @TEMP=COUNT(*) FROM V_ROLLBOOK WHERE LOGIN_ID=@LID AND ROLLBOOK_DATE=@BTIME AND TIME2<>'' 
    SET @FACTRDNUM=@FACTRDNUM+@TEMP
    SELECT @TEMP=COUNT(*) FROM V_ROLLBOOK WHERE LOGIN_ID=@LID AND ROLLBOOK_DATE=@BTIME AND TIME4<>'' 
    SET @FACTRDNUM=@FACTRDNUM+@TEMP


    SELECT @TEMP=COUNT(*) FROM V_ROLLBOOK WHERE LOGIN_ID=@LID AND TIME1>@TUTIME1 AND ROLLBOOK_DATE=@BTIME
    SET @RLNUM=@RLNUM+@TEMP
    SELECT @TEMP=COUNT(*) FROM V_ROLLBOOK WHERE LOGIN_ID=@LID AND TIME3>@TUTIME2 AND ROLLBOOK_DATE=@BTIME
    SET @RLNUM=@RLNUM+@TEMP
    SELECT @TEMP=COUNT(*) FROM V_ROLLBOOK WHERE LOGIN_ID=@LID AND TIME2<@TDTIME1 AND ROLLBOOK_DATE=@BTIME
    SET @RRNUM=@RRNUM+@TEMP
    SELECT @TEMP=COUNT(*) FROM V_ROLLBOOK WHERE LOGIN_ID=@LID AND TIME4<@TDTIME2 AND ROLLBOOK_DATE=@BTIME
    SET @RRNUM=@RRNUM+@TEMP
    END
    ELSE IF @DAYNUM=1
    BEGIN
    SELECT @TEMP=COUNT(*) FROM V_ROLLBOOK WHERE LOGIN_ID=@LID AND ROLLBOOK_DATE=@BTIME AND TIME1<>''
    SET @FACTRUNUM=@FACTRUNUM+@TEMP


    SELECT @TEMP=COUNT(*) FROM V_ROLLBOOK WHERE LOGIN_ID=@LID AND ROLLBOOK_DATE=@BTIME AND TIME2<>'' 
    SET @FACTRDNUM=@FACTRDNUM+@TEMP

    SELECT @TEMP=COUNT(*) FROM V_ROLLBOOK WHERE LOGIN_ID=@LID AND TIME1>@TUTIME1 AND ROLLBOOK_DATE=@BTIME
    SET @RLNUM=@RLNUM+@TEMP
    SELECT @TEMP=COUNT(*) FROM V_ROLLBOOK WHERE LOGIN_ID=@LID AND TIME2<@TDTIME1 AND ROLLBOOK_DATE=@BTIME
    SET @RRNUM=@RRNUM+@TEMP
    END
    SET @RUNUM=@DAYNUMS-@FACTRUNUM
    SET @RDNUM=@DAYNUMS-@FACTRDNUM
    END
      

  3.   

    你的这么日期类型都是用Varchar来做的,但日期的比较能和字符串的比较能一样么?这样将来不出错到很怪了
      

  4.   

    楼上的,我说过了,我直接调用存储过程得到的结果是正确的。我也说了有鬼,日期用VARCHAR没有什么不可以的,我在数据库里存的要么是2007-1-1格式 要么是7:00:00格式 我如果用DATETIME的时候数据库会给我加上默认值的。自己搞定了,我明明在存储过程中声明的是四个输出参数,我把调用时的ParameterDirection.Output改为ParameterDirection.InputOutput就好了,还是感觉怪怪的,明明是输出参数,为什么非要写能输入/输出类型呢????不管怎么样,现在结果是出来了,可以安心的睡一觉了,光有了代码不行,明天还得设计界面呢,哎没有美工真累
      

  5.   

    给四楼的再补充一句,我数据库里的字段本来就是VARCHAR
      

  6.   

    我看见你的数据库字段是Varchar了,但我对你这段代码的稳健性表示怀疑
      

  7.   

    后面两个输出参数是 DBNULL, 把所参数的  sprunum.Direction = ParameterDirection.Output;
    >>
    sprunum.Direction = ParameterDirection.InOutput;我上次碰到过,问题在这.
      

  8.   

    return 的 是Output
    参数的是 InOutput
    //……至于时间的格式,如果是标准的时间 写成dateTime是最合适的
    写成varchar也是可以的,但是在不同语言时区下 时间可能会格式不同 2007/05/30  05/30/2007
    这样的时间对比 varchar显然是有问题的
    当然,具体问题还是要具体分析的
      

  9.   

    如果数据库有日期运算,你写成varchar,日期运算就相当麻烦。