스토리지 프로세스 - C#에서 스토리지 프로세스를 호출하는 간단한 예

10485 단어
카탈로그
  • 0. 소개
  • 1. 구문 세부
  • 2. 예 1: 모의 이체
  • 3. 예 2: 테스트가 DataTable
  • 로 반환됨
  • 4. 소스 코드 다운로드
  • shanzm-2020년 5월 3일 23:23:44
    소개
    【정의】: 저장 프로세스(Stored Procedure)는 대형 데이터베이스 시스템에서 특정 기능을 완성하기 위한 SQL 문장 집합으로 데이터베이스에 저장되며 한 번 컴파일한 후에 영구적으로 유효하며 사용자는 저장 프로세스의 이름을 지정하고 파라미터를 제시한다(이 저장 프로세스에 파라미터가 있을 경우).
    [장단점]: 저장 과정의 장단점이 모두 매우 뚜렷하다!거의 모든 글에서 저장 프로세스를 논의하는 문자는 다른 장점은 balabala라고 말하지만 단점은 balabala라고 말한다. 그러나 마지막으로 작가의 결론은'나는 저장 프로세스를 사용하는 것을 추천하지 않는다'는 것이다.구체적인 저장 과정의 장단점은 여기에 상세하게 설명하지 않겠습니다!
    회사의 오래된 프로젝트는 저장 프로세스를 사용하여 업무 논리를 실현하는데 어쩔 수 없이 연구할 수밖에 없다!
    쓸데없는 말은 하지 마라, 책은 정전으로 돌아가고, 다음은 저장 과정을 시작한다!
    1. 문법 디테일
  • 변수와 변수 사이를 쉼표로 구분하고 문장의 끝에 문장부호가 없음
  • 성명 변수: declare @variate_name variate_type, 예를 들어 성명 및 부수: declare @name nvarchar(50) ='shanzm' 변수 부수: set @variate_name =value 인쇄 변수: print @variate_name
  • begin……end 사이의 SQL 문장을 하나의 코드 블록
  • 이라고 부른다
  • 사용 가능if……else 논리적 판단
  • 생성 스토리지 프로세스: create procedure pro_name
  • 스토리지 프로세스 실행: execute pro_name
  • 출력 매개 변수: 저장 프로세스가 되돌아오는 것은 SQL 문장 조회 결과입니다. 매개 변수를 정의한 후에 output를 추가하여 출력 매개 변수(C#에서 출력 매개 변수와 유사)로 설정하면 되돌아오는 값이 하나 더 많은 것과 같습니다!
  • 스토리지 생성 프로세스의 기본 형식:
  • create procedure pro_name_tableName
    @param1 param1_type =defaultValue,--               
    @param2 param2_type,
    as
    begin 
    SET NOCOUNT ON;--         
        --sql  
    end
    go
    

    2.예1: 계좌이체 시뮬레이션
    ① 예시 배경: 저장 프로세스를 사용하여 예금표에서 사용자와 사용자 간의 이체를 시뮬레이션한다.
    ② 준비1: 데이터베이스에 테이블szmBank 만들기
    CREATE TABLE [dbo].[szmBank]
    (
    	[Id] [bigint] IDENTITY(1,1) NOT NULL,
    	[Balance] [decimal](18, 0) NOT NULL
    )
    

    테스트 데이터 추가:
    Id                   Balance
    ---------------      ----------------
    1                    1000
    2                    2000
    3                    3000
    

    ③ 준비 작업 2: C# 코드의 SQL 보조 클래스 SqlHelper 캡슐화
    봉인할 때 CommandType 파라미터가 있어야 SQL 문장을 실행할지 저장 과정을 실행할지 결정할 수 있습니다. CommandType 는 하나의 일괄 유형입니다. 그 중에서 Text 값은 SQL 문장을 실행하는 것이고 StoreProcedure는 저장 과정을 실행하기 위해 구체적인 봉인 세부 사항을 설명하지 않습니다.
    2년 전에 내가 봉인한 SqlHelper를 찾았어.cs, 일반적인 사용에는 문제가 없으며 참고만 가능:
    #region
    // ===============================================================================
    // Project Name        :    
    // Project Description : 
    // ===============================================================================
    // Class Name          :    SqlHelper
    // Class Version       :    v1.0.0.0
    // Class Description   :    SQL     
    // CLR                 :    4.0.30319.18408  
    // Author              :    shanzm
    // Create Time         :    2018-8-14 18:22:59
    // Update Time         :    2018-8-14 18:22:59
    // ===============================================================================
    // Copyright © SHANZM-PC  2018 . All rights reserved.
    // ===============================================================================
    #endregion
    
    using System.Configuration;
    using System.Data;
    using System.Data.SqlClient;
    
    namespace _16StoreProcedure
    {
        public class SqlHelper
        {
            private static readonly string connStr =
                ConfigurationManager.ConnectionStrings["connStr"].ConnectionString;
    
            /// 
            ///          
            /// 
            /// SQL       
            ///     
            ///   
            /// 
            public static DataTable GetDataTable(string sql, CommandType type, params  SqlParameter[] param)
            {
                using (SqlConnection conn = new SqlConnection(connStr))
                {
                    using (SqlDataAdapter adapter = new SqlDataAdapter(sql, conn))
                    {
                        if (param != null)
                        {
                            adapter.SelectCommand.Parameters.AddRange(param);
                        }
    
                        adapter.SelectCommand.CommandType = type;
                        DataTable da = new DataTable();
                        adapter.Fill(da);
                        return da;
                    }
                }
            }
    
    
    
            /// 
            ///       
            /// 
            /// SQL       
            ///     
            ///   
            /// 
            public static int ExecuteNonquery(string sql, CommandType type, params SqlParameter[] param)
            {
                using (SqlConnection conn = new SqlConnection(connStr))
                {
                    using (SqlCommand cmd = new SqlCommand(sql, conn))
                    {
                        if (param != null)
                        {
                            cmd.Parameters.AddRange(param);
                        }
                        cmd.CommandType = type;
                        conn.Open();
                        return cmd.ExecuteNonQuery();
    
                    }
                }
    
            }
    
            /// 
            ///                    
            /// 
            /// SQL       
            ///     
            ///   
            /// 
            public static object ExecuteScalar(string sql, CommandType type, params SqlParameter[] param)
            {
                using (SqlConnection conn=new SqlConnection (connStr ))
                {
                    using (SqlCommand cmd=new SqlCommand (sql,conn))
                    {
                        if (param !=null )
                        {
                            cmd.Parameters.AddRange(param);
                        }
                        cmd.CommandType = type ;
                        conn.Open();
                        return cmd.ExecuteScalar();
                    }
                }
            }
    
        }
    }
    

    ④ 저장 프로세스 작성: 데이터베이스에서: 데이터베이스 지정 -->프로그래밍 가능 -->저장 프로세스 -->오른쪽 단추: 새로 만들기 -->저장 프로세스:
    SQL Server에서 작성한 SQL 문장은 기본 포맷이 없습니다. 모든 코드 레이아웃은 제 습관에 따라 Tab 축소 제안을 편집기에 넣고 아래의 저장 과정을 보면 보기 좋을 것입니다!SQL 대소문자는 민감하지 않습니다. 저는 소문자에 익숙해서 읽기가 편합니다!
    -- =============================================
    -- Author:		shanzm
    -- Create date: 2020 5 2  19:56:51
    -- Description:	        
    -- =============================================
    create procedure pro_transfer_szmbank
    @from bigint,
    @to bigint,
    @balance decimal(18,0),
    @returnNum int output--(1      ,2    ,3      )
    as
    begin
    	--              
    	declare @money decimal(18,0)
    	select @money=Balance from dbo.szmBank where Id=@from; 
    	if @money-@balance>=0.1	
    		    --    
    			begin 
    				begin transaction
    					declare @sum int =0
    					--      
    					update szmBank set balance=balance-@balance where id=@from
    					set @sum=@sum+@@error
    					--      
    					update szmBank set balance=balance+@balance where id=@to
    					set @sum=@sum+@@error
    					--      
    					if @sum<>0
    						begin
    							set @returnNum=2--    
    							rollback
    						end
    					else
    						begin
    							set @returnNum=1--    
    							commit
    						end
    			end
    	else
    		begin
    			set @returnNum=3--    
    		end
    end
    go
    
    

    데이터베이스에서 테스트 수행(F5):
    --    :
    declare @ret int
    execute pro_transfer_szmbank 
    @from='1',
    @to='2',
    @balance='10',
    @returnNum=@ret output   --  1.               "output"
                             --  2.              ,       ,                 ,    @ret(       out     )
                             --  3. @returnNum=@ret,  @ret=@returnNum,                ,  =value
    print @ret  --     :1,         
    

    【주의】:
  • @@ERROR: 현재 문장에 오류가 발생하면 오류 코드(예를 들어 0 오류를 제외한 오류 코드는 8134)를 되돌려줍니다. 그렇지 않으면 0을 되돌려줍니다.주의해야 할 것은 @@ERROR 이전의 ql문장에만 유효하며, 모든 문장이 실행되면 즉시 리셋됩니다. 따라서 검증할 문장이 실행된 후에 수치를 검사하거나 국부 변수에 저장해서 나중에 사용할 수 있도록 해야 합니다.
  • 어떤 저장 프로세스를 보려면 데이터에 있는 저장 프로세스를 사용해서 볼 수 있습니다. sp_helptext pro_transfer_szmBank
  • 기존의 저장 프로세스를 수정하고 저장 프로세스를 오른쪽 단추로 --> 수정: 표시된 저장 프로세스는 저장 프로세스를 만드는 과정createalter
  • 로 바꾸는 것일 뿐
  • 저장 프로세스를 정의할 때 매개 변수 유형의 기본적인 입력 매개 변수, 그리고 출력 매개 변수(out)와 입력 출력 매개 변수(output)의 출력 매개 변수와 입력 출력 매개 변수의 차이는 다음과 같다. 입력 매개 변수는 저장 프로세스를 실행할 때 값을 부여할 필요가 없고 입력 출력 매개 변수는 저장 프로세스를 실행할 때 값을 부여해야 한다
  • .
  • SQL Server의 SQL 창에서 일부 SQL 문장을 선택하고 실행을 클릭하면 선택한 SQL 문장
  • 을 실행할 수 있습니다.
    ⑤ 콘솔에서의 테스트
    새 콘솔 항목, 구성 파일에 연결 문자열 추가
    패키지된 SqlHelper에서는 구성 파일에서 데이터베이스 연결 문자열을 읽어야 하므로 참조를 추가합니다. System.Configuration
    static void Main(string[] args)
    {
        //     Id
        int from = 1;
        //     Id
        int to = 2;
        //    
        decimal balance = 10;
    
        SqlParameter[] param =
        {
            new SqlParameter ("@from",from),
            new SqlParameter("@to",to),
            new SqlParameter ("@balance",balance),
            //-------------------------------  :         
            new SqlParameter ("@returnNum",System.Data.SqlDbType.Int){Direction=System.Data.ParameterDirection.Output }
        };
    
        //------------------------  CommonType StorProcedure  
        SqlHelper.ExecuteNonquery("pro_transfer_szmbank",System.Data.CommandType.StoredProcedure, param);
    
        //------------------------      
        //            
        int outPutparam = Convert.ToInt16(param[3].Value);
    
        switch (outPutparam)
        {
            case 1: Console.WriteLine($"success: Id:{from}  {balance}  Id:{to}");break;
            case 2: Console.WriteLine("error"); break;
            case 3: Console.WriteLine("    "); break;
        }
    
        Console.ReadKey();
    }
    
    

    테스트 결과:
    success: Id:1  10  Id:2
    

    3. 예2: 테스트에서 DataTable 반환
    ① 저장 프로세스:
    create  procedure [dbo].[pro_ReturnDataTable]
    as
    begin
    	select Id as   ID ,Balance as    from szmBank;
    end
    go
    

    ② 데이터베이스에서의 테스트:
    execute pro_ReturnDataTable
    

    테스트 결과:szmBank의 모든 데이터 표시
    ③ 콘솔에서의 테스트:
    static void Main(string[] args)
    {
        DataTable dt = SqlHelper.GetDataTable("pro_ReturnDataTable", CommandType.StoredProcedure);
        foreach (DataRow row in dt.Rows)
        {
            Console.WriteLine(row["  ID"].ToString() + ":" + row["  "].ToString());
        }
        Console.ReadKey();
        //TransferAccounts();
        ReturnDataTable();
    } 
    

    테스트 결과:szmBank의 모든 데이터 인쇄
    4. 소스 다운로드
  • C#에서 스토리지 프로시저 사용 - 소스 코드 다운로드
  • 에 필요한 데이터베이스 테이블은 예시에서 설명한 바와 같이 테이블 작성 문장으로 직접 만들 수 있습니다!
  • 저장 프로세스의 SQL 문장은 예시에서 완전하게 보여져 직접 복제할 수 있습니다!
  • 좋은 웹페이지 즐겨찾기