Как правильно организовать класс по работе с БД - C#

Узнай цену своей работы

Формулировка задачи:

Здравствуйте. У меня есть проект каталогизатора. Изначально писал основываясь на MSSQL CE. Потом захотел добавить возможность использования MSSQL Server. И начал сочинять)) Написал фабрику возвращающую класс по работе с конкретной СУБД
Листинг программы
  1. public static class DbProviderFactory
  2. {
  3. public static DatabaseProvider GetProvider(DBType dbType, string ConnectStr)
  4. {
  5. DatabaseProvider provider = null;
  6. switch (dbType)
  7. {
  8. case DBType.MSSQL:
  9. provider = new SqlDbProvider(ConnectStr);
  10. break;
  11. case DBType.MSSQLCE:
  12. provider = new SqlCeDbProvider(ConnectStr);
  13. break;
  14. default:
  15. throw new ArgumentException("Wrong database type!");
  16. }
  17. return provider;
  18. }
  19. }
где DBType - перечисление с вариантами СУБД
Листинг программы
  1. public enum DBType
  2. {
  3. None,
  4. MSSQL,
  5. MSSQLCE
  6. }
Написал абстрактный класс по работе с СУБД где перечислил абстрактные классы по работе с таблицами в БД
Листинг программы
  1. public abstract class DatabaseProvider
  2. {
  3. protected string CONNECT_STR = string.Empty;
  4. protected IDbConnection CNN = null;
  5. public DatabaseProvider(string connectStr)
  6. {
  7. CONNECT_STR = connectStr;
  8. }
  9. public abstract ProjectTableAbstract GetProjectTable();
  10. public abstract FirstUsageTableAbstract GetFirstUsageTable();
  11. public abstract OboznachenieTableAbstract GetOboznachenieTable();
  12. public abstract LiteralTableAbstract GetLiteralTable();
  13. public abstract IspolniteliTableAbstract GetIspolniteliTable();
  14. public abstract InventarNumberTableAbstract GetInventarNumberTable();
  15. }
От него унаследовал класс работы с конкретной СУБД.
Листинг программы
  1. public class SqlCeDbProvider : DatabaseProvider // Для MSSQL CE
  2. {
  3. public SqlCeDbProvider(string connectStr)
  4. : base(connectStr)
  5. {
  6. CNN = new SqlCeConnection(CONNECT_STR);
  7. }
  8. public override ProjectTableAbstract GetProjectTable()
  9. {
  10. return new ProjectTableSqlCe(CNN);
  11. }
  12. public override FirstUsageTableAbstract GetFirstUsageTable()
  13. {
  14. return new FirstUsageTableSqlCe(CNN);
  15. }
  16. public override OboznachenieTableAbstract GetOboznachenieTable()
  17. {
  18. return new OboznachenieTableSqlCe(CNN);
  19. }
  20. public override LiteralTableAbstract GetLiteralTable()
  21. {
  22. return new LiteralTableSqlCe(CNN);
  23. }
  24. public override IspolniteliTableAbstract GetIspolniteliTable()
  25. {
  26. return new IspolniteliTableSqlCe(CNN);
  27. }
  28. public override InventarNumberTableAbstract GetInventarNumberTable()
  29. {
  30. return new InventarNumberTableSqlCe(CNN);
  31. }
  32. }
  33. class SqlDbProvider : DatabaseProvider // Для MSSQL Server
  34. {
  35. public SqlDbProvider(string connectStr)
  36. : base(connectStr)
  37. {
  38. CNN = new SqlConnection(CONNECT_STR);
  39. }
  40. public override OboznachenieTableAbstract GetOboznachenieTable()
  41. {
  42. throw new NotImplementedException();
  43. }
  44. public override FirstUsageTableAbstract GetFirstUsageTable()
  45. {
  46. throw new NotImplementedException();
  47. }
  48. public override ProjectTableAbstract GetProjectTable()
  49. {
  50. throw new NotImplementedException();
  51. }
  52. public override LiteralTableAbstract GetLiteralTable()
  53. {
  54. throw new NotImplementedException();
  55. }
  56. public override IspolniteliTableAbstract GetIspolniteliTable()
  57. {
  58. throw new NotImplementedException();
  59. }
  60. public override InventarNumberTableAbstract GetInventarNumberTable()
  61. {
  62. throw new NotImplementedException();
  63. }
  64. }
Написал набор абстрактных классов по работе с таблицами (на примере ProjectTable)
Листинг программы
  1. public abstract class ProjectTableAbstract
  2. {
  3. protected IDbConnection CNN = null;
  4. public ProjectTableAbstract(IDbConnection Connection)
  5. {
  6. CNN = Connection;
  7. }
  8. public abstract List<Project> GetEntities();
  9. public abstract bool AddToDB(string value);
  10. public abstract bool DeleteFromDB(string value, int id);
  11. public abstract bool RenameInDB(string oldValue, string newValue, int oldValueId);
  12. }
Написал набор конкретных классов по работе с таблицами (на примере ProjectTable)
Листинг программы
  1. class ProjectTableSqlCe : ProjectTableAbstract
  2. {
  3. static SqlCeConnection SQLCeCon;
  4. public ProjectTableSqlCe(IDbConnection Connection) : base(Connection)
  5. {
  6. SQLCeCon = (SqlCeConnection)CNN;
  7. }
  8. public override List<Project> GetEntities()
  9. {
  10. List<Project> _lst = new List<Project>();
  11. if (SQLCeCon.State == ConnectionState.Closed)
  12. {
  13. SQLCeCon.Open();
  14. }
  15. _lst.Clear();
  16. SqlCeCommand ceCmd;
  17. SqlCeDataReader ceDR;
  18. ceCmd = new SqlCeCommand("", (SqlCeConnection)CNN);
  19. ceDR = ceCmd.ExecuteReader();
  20. while (ceDR.Read())
  21. {
  22. _lst.Add(new Project((int)ceDR[0], (string)ceDR[1]));
  23. }
  24. ceDR.Close();
  25. CNN.Close();
  26. return _lst;
  27. }
  28. public override bool AddToDB(string value)
  29. {
  30. int i = -1;
  31. string cmd = "";
  32. SqlCeCommand _cmd = new SqlCeCommand();
  33. _cmd = new SqlCeCommand(cmd, SQLCeCon);
  34. _cmd.Parameters.Add("@prj_name", SqlDbType.NVarChar).Value = value;
  35. i = SQLExec(_cmd);
  36. GetEntities();
  37. return i > 0;
  38. }
  39. public override bool DeleteFromDB(string value, int id)
  40. {
  41. string cmd = "";
  42. int i = -1;
  43. SqlCeCommand _cmd = new SqlCeCommand();
  44. _cmd = new SqlCeCommand(cmd, SQLCeCon);
  45. _cmd.Parameters.Add("@id", SqlDbType.Int).Value = id;
  46. try
  47. {
  48. i = SQLExec(_cmd);
  49. }
  50. catch (Exception ex)
  51. {
  52. if (ex is SqlCeException)
  53. {
  54. ExceptionHandler.SQLEntityException exc =
  55. new ExceptionHandler.SQLEntityException();
  56. throw exc;
  57. }
  58. else
  59. { throw ex; }
  60. }
  61. return i > 0;
  62. }
  63. public override bool RenameInDB(string oldValue, string newValue, int oldValueId)
  64. {
  65. string cmd = "";
  66. int i = -1;
  67. SqlCeCommand _cmd = new SqlCeCommand();
  68. _cmd = new SqlCeCommand(cmd, SQLCeCon);
  69. _cmd.Parameters.Add("@id", SqlDbType.Int).Value = oldValueId;
  70. _cmd.Parameters.Add("@name", SqlDbType.NVarChar).Value = newValue;
  71. try
  72. {
  73. i = SQLExec(_cmd);
  74. }
  75. catch (Exception ex)
  76. {
  77. if (ex is SqlCeException)
  78. {
  79. ExceptionHandler.SQLEntityException exc =
  80. new ExceptionHandler.SQLEntityException();
  81. throw exc;
  82. }
  83. else
  84. { throw ex; }
  85. }
  86. GetEntities();
  87. return i > 0;
  88. }
  89. protected int SQLExec(SqlCeCommand SQLCommand)
  90. {
  91. int i = -1;
  92. if (CNN.State == ConnectionState.Closed)
  93. {
  94. CNN.Open();
  95. }
  96. try
  97. {
  98. i = SQLCommand.ExecuteNonQuery();
  99. }
  100. finally
  101. {
  102. CNN.Close();
  103. }
  104. return i;
  105. }
  106. }
Мне бы хотелось вынести метод SQLExec из каждого конкретного класса вынсти в некий класс (возможно абстактный)? Посмотрев диаграмму классов на все это "творчества", у меня возник вопрос, а не должены ли абстрактные классы наледоваться от какого-то общего класса куда можно было бы вынести общие методы как, например SQLExec? Прошу дать оценку моему певому опыту работы с фабрикой.

Решение задачи: «Как правильно организовать класс по работе с БД»

textual
Листинг программы
  1.   public abstract class ProjectTableAbstract
  2.   {
  3.     private readonly string _connectionString;
  4.  
  5.     protected ProjectTableAbstract(string connectionString)
  6.     {
  7.       _connectionString = connectionString;
  8.     }
  9.  
  10.     public virtual List<Project> GetEntities()
  11.     {
  12.       return Query<List<Project>>("Your query");
  13.     }
  14.  
  15.     public virtual bool AddToDb(string value)
  16.     {
  17.       return SqlExecuteNonQuery("Your query") > -1;
  18.     }
  19.  
  20.     public virtual bool DeleteFromDb(string value, int id)
  21.     {
  22.       return SqlExecuteNonQuery("Your query") > -1;
  23.     }
  24.  
  25.     public virtual bool RenameInDb(string oldValue, string newValue, int oldValueId)
  26.     {
  27.       return SqlExecuteNonQuery("Your query") > -1;
  28.     }
  29.  
  30.     protected abstract IDbConnection GetConnection(string str);
  31.     protected abstract IDbCommand GetCommand(IDbConnection connection, string query);
  32.  
  33.     protected virtual int SqlExecuteNonQuery(string query)
  34.     {
  35.       using (var connection = GetConnection(_connectionString))
  36.       {
  37.         connection.Open();
  38.         using (var command = GetCommand(connection,query))
  39.         {
  40.           return command.ExecuteNonQuery();
  41.         }
  42.       }
  43.     }
  44.  
  45.     protected virtual T Query<T>(string query)
  46.     {
  47.       using (var connection = GetConnection(_connectionString))
  48.       {
  49.         connection.Open();
  50.         using (var command = GetCommand(connection, query))
  51.         {
  52.           //парсинг результата запроса и запись в модель
  53.           return default(T);
  54.         }
  55.       }
  56.     }
  57.   }
  58.  
  59.   public class ProjectTableSqlCe : ProjectTableAbstract
  60.   {
  61.     public ProjectTableSqlCe(string connectionString) : base(connectionString)
  62.     {
  63.     }
  64.  
  65.     protected override IDbConnection GetConnection(string str)
  66.     {
  67.       throw new NotImplementedException();
  68.     }
  69.  
  70.     protected override IDbCommand GetCommand(IDbConnection connection, string query)
  71.     {
  72.       throw new NotImplementedException();
  73.     }
  74.   }
  75.  
  76.   public class ProjectTableMsSql:ProjectTableAbstract
  77.   {
  78.     public ProjectTableMsSql(string connectionString) : base(connectionString)
  79.     {
  80.     }
  81.  
  82.     protected override IDbConnection GetConnection(string str)
  83.     {
  84.       throw new NotImplementedException();
  85.     }
  86.  
  87.     protected override IDbCommand GetCommand(IDbConnection connection, string query)
  88.     {
  89.       throw new NotImplementedException();
  90.     }
  91.   }
  92.  
  93.   public static class TableFactory
  94.   {
  95.     public static ProjectTableAbstract GetTable(string name,string connectionString)
  96.     {
  97.       throw new NotImplementedException();
  98.     }
  99.   }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

8   голосов , оценка 4.25 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы