내 공통 데이터 접근층 햇볕 쬐기
19520 단어 데이터
오늘 저의 유니버설 데이터 접근층을 햇볕에 쬐러 왔습니다.
여러 해 동안 데이터베이스 프로젝트를 썼는데 데이터 접근은 업무 실체+저장 프로세스를 사용했기 때문에 저장 프로세스를 호출하는 코드를 자주 쓴다.이 코드들은 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;
}
}
자, 예시를 여기까지 써야 불편하잖아, 스스로 쓰기 좋으면 돼.
더 많은 설명은 압축 패키지의 사용자 매뉴얼 다운로드를 참고하십시오.여기를 클릭하여 예시 전시 및 다운로드 페이지에 들어가세요
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Spark에서 OpenStack Swift 기반 IBM Object Storage에 연결해 본 메모Spark와 같은 빅데이터 전제라면 로그 파일 등이 상정되는 경우도 많을 것입니다만, 일반적인 비즈니스 데이터는 피해서 통과할 수 없기 때문에 우선은 CSV, 라고 하는 것으로 CSV 주위를 조금 시험해 보았을 때 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.