스토리지 프로세스 - C#에서 스토리지 프로세스를 호출하는 간단한 예
소개
【정의】: 저장 프로세스(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
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
create
을 alter
⑤ 콘솔에서의 테스트
새 콘솔 항목, 구성 파일에 연결 문자열 추가
패키지된 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. 소스 다운로드
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.