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;

                //存储过程返回值(参数@d并没有在存储过程中定义,它表示存储过程中return 语句返回的值。)
                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);

 

 

王xc

posted on 2010-11-02 20:08  08信工实训  阅读(257)  评论(0编辑  收藏  举报