存储过程的使用
存储过程的好处很多,降低网络的通信量是最吸引我的地方,现仅以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#中的使用方法与第一种情况一致。