2017-01-10 5 views
0

모든 테이블에 대한 처리기 클래스가 있으며 아래의 함수에서 모든 DB 작업을 수행하고 있습니다. 당신은 내가 SqlConnection 일상의 모든 시간을 사용하고 볼 수한 곳에서 SQL 라이브러리를 포함 할 데이터베이스 액세스 레이어를 디자인하는 방법

public class MyObjectHandler 
{ 
    public bool Insert(MyObject obj) 
    { 
     using(SqlConnection conn = new SqlConnection(DbHandler.ConnectionString)) 
     { 
      SqlCommand comm = new SqlCommand("OBJ_INSERT", conn); 
      comm.CommandType = CommandType.StoredProcedure; 
      comm.Parameters.Add(new SqlParameter("@Code", SqlDbType.NVarChar, 50) { Value = obj.Code }); 
      comm.Parameters.Add(new SqlParameter("@Desc", SqlDbType.NVarChar, 150) { Value = obj.Desc }); 
      comm.Parameters.Add(new SqlParameter("@UserId", SqlDbType.Int) { Value = obj.UserCreated.Id }); 

      conn.Open(); 
      int retVal = comm.ExecuteNonQuery(); 
      conn.Close(); 

      if(retVal > 0) 
       return true; 
      else 
       return false; 
     } 
    } 

    public bool Update(MyObject obj) 
    { 
     using(SqlConnection conn = new SqlConnection(DbHandler.ConnectionString)) 
     { 
      SqlCommand comm = new SqlCommand("OBJ_UPDATE", conn); 
      comm.Parameters.Add(new SqlParameter("@Id", SqlDbType.Int) { Value = obj.Id }); 
      comm.Parameters.Add(new SqlParameter("@Code", SqlDbType.NVarChar, 50) { Value = obj.Code }); 
      comm.Parameters.Add(new SqlParameter("@Desc", SqlDbType.NVarChar, 150) { Value = obj.Desc }); 
      comm.CommandType = CommandType.StoredProcedure; 

      conn.Open(); 
      int retVal = comm.ExecuteNonQuery(); 
      conn.Close(); 

      if(retVal > 0) 
       return true; 
      else 
       return false; 
     } 
    } 

    public bool Delete(int Id) 
    { 
     using(SqlConnection conn = new SqlConnection(DbHandler.ConnectionString)) 
     { 
      SqlCommand comm = new SqlCommand("OBJ_DELETE", conn); 
      comm.Parameters.Add(new SqlParameter("@Id", SqlDbType.Int) { Value = Id }); 
      comm.CommandType = CommandType.StoredProcedure; 

      conn.Open(); 
      int retVal = comm.ExecuteNonQuery(); 
      conn.Close(); 

      if(retVal > 0) 
       return true; 
      else 
       return false; 
     } 
    } 
} 

문제이다. 모든 SQL 라이브러리를 포함하는 클래스 인 계층을 만들고 싶습니다. 이 문제에 대한 일반적인 해결책을 제공해 주시겠습니까? 이것에 대해서도 일반적인 생각조차도 충분할 것입니다. 이 정도면 충분

public static DataTable GetDataTable(string spName) 
{ 
    DataTable resultsTable = new DataTable(); 
    using(SqlConnection conn = new SqlConnection(DbHandler.ConnectionString)) 
    { 
     SqlCommand comm = new SqlCommand(spName, conn); 
     comm.CommandType = CommandType.StoredProcedure; 
     conn.Open(); 
     SqlDataAdapter adapter = new SqlDataAdapter(comm); 
     adapter.Fill(resultsTable); 
     conn.Close(); 
    } 
    return resultsTable; 
} 

,하지만 난 더 나은 솔루션을 쉽게 매개 변수를 보내고 더 유연하게해야합니다 예를 들어

은 데이터를 얻기위한 나의 기능은 간단합니다. 유일한 옵션은 매개 변수 이름, 유형 및 길이를 하나씩 보내는 것입니다. 이것에 대한 디자인을 권하고 싶습니까?

답변

1

리포지토리 패턴과 함께 ORM 사용을 고려하십시오. ORM은 데이터 액세스 레이어를 구축하는 데 정말 유용한 도구입니다. Dapper와 NHibernate가 제일 좋아합니다. 다른 많은 것들이 있습니다.

문제는 내가 볼 수 있듯이 "SqlConnection"루틴을 항상 사용하고 있습니다. 모든 SQL 라이브러리를 포함하는 클래스 인 계층을 생성하고 싶습니다. 이 문제에 대한 일반적인 해결책을 제공해 주시겠습니까? 이것에 대해서도 일반적인 생각조차도 충분할 것입니다.

일반적인 해결책은 ORM입니다. 일반적인 아이디어 (ORM을 사용하지 않고)는 UnitOfWork 패턴을 구현할 수 있습니다. 답변 this을 참조하십시오. Dapper ORM을 사용하고 있지만 핵심 ADO.NET과 유사하게 구현할 수 있습니다. 저장소 패턴이 여기에서 구출됩니다. Repository 내에서 연결을 관리하는 대신 응용 프로그램에서 연결할 수 있습니다. 이렇게하면 응용 프로그램이 UnitOfWork를 완벽하게 제어 할 수 있으며 주어진 상황에 맞는 방식으로 사용할 수 있습니다.

매개 변수를 더 쉽게 보내고 더 유연하게 사용할 수있는 더 나은 솔루션이 필요합니다. 유일한 옵션은 매개 변수 이름, 유형 및 길이를 하나씩 보내는 것입니다.

ORM은 매개 변수를 받아들이는 자체 래퍼를 제공합니다. 그래서 도움이 될지도 모릅니다. ORM이 없으면 Dictionay 또는 그와 비슷한 것을 전달하고 GetDataTable 안에 매개 변수 목록을 작성하여 ADO.NET 호출에 전달할 수 있습니다.