C#기계실 재구성-저장 프로세스

전언
우리가 데이터베이스 조종 문장을 쓸 때 만약에 하나의 표의 삭제와 수정만 관련된다면 매우 쉽다. 직접 D층에 해당하는 코드를 쓰면 된다. 그러나 만약에 우리가 여러 장의 표를 동시에 조작해야 한다면?D층에서 한 줄 한 줄 조작문을 쓰는 것은 매우 번거롭고 논리도 매우 명확하지 않습니까?이때 저장 과정의 작용이 나타난다.
스토리지 프로세스란?
저장 프로세스(Stored Procedure)는 대형 데이터베이스 시스템에서 특정 기능을 완성하기 위한 SQL 문장집을 데이터베이스에 저장하고 첫 번째 컴파일을 거친 후에 다시 호출하여 다시 컴파일할 필요가 없다. 사용자는 저장 프로세스의 이름을 지정하고 파라미터를 제시한다(이 저장 프로세스에 파라미터가 있을 경우).저장 프로세스는 데이터베이스 중의 중요한 대상으로 어떤 디자인이 좋은 데이터베이스 응용 프로그램이든 저장 프로세스를 사용해야 한다.
통속적으로 말하면 sql 데이터베이스에서 D층의 조작을 완성했다. 이렇게 하면 좋은 점이 많다. 예를 들어 한 번의 컴파일을 거쳐 다시 호출할 때 직접 사용할 수 있고 두 번의 컴파일을 필요로 하지 않으며 시스템의 부담을 덜어주고 간결하고 명료하다.그런데 만약에 차이가 큰 데이터베이스를 바꾸려면 작업량이 더 많지 않을까요?이것은 잠시 토론하지 않겠다. 우리는 그것이 쓰기에 충분하다는 것을 알았다.
참조 코드
데이터베이스:
USE [ChargeSed_sys]
GO
/****** Object:  StoredProcedure [dbo].[Register]    Script Date: 02/15/2016 14:29:12 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[Register]  
    -- Add the parameters for the stored procedure here 
    --      
    @CardNo char(11),  
    @AddMoney int,
    @ChargeDate date,
    @ChargeTime time(0),
    @Status nchar(10),
    @IsCheck nchar(10),
    @Head nchar(10),
    @StudentNo char(11),
    @StudentName nchar(10),
    @Sex nchar(10),
    @Department nchar(10),
    @Major nchar(10),
    @Grade nchar(10),
    @Class nchar(10),
    @Explain nchar(20),
    @RegisterDate date,
    @Cash int,
    @Type nchar(10)
AS  
BEGIN  
    declare @error int --    (  )  
    set @error = 0   --  (  )  
    BEGIN TRANSACTION   --        
      
    --       
    insert into T_STUDENTS (StudentNo,StudentName,Sex,Department,Major,Grade,Class,Explain)  
    values (@StudentNo,@StudentName,@Sex,@Department,@Major,@Grade,@Class,@Explain)  
     
    set @error = @error + @@ERROR --    
      
    --      
    insert  into T_CARDS (CardNo,StudentNo,RegisterDate,Cash,Type,Status,IsCheck)  
    values (@CardNo,@StudentNo,@RegisterDate,@Cash,@Type,@Status,@IsCheck)
      
    set @error = @error + @@ERROR  --    
      
    --       
    insert into T_RECHARGE (CardNo,AddMoney,ChargeDate,ChargeTime,Status,Head,IsCheck)  
    values(@CardNo,@AddMoney,@ChargeDate,@ChargeTime,@Status,@Head,@IsCheck)  
      
    set @error =@error + @@ERROR --    
      
    if @error <> 0  
        ROLLBACK  --        
    else  
        COMMIT    --         
      
END   

D-레이어:
우선 매개 변수에 값을 부여해야 한다. 저장 과정에서 나타나는 매개 변수는 모두 값을 부여해야 한다. 값을 부여할 내부 변수가 필요하지 않으면 declare 키워드로 설명해야 한다.
string sql = "Register";
bool flag = SqlDAL.SQLHelper.ExecuteNonQuery(sql, CommandType.StoredProcedure, sqlParams);
       
여기서 Register는 나의 저장 프로세스 이름, 이전의 CommandType.Text를 CommandType로 변경합니다.StoredProcedure, 구체적으로 이 두 속성의 뜻은 마우스를 코드에 직접 넣으면 표시됩니다.
참고: 이것은 제가 한 번 컴파일한 저장 프로세스입니다. 저장 프로세스를 만들려면 Alter 키워드를 만든 키워드 CREATE로 바꿔야 합니다.
여러분이 제 코드를 보시면 안의 모든 조종문 뒤에 한 줄의 사무문구가 따라다니는 것을 발견했습니다. 우리는 모두 사무를 배웠습니다. 여기서 우리는 주로 사무의 중요한 특성인 원자성을 사용했습니다.즉, 이 코드들은 모두 집행하거나, 모두 집행하지 않는다는 것이다.이것은 우리 코드의 동기화 진행을 보장한다.
실무, 일, 총무
기왕 사무에 대해 이야기했으니, 우리 다시 사무를 상세하게 알아보자.
1. 트랜잭션(Transaction)은 병렬 제어 단위이며 사용자가 정의한 작업 시퀀스입니다.이 조작들은 모두 하든지, 아니면 모두 하지 않든지, 분할할 수 없는 작업 단위이다.트랜잭션을 통해 SQL Server는 서버가 데이터의 무결성을 유지할 수 있도록 논리 관련 작업 그룹을 결합할 수 있습니다.2. 업무는 보통 BEGIN TRANSACTION으로 시작하고 COMMIT 또는 ROLLBACK으로 끝난다.3. COMMIT는 제출, 즉 사무를 제출하는 모든 조작을 의미한다.구체적으로 말하면 업무 중의 모든 데이터베이스에 대한 업데이트를 디스크에 있는 물리 데이터베이스에 써서 업무가 정상적으로 끝난다는 것이다.4. ROLLBACK는 롤백을 의미한다. 즉, 업무가 실행되는 과정에서 어떤 고장이 발생하여 업무를 계속 진행할 수 없다. 시스템은 업무에서 데이터베이스에 대한 모든 완성된 작업을 모두 취소하고 업무가 시작된 상태로 되돌린다.
트랜잭션의 특성(ACID 특성)
A:원자성(Atomicity) 사무는 데이터베이스의 논리적인 작업 단위로 사무에 포함된 모든 조작을 전부 하거나 전부 하지 않는다.B:일치성(Consistency) 업무가 실행되는 결과는 데이터베이스를 일치성 상태에서 다른 일치성 상태로 바꾸어야 합니다.일치성은 원자성과 밀접하게 관련되어 있다.C: 한 트랜잭션의 실행이 다른 트랜잭션에 의해 방해되지 않도록 격리(Isolation)합니다.D:지속성/영구성(Durability) 사무가 제출되면 데이터베이스에 있는 데이터의 변화는 영구적이어야 한다.
저장 프로세스 검증
저장 과정에서 많은 사람들이 내가 어떻게 나의 저장 과정이 정확한지 검증할 수 있는지 물어볼 것이다. 설마 내가 컴파일러에서 코드로 한 번 더 가야 하는 것은 아니겠지?필요하지 않습니다. 그리고 그렇게 하면 오류가 발생하면 우리는 이 오류가 저장 과정에서인지 코드에서인지 알 수 없습니다. 사실 sql 서버에서 자체 실행 기능을 가지고 있습니다. 우리는 데이터베이스에서 저장 과정의 정확한 여부를 검증할 수 있습니다. 오른쪽 단추를 누르면 저장 프로세스를 실행하고'실행 저장 프로세스'를 누르면 변수에 해당하는 값을 부여합니다. 만약에 당신의 문장이 정확하다면 0을 되돌려줍니다.당신의 저장 과정에 문제가 없다는 것을 증명합니다.
저장 프로세스 반환표
만약 내가 추가와 삭제의 조작을 실행한다면, 시계를 되돌려주지 않을 것이다. 만약 조사한다면, 찾은 임시 시계를 되돌려줄 것이다. 이것은 모두가 알고 있는 것이다.그러나 나의 재구성은 하나의 기능을 필요로 한다. 이것은 한 장의 표가 아니라 여러 개의 표에서 한 개의 데이터를 계산하고 이 몇 개의 데이터를 종합하여 만든 가상 표를 되돌려준다. 어떻게 해야 하지?여기에는 방법이 하나 있다. 나는 select 키워드로 표를 되돌릴 수 있다고 생각한다. 만약에 내가 저장 과정에서 값을 부여할 필요가 없는 내부 변수 몇 개를 정의한다면, 이 변수들을 select로 만들면 성공할 수 있을까?실천해 봤는데 의외로 성공했어요.다음은 내 코드입니다.
select NumSellCard=@NumSellCard,NumBackCard=@NumBackCard,RechargeCash=@RechargeCash,BackCash=@BackCash,Cash=@Cash

맞아요. 바로 계산할 때 되돌려야 할 몇 개의 통합 데이터입니다. 저는 이런 방법으로 이 데이터를 한 장의 표로 통합해서 D층으로 되돌려보냅니다.그러나 나는 이렇게 하는 것이 옳고 그른지 요구에 부합되는지 모르겠으니 여러분의 귀중한 건의를 환영합니다.
저장 과정 중null과 빈 값을 추가할 수 없습니다
저장 프로세스를 사용할 때 외부에서 도입해야 하는 모든 변수는 D층에 값을 부여해야 합니다.null을 추가할 수 없지만, 때로는 빈 값을 추가할 수도 있고, 때로는 안 될 수도 있습니다. 왜 그런가요?원래 저장 과정에서 사용하는 변수가 비어 있으면 오류가 발생하기 때문이다. 예를 들어 우리가 저장 과정에서 If(a is null)를 판단하면 D층에서 a에게 값을 부여하면 오류가 발생하지만 이것은 반드시 값을 부여해야 한다'고 판단한다. 이때 우리는 저장 과정을 바꿀 수 있다.if(a==')그러면 이 문제는 쉽게 풀린다.
총결산
저장 과정은 매우 간단하지만 그 안에 포함된 내용이 확실히 적지 않다. 우리는 모든 문제에 진지하게 직면해야 한다. 그것이 어렵든 어렵지 않든 우리는 많은 것을 배울 수 있고 문제를 해결할 때마다 우리는 성공에 한 걸음 가까워진다. 화이팅.

좋은 웹페이지 즐겨찾기