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中追踪存储过程执行情况如下图:

请教各位大神,问题1:为什么我在代码中调试的时候发现参数传递过去的时候就是null值,但是我其实是给参数赋值了的
问题2:为什么我没给@datatime参数赋值,传过去的反而有值
问题3:如果最终我想实现代码中的效果,也就是获取这几个参数的返回值,我应该怎么修改?
跪求各位大神的帮助
------解决思路----------------------
问题1:你到底想OUT,还是IN,还是INOUT呢?
---> IN,OUT是以SQL的角度而言的,而不是C#
问题2:我怎么看着你在C#,存储过程里面都给@datetime赋值了
问题3:看你既往里面传值,又从里面获得值了, 你还是改成INOUT吧
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中追踪存储过程执行情况如下图:
请教各位大神,问题1:为什么我在代码中调试的时候发现参数传递过去的时候就是null值,但是我其实是给参数赋值了的
问题2:为什么我没给@datatime参数赋值,传过去的反而有值
问题3:如果最终我想实现代码中的效果,也就是获取这几个参数的返回值,我应该怎么修改?
跪求各位大神的帮助
------解决思路----------------------
问题1:你到底想OUT,还是IN,还是INOUT呢?
---> IN,OUT是以SQL的角度而言的,而不是C#
问题2:我怎么看着你在C#,存储过程里面都给@datetime赋值了
问题3:看你既往里面传值,又从里面获得值了, 你还是改成INOUT吧