昨晚在练习ASP.NET数据库操作方法是遇到了下面一个问题:在该程序中,需要调用一个存储过程,而该存储过程是返回参数的。该存储过程的功能是:当我给定输入参数后,该存储过程会根据输入参数对相应的表进行检索,选出符合条件的记录,然后通过返回参数返回。先请大家看看下面表的结构和存储过程(该存储过程经语法检验是正确的,而且在查询分析器中执行该存储过程后结果也是正确的),然后请大家帮我看看我的C#代码,为什么执行到A句就产生异常了!
谢谢!Notes表结构:name与time共同形成主键
列名         类型           长度      可以为空
name         varchar        50          N
time         datetime       8           N
weather      varchar        50          Y
content      varchar        50          Y存储过程proGetNote,
作用:根据输入参数@name,@time的值查询出合乎条件的记录后然后返回给输出参@oname,@otime,@oweatherCREATE procedure proGetNote
@name varchar(50),
@time datetime,
@oname varchar(50) output ,
@otime datetime output,
@oweather varchar(50) output,
@ocontent varchar(50) output
as
select @oname=name,@otime=time,@oweather=weather,@ocontent=content from Notes where name=@name and time=@time
GO
下面是C#的代码:执行到下面的A句时就产生了异常,为什么?
private void btnGetContent_Click(object sender, System.EventArgs e)
{
 try
 {
  SqlConnection mySqlConnection=newSqlConnection(@"server=PM\MYSERVER;database=Notebook;uid=1;pwd=1");
  mySqlConnection.Open();  SqlCommand mySqlCommand=new SqlCommand("proGetNote",mySqlConnection);
  mySqlCommand.CommandType=CommandType.StoredProcedure;  //给存储过程添加输入参数
  mySqlCommand.Parameters.Add("@name",SqlDbType.VarChar);
  mySqlCommand.Parameters.Add("@time",SqlDbType.DateTime);  //给添加的输入参数赋值
  mySqlCommand.Parameters["@name"].Value="pm";
  mySqlCommand.Parameters["@time"].Value="2005-03-11";  //由于该调用的存储过程是返回参数的,所以用下面的方法
 SqlDataReader mySqlDataReader=mySqlCommand.ExecuteReader(); // A句,执行到这里就产生异常了 //从SqlDataReader对象中读出记录
 while(mySqlDataReader.Read())
 {
  lblDate.Text=mySqlDataReader["time"].ToString();
  txtContent.Text=mySqlDataReader["content"].ToString();
 } mySqlDataReader.Close();
 mySqlConnection.Close();
 }
 catch
 {
  Response.Write("<script language='javascript'>alert('有问题,不能打开!')</script>");
 }
}请问上面的代码是哪里出现问题了?昨晚头都大了!哎......
请大家帮帮我吧!谢谢了!

解决方案 »

  1.   

    應該是添加參數有錯誤:
    mySqlCommand.Parameters.Add(new SqlParameter("@name",SqlDbType.VarChar,50));
    mySqlCommand.Parameters.Add(new SqlParameter("@time",SqlDbType.DateTime,8));
      

  2.   

    你没设置所有的参数, 还有mySqlCommand.Parameters["@time"].Value="2005-03-11";
    ==>
    mySqlCommand.Parameters["@time"].Value= DateTime.Parse("2005-03-11");还有,你应该通过参数获取值,而不是SqlDataReader
    你要懒的活,试试SqlConnection mySqlConnection=newSqlConnection(@"server=PM\MYSERVER;database=Notebook;uid=1;pwd=1");try
    {
      mySqlConnection.Open();  SqlCommand mySqlCommand=new SqlCommand("proGetNote",mySqlConnection);
      mySqlCommand.CommandType=CommandType.StoredProcedure;
      SqlCommandBuilder.DeriveParameters( mySqlCommand);  mySqlCommand.Parameters["@name"].Value="pm";
      mySqlCommand.Parameters["@time"].Value= DateTime.Parse("2005-03-11");  mySqlCommand.ExecuteNonQuery();
    }
    finally
    {
      mySqlConnection.Close();
    }  Response.Write(mySqlCommand.Parameters["@oname"].Value);
      

  3.   

    sorry
    SqlConnection mySqlConnection=newSqlConnection(@"server=PM\MYSERVER;database=Notebook;uid=1;pwd=1");
    SqlCommand mySqlCommand=new SqlCommand("proGetNote",mySqlConnection);try
    {
      mySqlConnection.Open();  mySqlCommand.CommandType=CommandType.StoredProcedure;
      SqlCommandBuilder.DeriveParameters( mySqlCommand); 
      mySqlCommand.Parameters["@name"].Value="pm";
      mySqlCommand.Parameters["@time"].Value= DateTime.Parse("2005-03-11");  mySqlCommand.ExecuteNonQuery();
    }
    finally
    {
      mySqlConnection.Close();
    }  Response.Write(mySqlCommand.Parameters["@oname"].Value);
      

  4.   

    思归大哥,你说要设置所有参数吗?
    但我只需要两个输入参数就可以,而且在存储过程中也是这样写的。
    我的这段程序的目的是将查询出来的结果分别写到几个TextBox.text中,请问在执行完你上面的程序后,我应该怎样写呢?
    比如:
    txtName.Text=....//将查询出来的记录的name字段值显示出来,下面的也一样是显示其它几个字段值
    txtTime.Text=...//
    txtWeather.Text=...//
    txtContent.Text...//谢谢你们了!
    麻烦你们再看一看!
      

  5.   

    改得我好辛苦啊!试试吧!但愿能帮你!
    SqlConnection mySqlConnection=newSqlConnection(@"server=PM\MYSERVER;database=Notebook;uid=1;pwd=1");
      mySqlConnection.Open();  mySqlCommand.CommandType=CommandType.StoredProcedure;
      SqlCommand mySqlCommand=new SqlCommand("proGetNote",mySqlConnection);
      //给存储过程添加输入参数
      SqlParameter nameinput=mySqlCommand.Parameters.Add("@name",SqlDbType.VarChar);
      nameinput.Direction=ParameterDirection.Input;
      SqlParameter timeinput=mySqlCommand.Parameters.Add("@time",SqlDbType.DateTime);
      timeinput.Direction=ParameterDirection.Input;
      *******对输出参数进行类似设置,只须改为ParameterDirection.Output
      SqlParameter nameoutput=mySqlCommand.Parameters.Add("@oname",SqlDbType.VarChar);
      nameoutput.Direction=ParameterDirection.Output;
      SqlParameter timeoutput=mySqlCommand.Parameters.Add("@otime",SqlDbType.DateTime);
      nameoutput.Direction=ParameterDirection.Output;
      SqlParameter weatheroutput=mySqlCommand.Parameters.Add("@oweather",SqlDbType.VarChar);
      nameoutput.Direction=ParameterDirection.Output;
      SqlParameter contentoutput=mySqlCommand.Parameters.Add("@ocontent",SqlDbType.VarChar);
      nameoutput.Direction=ParameterDirection.Output;
      //给添加的输入参数赋值
      nameinput.Value="pm";
      timeinput.Value=DateTime.Parse("2005-03-11"); *******SqlDataReader mySqlDataReader=mySqlCommand.ExecuteReader(); // A句,执行到这里就产生异常了
     *******改为SqlDataReader mySqlDataReader=mySqlCommand.ExecuteNonQuery();
     *******我对你的那种存储过程不太懂,但我想用mySqlCommand.ExecuteNonQuery()应能返回结果的第一个记录
     *******第一个记录的各字段将存于对应的输出参数中  lblDate.Text=Convert.ToString(timeoutput.Value);
      txtContent.Text=Convert.ToString(contentoutput.Value);
      mySqlDataReader.Close();
     mySqlConnection.Close();
      

  6.   

    哦 ,sorry !没有mySqlDataReader.Close();
      

  7.   

    yzgnick(yzg)说的好像也是个问题
      

  8.   

    希望你采用上边仁兄的方法,一般设置参数的时候需要进行参数方向设置,至于你说的问题,你可以采用SqlDataAdpater来填充相应的数据集,设置其的SqlCommand为刚刚上边仁兄所有的command,而后再进行调用
    思归大哥的方法需要学习下。^_^
      

  9.   

    呵呵 ,SQL="exec  StoredProcedure @Parameter=Value "不知道行不行 呵呵~