调用sql server的存储过程 需要一定的格式,这就像学刀法,格式就是刀谱,而对程序语言的理解就是心法,编程序不能只靠刀谱,每次编程都是从例子上拷贝粘贴,也不能只靠心法,否则语法混乱。这是一点编程的理解。
1,首先,需要创建一个存储过程,例子如下
create PROCEDURE dbo.ProcessMeetRec_SingleRec
@a int,
@b int output,
@c varchar(5) output
as
if @a = 1
begin
select @c = 'a'
select @b = 9
return -1
end
if @b = 3
begin
select @c = 'b'
return -2
end
begin tran
insert book_user(logname) values('aaa')
if @@error <> 0
begin
--插入签到记录失败
raiserror ('插入签到记录失败',16,1) with seterror
rollback tran
return -9
end
return 1
注意,@b可以作为输入输出参数,@a是输入参数,@c是输出参数
2 ,定义一个调用存储过程的方法
public bool ProcessMeetRec_SingleRec(int a,ref int b,ref string c)
{
if (!CheckConn())
{
return false;
}
try
{
SqlCommand cmd = new SqlCommand("ProcessMeetRec_SingleRec", _cn);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add(new SqlParameter("@a", SqlDbType.Int));
cmd.Parameters["@a"].Value = a;
cmd.Parameters.Add(new SqlParameter("@b", SqlDbType.Int));
cmd.Parameters["@b"].Direction = ParameterDirection.InputOutput;
cmd.Parameters["@b"].Value = 6;
cmd.Parameters.Add(new SqlParameter("@c", SqlDbType.VarChar, 20));
cmd.Parameters["@c"].Direction = ParameterDirection.Output;
//存储过程返回值
cmd.Parameters.Add(new SqlParameter("@d", SqlDbType.Int));
cmd.Parameters["@d"].Direction = ParameterDirection.ReturnValue;
cmd.ExecuteNonQuery();
int iRet = (int)cmd.Parameters["@d"].Value;
b = (int)cmd.Parameters["@b"].Value;
c = cmd.Parameters["@c"].Value.ToString();
//返回值-1时失败 0成功但记录无效 1成功记录有效
if (iRet == -1)
return false;
else
return true;
}
catch (Exception ex)
{
string e = ex.Message;
MessageBox.Show(ex.Message, "");
return false;
}
}
注意,其中把@b作为输入输出参数,并且一定要赋值,否则会出错。其中的参数@d并没有在存储过程中定义,它表示存储过程中return 语句返回的值。这堆程序开始要记的,对于记性差的人来说,很是郁闷,但写多了,慢慢会记住,仔细看就行,不用刻意死记硬背。
另外,当调用出错时,比如insert book_user(logname) values('aaa')这句出错的话,存储过程的 raiserror ('插入签到记录失败',16,1) with seterror 这句会发生作用,'插入签到记录失败'这句话会出现在ex.Message中。
2,在一个按钮事件中编程如下
private void btnUse_Click(object sender, EventArgs e)
{
int a =8;
int b = 0;
string c = "";
this.ProcessMeetRec_SingleRec(a, ref b, ref c);
}
注意,因为@b是输入输出参数,@c是输出参数,所以要使用ref。