存储过程的使用

存储过程的好处很多,降低网络的通信量是最吸引我的地方,现仅以C#中的使用方法进行介绍

原始表结构如下:

test

id  int  4

name  varchar  50

cost  int  4

1.向test表中插入一条记录,并以output方式返回当前的总花费;

构建的存储过程如下:

CREATE PROCEDURE [dbo].[proc_output]
@param1 int,
@param2 varchar,
@param3 int,
@param4 int
 AS
insert into test values(@param1,@param2,@param3)
select @param4=sum(cost) from test;
GO

C#中的使用方法如下:

SqlConnection conn = new SqlConnection("server=LIPING\\LIPING;uid=sa;pwd=liping;database=test");
            conn.Open();
            SqlCommand MyCommand = new SqlCommand("proc_output", conn);
            MyCommand.CommandType = CommandType.StoredProcedure;
            MyCommand.Parameters.Add(new SqlParameter("@param1", SqlDbType.Int));   //添加一个输入参数
            MyCommand.Parameters["@param1"].Value =8;
            MyCommand.Parameters.Add(new SqlParameter("@param2", SqlDbType.VarChar));    //添加一个输入参数
            MyCommand.Parameters["@param2"].Value = "strawberry";
            MyCommand.Parameters.Add(new SqlParameter("@param3", SqlDbType.Int));     //添加一个输入参数
            MyCommand.Parameters["@param3"].Value = 60;
            MyCommand.Parameters.Add(new SqlParameter("@param4", SqlDbType.Int));     //添加一个输出参数
            MyCommand.Parameters["@c"].Direction = ParameterDirection.Output;
            MyCommand.ExecuteNonQuery();
            Console.WriteLine(mailto:%22存储过程通过Output返回值:MyCommand.Parameters[%22@param3%22].Value.ToString());
            conn.Close();
            MyCommand.Dispose();

2.向test表中插入一条记录,并以return方式返回当前的总花费;

构建的存储过程如下:

CREATE PROCEDURE [dbo].[proc_return]
@param1 int,
@param2 varchar,
@param3 int
 AS
declare @i int
insert into test values(@param1,@param2,@param3)
select @i= sum(cost) from test;
return @i
GO

C#中的使用方式与第一种情况类似,区别如下:

MyCommand.Parameters.Add(new SqlParameter("@return_value", SqlDbType.Int));
            MyCommand.Parameters["@return_value"].Direction = ParameterDirection.ReturnValue;
            MyCommand.ExecuteNonQuery();
            Console.WriteLine("存储过程通过Return返回值:MyCommand.Parameters["@return_value"].Value.ToString());

3.向表中插入一条记录,并得到记录集;

构建的存储过程如下:

CREATE PROCEDURE [dbo].[proc_recordset]
@param1 int,
@param2 varchar,
@param3 int
 AS
insert into test values(@param1,@param2,@param3)
select * from test;
GO

C#中的使用中传入三个参数的方法与第一种情况一致,获取记录集方法如下:

SqlDataAdapter da = new SqlDataAdapter(MyCommand);
            DataSet ds = new DataSet();
            da.Fill(ds);
            this.dataGridView1.DataSource = ds.Tables[0].DefaultView;

4.批量添加记录

存储过程如下:

CREATE PROCEDURE dbo.proc_batch
    @arrValues varChar(800)
AS
    DECLARE @prev int
    DECLARE @cur int
    DECLARE @TId char
    Set @prev=1
    set @cur=1
   
    begin transaction
    Set NoCount ON
   
    Set @cur=CharIndex(',',@arrValues,@prev+1)
    set @TId=cast(SUBSTRING(@arrValues,@prev,@cur-@prev) as  char)
    Insert into test (name) Values(@TId)
    SET @prev = @cur
    while (@prev+1 < LEN(@arrValues))
    Begin
        Set @cur=CharIndex(',',@arrValues,@prev+1)
        if(@cur>0)
        Begin
            set @TId=cast(SUBSTRING(@arrValues,@prev+1,@cur-@prev-1) as char)
            Insert into test (name) Values(@TId)
            SET @prev = @cur
        End
        else
            Break
    End
   
    set @TId=cast(SUBSTRING(@arrValues,@prev+1,LEN(@arrValues)-@prev) as char)
    Insert into test (name) Values(@TId)
    Set NoCount OFF
    if @@error=0
    begin
        commit transaction
    end
    else
    begin
        rollback transaction
    end
GO

C#中的使用方法与第一种情况一致。

原文地址:https://www.cnblogs.com/emily_fly/p/1743617.html