내 공통 데이터 접근층 햇볕 쬐기

19520 단어 데이터
주의: 본고에서 소개한 프레임워크는 이미 새로운 버전이 있으니 뒷 링크를 클릭하면 읽을 수 있습니다.[ClownFish: 핸드메이드 코드보다 빠른 공통 데이터 접근층]
오늘 저의 유니버설 데이터 접근층을 햇볕에 쬐러 왔습니다.
여러 해 동안 데이터베이스 프로젝트를 썼는데 데이터 접근은 업무 실체+저장 프로세스를 사용했기 때문에 저장 프로세스를 호출하는 코드를 자주 쓴다.이 코드들은 Ado를 사용합니다.net를 어떻게 쓰는지 모두가 알고 있을 것이다. 연결을 만들고 Command를 만들고 명령 매개 변수에 값을 부여한 다음에 호출하고 호출이 끝난 후에 출력 매개 변수가 있으면 읽어야 한다. 결과 집합이 있으면 결과 집합을 자신의 실체 목록으로 전환해야 한다. 이 과정도 매우 기계적이다.한 마디로 하면, 모든 저장 프로세스를 호출하려면 이런 유사한 코드가 필요하다.
나는 가장 완벽한 것을 추구하는 사람이다. 모든 프로젝트에 이런 기계 코드가 존재하는 것을 자연히 좋아하지 않는다. 그래서 끊임없는 재구성 코드를 거쳐 천천히 자신의 유니버설 데이터 접근층을 형성했다.
내 공통 데이터 액세스 계층은 다음과 같은 특징을 가지고 있습니다.
1. 다양한 유형의 데이터베이스에 접근하여 응용 프로그램이 특정한 데이터베이스 유형에서 연근을 풀도록 함으로써 다양한 데이터베이스에 대한 지원을 간단하게 실현할 수 있습니다.2. 저장 프로세스를 매우 편리하게 호출하고 데이터베이스 결과를 실체 유형(또는 목록)으로 바꾸며 호출이 완료되면 자동으로 출력 파라미터를 실체 대상에 되돌려줍니다.하나의 호출만 있으면 이 세 가지 조작 절차를 실현할 수 있다.3. 데이터 접근층은 여러 데이터베이스 유형의 여러 연결을 동시에 지원할 수 있다.실행할 때 간단하게 전환할 수 있습니다.4. 데이터 접근층은'다장부 데이터베이스'와 유사한 지원을 쉽게 실현할 수 있다. 즉, 서로 다른 클라이언트의 요청에 따라 해당하는 데이터베이스 연결을 전환할 수 있다.5. 데이터 접근층은 간단하거나 상세한 API를 동시에 제공한다. 연결이나 업무는 자동으로 제어할 수도 있고 상부 클래스에서 제어할 수도 있다.어쨌든 간소화를 누리는 과정에서 디테일을 충분히 통제할 수 있는 기회를 갖도록 하겠습니다.6.보조(Profiler) 도구 제공, 수시로 상세한 데이터베이스 접근 상황을 알 수 있습니다. 연결을 몇 번 열었는지, 연결마다 어떤 호출을 실행했는지, 호출의 실행 시간, 호출 파라미터 등입니다.
설계 목표: 입력 매개 변수가 아무리 복잡해도, 출력 매개 변수가 아무리 많아도, 결과 집합을 실체 목록으로 변환하는 것을 포함하는 저장 프로세스를 호출한다. C# 코드 한 줄만 있으면 된다.
이 프레임워크의 사용 효과에 대해 더 잘 알 수 있도록 누르십시오: 여기를 클릭하여 예시 전시 및 다운로드 페이지에 들어가세요
1. 시범 코드, 단일 저장 프로세스를 간단하게 호출
C# 실체 유형은 구성원과 데이터베이스 테이블이 대응하고 여기서 테이블 구조를 캡처하지 않습니다.
/// <summary>
///             
/// </summary>
public sealed class Product
{
    public int ProductID { get; set; }
    public string ProductName { get; set; }
    public int CategoryID { get; set; }
    public string Unit { get; set; }
    public decimal UnitPrice { get; set; }
    public int Quantity { get; set; }

    //         (    )     。           。
    [ItemField(OnlyLoadAll = true)]    
    public string Remark { get; set; }
}

저장 프로세스 - 상품 정보 업데이트
create procedure [dbo].[UpdateProduct]( 
    @ProductName nvarchar(50), 
    @CategoryID int, 
    @Unit nvarchar(10), 
    @UnitPrice money, 
    @Quantity int, 
    @Remark nvarchar(max), 
    @ProductID int
) 
as
update Products 
set ProductName = @ProductName, 
    CategoryID = @CategoryID, 
    Unit = @Unit, 
    UnitPrice = @UnitPrice, 
    Quantity = @Quantity, 
    Remark = @Remark 
where ProductID = @ProductID;

C# 호출 코드
public bool UpdateProduct(Product product)
{
    return (FishBLLHelper.CallSpExecuteNonQuery("UpdateProduct", product) > 0);
}

저장 프로세스 - 상품 목록 가져오기, 페이지 나누기 지원
create procedure [dbo].[GetProductByCategoryId](
    @CategoryID int,
    @PageIndex int = 0,
    @PageSize int = 20,
    @TotalRecords int output
)
as
begin
   
declare @ResultTable table
(
    RowIndex int,
    ProductID int,
    ProductName nvarchar(50),
    CategoryID int,
    Unit nvarchar(10),
    UnitPrice money,
    Quantity int
);
   
insert into @ResultTable
select row_number() over (order by ProductID asc) as RowIndex,
       p.ProductID, p.ProductName, p.CategoryID, p.Unit, p.UnitPrice, p.Quantity
from   Products as p
where CategoryID = @CategoryID;
     
select  @TotalRecords = count(*) from  @ResultTable;
   
select *
from   @ResultTable
where  RowIndex > (@PageSize * @PageIndex) and RowIndex <= (@PageSize * (@PageIndex+1));
   
end;

C# 호출 코드
public List<Product> GetProductByCategoryId(int categoryId, ref int pageIndex, int pageSize, out int recCount)
{
    return FishBLLHelper.CallSpGetDataItemListPaged<Product>("GetProductByCategoryId",
		 ref pageIndex, pageSize, out recCount, categoryId);
}

2. 시범 코드, 사무 방식으로 여러 개의 저장 프로세스를 호출한다
C# 실체 유형은 구성원과 데이터베이스 테이블이 대응하고 여기서 테이블 구조를 캡처하지 않습니다.
public sealed class OrderItem
{
    public int OrderID { get; set; }
    public int? CustomerID { get; set; }
    public DateTime OrderDate { get; set; }
    public decimal SumMoney { get; set; }
    [ItemField(OnlyLoadAll = true)]    //              。
    public string Comment { get; set; }
    public bool Finished { get; set; }
    public string CustomerName { get; set; }

    [ItemField(IgnoreLoad=true)]    //        
    public List<OrderDetail> Detail;
}

public sealed class OrderDetail
{
    public int OrderID { get; set; }
    public int ProductID { get; set; }
    public decimal UnitPrice { get; set; }
    public int Quantity { get; set; }
}

주 테이블, 하위 테이블을 삽입하고 총 금액을 갱신하는 데 사용되는 세 가지 저장 프로세스
create procedure [dbo].[InsertOrder](
    @CustomerID int = null,
    @SumMoney money,
    @Comment nvarchar(300),
    @OrderID int output
)
as
begin
 
insert into Orders( CustomerID, OrderDate, SumMoney, Comment)
values( @CustomerID, getdate(), @SumMoney, @Comment);
 
set @OrderID = scope_identity();
 
end;
create procedure [dbo].[InsertOrderDetail](
    @OrderID int,
    @ProductID int,
    @Quantity int
)
as
declare @Price money;
select @Price = (select UnitPrice from Products where ProductID = @ProductID);

insert into [Order Details] (OrderID, ProductID, UnitPrice, Quantity)
values (@OrderID, @ProductID, @Price, @Quantity);
create procedure [dbo].[RefreshOrderSumMoney](
    @OrderID int
)
as
declare @SumMoney money;
select @SumMoney = (select sum(UnitPrice * Quantity) from [Order Details] where OrderID = @OrderID);

update Orders set SumMoney = @SumMoney  where OrderID = @OrderID;

설명: 위의 세 스토리지 요구 사항은 InsertOrder를 먼저 호출한 다음 새 OrderID를 가져와야 다음 두 개를 호출할 수 있습니다.다음은 C#에서 세 가지 스토리지 프로세스를 어떻게 호출하는지 살펴보겠습니다.
C# 호출 코드
public int AddOrder(OrderItem order)
{
    //           FishDbContext  ,           
    using( FishDbContext db = new FishDbContext(true) ) {
        //       Orders,       ID
        FishBLLHelper.CallSpExecuteNonQuery(db, "InsertOrder", order);
        
        //        OrderId,     [Order Details]
        order.Detail.ForEach(x => {
            x.OrderID = order.OrderID;
            FishBLLHelper.CallSpExecuteNonQuery(db, "InsertOrderDetail", x);
        });

        //        。
        FishBLLHelper.CallSpExecuteNonQuery(db, "RefreshOrderSumMoney", null, order.OrderID);

        //     。
        db.CommitTransaction();

        return order.OrderID;
    }
}

자, 예시를 여기까지 써야 불편하잖아, 스스로 쓰기 좋으면 돼.
더 많은 설명은 압축 패키지의 사용자 매뉴얼 다운로드를 참고하십시오.여기를 클릭하여 예시 전시 및 다운로드 페이지에 들어가세요

좋은 웹페이지 즐겨찾기