C#中调用存储过程时,传递ouput参数和返回值的有关问题

C#中调用存储过程时,传递ouput参数和返回值的问题
c#中代码如下:

        string connection = "address = king001;initial catalog = STUDENTDB;trusted_connection = true ";
        private void button1_Click(object sender, EventArgs e)
        {
            SqlConnection conn = new SqlConnection(connection);
            conn.Open();
            SqlCommand cmd = new SqlCommand("GetInfo", conn);

            cmd.CommandType = CommandType.StoredProcedure;
            DateTime dt = new DateTime();

            cmd.Parameters.Add("@isinsert", SqlDbType.VarChar, 20).Value = "insert";
            cmd.Parameters.Add("@isupdate", SqlDbType.VarChar, 20).Value = "update";
            cmd.Parameters.Add("@datetime", SqlDbType.DateTime, 8).Value = DateTime.Now;
            cmd.Parameters.Add("return_number", SqlDbType.Int);

            cmd.Parameters["@isinsert"].Direction = ParameterDirection.Output;    //设置参数的输出类型,和存储过程中参数匹配
            cmd.Parameters["@isupdate"].Direction = ParameterDirection.Output;
            cmd.Parameters["@datetime"].Direction = ParameterDirection.Output;
            cmd.Parameters["return_number"].Direction = ParameterDirection.ReturnValue; //有return返回值向参数列表添加
          
            //cmd.ExecuteNonQuery();

            SqlDataAdapter sda = new SqlDataAdapter(cmd);

            DataSet ds = new DataSet();
            sda.Fill(ds);

            dataGridView1.DataSource = ds.Tables[0];

            label1.Text = cmd.Parameters["@datetime"].Value.ToString();
            label2.Text = cmd.Parameters["@isupdate"].Value.ToString();
            
            label3.Text = cmd.Parameters["@isinsert"].Value.ToString();
            label4.Text = cmd.Parameters["return_number"].Value.ToString();

            conn.Close();

        }

存储过程如下:

create procedure GetInfo
@isinsert varchar(20) output
,@isupdate varchar(20)  output
,@datetime datetime  output
as
begin
  if(@isinsert = 'insert')
  begin
      set @isinsert = 'myinsert';
      return 0;
  end
  if(@isupdate = 'update')
  begin
      set @isupdate = 'myupdate';
      return 1;
  end
  set @datetime = GETDATE();
  
  select * from student_info;
  
end
go

在SQLserver中追踪存储过程执行情况如下图:
C#中调用存储过程时,传递ouput参数和返回值的有关问题


请教各位大神,问题1:为什么我在代码中调试的时候发现参数传递过去的时候就是null值,但是我其实是给参数赋值了的

问题2:为什么我没给@datatime参数赋值,传过去的反而有值

问题3:如果最终我想实现代码中的效果,也就是获取这几个参数的返回值,我应该怎么修改?

跪求各位大神的帮助C#中调用存储过程时,传递ouput参数和返回值的有关问题
------解决思路----------------------
问题1:你到底想OUT,还是IN,还是INOUT呢?
    --->  IN,OUT是以SQL的角度而言的,而不是C#
问题2:我怎么看着你在C#,存储过程里面都给@datetime赋值了
问题3:看你既往里面传值,又从里面获得值了, 你还是改成INOUT吧