最近在做考试系统时碰到这个问题了,好郁闷,弄了好久也没解决,请大家帮我看一下,不胜感激!
错误提示信息如下:
过程 'Proc_UserAnswer' 需要参数 '@UserID',但未提供该参数。 
说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。
异常详细信息: System.Data.SqlClient.SqlException: 过程 'Proc_UserAnswer' 需要参数 '@UserID',但未提供该参数。
源错误: 
行 299:            SqlDataAdapter adapter = new SqlDataAdapter(Cmd);
行 300:            DataSet dataset = new DataSet();
行 301:            adapter.Fill(dataset);行 
302:            Close();
行 303:            return dataset;
 ----------------------------------------------------------------
表UserAnswer:
ID          int 
UserID      varchar
PaperID     int
Type        varchar
TitleID      int
Mark         int
UserAnswer  varchar
ExamTime     datetime-----------------------------------------
这是存储过程
CREATE PROCEDURE [dbo].[Proc_UserAnswer]
                           @PaperID [int],         
 @Type [varchar](10),
                           @UserID   [varchar](50)
AS
begin 
declare @sql nvarchar(1000)
if @Type='单选题' 
 begin
set @sql='select * from UserAnswer,SingleProblem
              where [Type]=''单选题'' and  
              UserAnswer.TitleID=SingleProblem.ID and   
              [PaperID]= +Cast(@PaperID AS varchar(10) and
              UserID=@UserID'
exec sp_executesql @sql
 end
else if @Type='多选题'  
 begin
set @sql='select  * from UserAnswer,MultiProblem
             where [Type]=''多选题'' and 
             UserAnswer.TitleID=MultiProblem.ID and         
                 [PaperID]= +Cast(@PaperID AS varchar(10) and 
              UserID=@UserID'
exec sp_executesql @sql
 end
else if @Type='判断题' 
 begin
set @sql='select  * from UserAnswer,JudgeProblem
             where ( [Type]=''判断题'' and
            UserAnswer.TitleID=JudgeProblem.ID and        
          [PaperID]= +Cast(@PaperID AS varchar(10) and  
              UserID=@UserID)'
exec sp_executesql @sql
 end
else  if @Type='填空题'  
 begin
set @sql='select  * from UserAnswer,FillBlankProblem
              where ( [Type]=''填空题'' and 
              UserAnswer.TitleID=FillBlankProblem.ID and     
                 [PaperID]= +Cast(@PaperID AS varchar(10) and       
              UserID=@UserID)'
exec sp_executesql @sql
 end
else if @Type='问答题' 
 begin
set @sql='select  * from UserAnswer,QuestionProblem
             where ( [Type]=''问答题'' and 
             UserAnswer.TitleID=QuestionProblem.ID and     
                   [PaperID]= +Cast(@PaperID AS varchar(10) and  
              UserID=@UserID)'
exec sp_executesql @sql
 end
end
GO
-------------------------------------------------
 类文件Paper.cs: //查询某个用户考试的试卷,
        public DataSet QueryUserPaper(int paperid,string type,string userid)
        {
            DataBase DB = new DataBase();
            SqlParameter[] Params = new SqlParameter[3];
            Params[0] = DB.MakeInParam("@PaperID", SqlDbType.Int, 4, paperid);               //试卷编号
            Params[1] = DB.MakeInParam("@Type", SqlDbType.VarChar, 10, type);            //题目类型   
            Params[2] = DB.MakeInParam("@UserID", SqlDbType.VarChar, 50, userid);            //用户ID             return DB.GetDataSet("Proc_UserAnswer", Params);
        }       ------------------------------------
DataBase.cs文件:
 public DataSet GetDataSet(string ProcName, SqlParameter[] Params)
        {
            Open();
            SqlCommand Cmd = CreateCommand(ProcName, Params);
            SqlDataAdapter adapter = new SqlDataAdapter(Cmd);
            DataSet dataset = new DataSet();
            adapter.Fill(dataset);
            Close();
            return dataset;
        }---------------------------------------
查看某个用户的试卷回答,UserPaper.aspx.cs:
             DataBase DB = new DataBase();
            DataSet ds = DB.GetDataSetSql("select * from [UserAnswer] where PaperID='" + Request.QueryString["PaperID"] + "'");
            DataRow[] row = ds.Tables[0].Select();
            foreach (DataRow rs in row)
            {
                userid = rs["UserID"].ToString();
                examtime = Convert.ToDateTime(rs["ExamTime"].ToString());
            }int paperID = Convert.ToInt32(Request.QueryString["PaperID"].ToString());              Paper paper =new Paper();        DataSet ds1 = paper.QueryUserPaper(paperID, "单选题", userid);
        GridView1.DataSource = ds1;
        GridView1.DataBind();
        ((Label)GridView1.HeaderRow.FindControl("Label27")).Text = ((Label)GridView1.Rows[0].FindControl("Label4")).Text;
        DataSet ds2 = paper.QueryUserPaper(paperID, "多选题", userid);
        GridView2.DataSource = ds2;
        GridView2.DataBind();
        ((Label)GridView2.HeaderRow.FindControl("Label28")).Text = ((Label)GridView2.Rows[0].FindControl("Label8")).Text;

解决方案 »

  1.   

    这里的GetDataSet只能执行查询语句
    两种方式解决:
    1、写Sql语句包含参数;如Exec Proc_UserAnswer @PaperID,@Type@UserID 
    2、改写GetDataSet,使之可以自行存储过程,加CommandType.StoredProcedure
      

  2.   

    写Sql语句包含参数;如Exec Proc_UserAnswer @PaperID,@Type@UserID  
      

  3.   

    多谢回复,但我用另一个查询试卷的存储过程可以正常得到结果啊
    CREATE PROCEDURE [dbo].[Proc_PaperDetail]
    (@PaperID [int],
     @Type [varchar](10))
    AS
    begin 
    declare @sql nvarchar(1000)
    if @Type='单选题'
     begin
    set @sql='select * from PaperDetail,SingleProblem
                  where [Type]=''单选题'' and
                  PaperDetail.TitleID=SingleProblem.ID and [PaperID]= '+Cast(@PaperID AS varchar(10)) 
    exec sp_executesql @sql
     end
    else if @Type='多选题'
     begin
    set @sql='select * from PaperDetail,MultiProblem 
                 where [Type]=''多选题'' and PaperDetail.TitleID=MultiProblem.ID and
                 [PaperID]=' + +Cast(@PaperID AS varchar(10))
    exec sp_executesql @sql
     end
    else if @Type='判断题'
     begin
    set @sql='select * from PaperDetail,JudgeProblem 
                 where [Type]=''判断题'' and PaperDetail.TitleID=JudgeProblem.ID and 
                [PaperID]=' + +Cast(@PaperID AS varchar(10))
    exec sp_executesql @sql
     end
    else if @Type='问答题'
     begin
    set @sql='select * from PaperDetail,QuestionProblem 
                 where [Type]=''问答题'' and PaperDetail.TitleID=QuestionProblem.ID and
                 [PaperID]=' + +Cast(@PaperID AS varchar(10))
    exec sp_executesql @sql
     end
    else
     begin
    set @sql='select * from PaperDetail,FillBlankProblem
                  where [Type]=''填空题'' and PaperDetail.TitleID=FillBlankProblem.ID and [PaperID]=' + +Cast(@PaperID AS varchar(10))
    exec sp_executesql @sql
     end
    end
    GO
    -----------------------------------------------------------------
    我把这个Proc_PaperDetail修改成Proc_UserAnswer就不行了.语法检查的成功的,但是不是下面语句缺少一些引号啊?
    set @sql='select * from UserAnswer,SingleProblem 
                  where [Type]=''单选题'' and   
                  UserAnswer.TitleID=SingleProblem.ID and    
                  [PaperID]= +Cast(@PaperID AS varchar(10) and 
                  UserID=@UserID' 
      

  4.   

    还有,那个DataBase.CS文件还有下面这些代码 public SqlParameter MakeParam(string ParamName, SqlDbType DbType, Int32 Size, ParameterDirection Direction, object Value) 
            {
              SqlParameter Param;          if(Size > 0)
                Param = new SqlParameter(ParamName, DbType, Size);
              else Param = new SqlParameter(ParamName, DbType);          Param.Direction = Direction;          if (Value != null)
                Param.Value = Value;          return Param;
            } //公有方法,实例化一个用于调用存储过程的输入参数
    //输入:
    //      ParamName - 参数名称
    //      DbType - 参数类型
    //      Size - 参数大小
    // Value - 值
            public SqlParameter MakeInParam(string ParamName, SqlDbType DbType, int Size, object Value) 
            {
              return MakeParam(ParamName, DbType, Size, ParameterDirection.Input, Value);
            }
      

  5.   

    2楼和3楼的,"Exec Proc_UserAnswer @PaperID,@Type,@UserID "这句应该加在哪里,我是新手,不太明白.谢谢了..