2017-01-10 41 views
0

У меня есть класс обработчика для каждой таблицы, и я выполняю всю работу с DB в функциях, как показано ниже.Как создать слой доступа к базам данных для хранения библиотек 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; 
     } 
    } 
} 

Проблема в том, как вы можете видеть, я использую SqlConnection рутинное все время. Я хочу создать слой, который является классом, который включает в себя все библиотеки 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) может заключаться в реализации шаблона UnitOfWork. См. this ответ. Он использует Dapper ORM, но аналогичный может быть реализован с помощью основного ADO.NET. Здесь хранится шаблон репозитория. Вместо управления соединением внутри репозитория вы можете вставлять его из приложения. Таким образом, ваше приложение получает полный контроль над UnitOfWork и может использовать его так, как подходит для данной ситуации.

Мне нужно лучшее решение для отправки параметров проще и с большей гибкостью. Кажется, единственный вариант - отправить имя параметра, тип и длину по одному.

ORM предоставляют свои собственные обертки для принятия параметров; так что это может помочь здесь. Без ORM вы можете перейти в Dictionay или аналогичный и построить список параметров внутри своего GetDataTable и передать его на вызов ADO.NET.

 Смежные вопросы

  • Нет связанных вопросов^_^