C#机房重构之存储过程使用

     相信大家经过对数据库的学习都已经对存储过程有了一个概念,也就是将我们要对多个表的数据进行操作的时候,我们需要进行多次的数据更改,因此我们将所需要的步骤封装在一个盒子里(有点像我们C#中的封装),然后我们需要的时候直接调用这个存储过程,就不用写很多很多的sql语句在我们的编程代码里。

   通过封装减少了代码冗余,不过在公司里却很少使用存储过程,大家知道是为什么吗?

   原因就是:我们在出售我们的产品的时候一般是不会连带我们的数据库一起卖掉,而我们的存储过程是写在我们的数据库中的,所以就造成了调用错误,因此在公司了很少有人用存储过程。但是在我们这个系统中目前不存在这个问题,所以就给我们提供了很大的便利。

下面我们来聊一聊如何写我们需要的存储过程,就拿注册卡来说了

   首先,我们注册卡号就要把所有和卡号有关的项都联动更改,我们先来分析

  1. 添加了卡号————对应学生表卡号位置需要更改
  2. 添加了卡号————同时相当于对新注册的卡充值,需要在充值信息表添加新的记录。、

   这样一来,我们的条件就成立了,我们在注册的时候要同时对多个表的数据进行操作,这时时候我们在数据库中添加我们的存储过程。

  这样就会出现相应的存储过程代码模版(图为2014版本,其余版本为新建存储过程)

  下面是我的注册存储过程

 

-- Template generated from Template Explorer using:
-- Create Procedure (New Menu).SQL
--
-- Use the Specify Values for Template Parameters 
-- command (Ctrl-Shift-M) to fill in the parameter 
-- values below.
--
-- This block of comments will not be included in
-- the definition of the procedure.
-- ================================================
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:		<Author,,Name>
-- Create date: <Create Date,,>
-- Description:	<Description,,>
-- =============================================
CREATE PROCEDURE [dbo].[Proc_Register]--存储过程名称 
	-- Add the parameters for the stored procedure here所需要的参数
	@cardNo int,
	@cash decimal(18,3),
	@date date,
	@Time time(7),
	@StudentNo int,
	@addMoney decimal(18,3),
	@UserID int
	
AS
BEGIN
	-- SET NOCOUNT ON added to prevent extra result sets from
	-- interfering with SELECT statements.
	SET NOCOUNT ON;

    -- Insert statements for procedure here
	SELECT * from Studnet_Info where cardno=@cardNo
	--判断是否存在此卡号
	if @@ROWCOUNT=0
	--在学生表中插入对应的卡号
	insert into Student_Info(cardNo)values(@cardNo)
	--在充值表中添加相应的信息带@的都是你要在DAL层传入的参数
	insert into Recharge(cardNo,StudentNo,addMoney,Date,Time,UserID)values(@cardNo,@StudentNo,@addMoney,@date,@Time,@UserID)
End

  写完存储过程以后,我们要把我们的存储过程保存,一般情况下都是默认存在你想保存的路径下,保存完后我们可以!执行一下看看我们语法是否有错误,如果执行成功,那就代表着没什么问题。

  下面我们就需要在我们的DAL层调用我们的存储过程。

string sql = "PROC_Register"; //存储过程名称
 int registercard = sqlhelper.ExecuteNonQuery(sql, CommandType.StoredProcedure, sqlParams);           
 return registercard;

  我们可以看到CommandType.StoredProcedure,我们通常情况下,在添加sql语句的时候写的是CommandType.Text,在这里StoredProcedure就是我我们调用存储过程的关键字,经常有时候我们调用的式存储过程缺把关键字写错了没这就尴尬了。

  至于传参这个我们会在其他系列C#机房重构的分享中提到。

  最后我们也来说一下为什么不是所有的sql'语句都要写在存储过程中呢,第一点我们已经说了,不便于利用。第二点,存储过程如果使用不当,就会严重拖慢我们的处理速度,因为每一次调用都需要连接数据库并查找然后才传递参数和使用。

本人C#小白,如果有大神斧正,求之不得,希望大佬们不要吝啬自己的语言,万分感谢。

猜你喜欢

转载自blog.csdn.net/Aran_WDX/article/details/81566971