I’m designing a personal project which is largely database driven. I’m trying to come up with a good design for how to handle database interop, and I’d like the input of the experienced minds here at StackOverflow.
Is the following good design, or is there a more standard way of handling communication with the database?
EDIT
I was mainly looking for feedback on whether it was usual to break up the connection details into their own base class, with subclasses for logical units/classes.
To that end, I’ve modified the code below to add a retrieval method to complement the insertion method in the original question. I’ve also modified it to show that it takes/returns (depending on the method) business objects.
For instance, in the example we use the Employee class throughout the application, but have an EmployeeDb class (inherited from Database) which handles its persistence to/from the database.
I like this because it keeps storage implementation details out of the business objects, but dislike it because it strongly couples the Employee and EmployeeDB classes.
// Abstract Base Class to handle specifics of the database connection
abstract class Database : IDisposable
{
protected OleDbConnection m_Conn;
public bool Open()
{
// Open a connection to the database
}
public void Dispose()
{
if (m_Conn != null)
{
m_Conn.Dispose();
}
}
}
// Specific classes for each table, with methods for CRUD functions
class EmployeeDB : Database
{
public bool AddTestData(Employee emp)
{
// Construct SQL to add Employee class members to the DB, breaking
// them out into their component tables as needed
}
public List<Employee> GetEmployeeByProject(string project)
{
// Retrieve recordset of all employees on the project,
// breaking them out into instances of the Employee class
// Add each new Employee object to a list, and return the list
// to the caller.
}
}
// Specific classes for each table (or logical unit, since obviously
// most of the time we'll need to join a few tables to get what
// we want), with methods for CRUD functions
void AddSomethingToTheDatabase()
{
using (TestDataDB td = new TestDataDB())
{
td.Open(Application.StartupPath);
string NewID = td.AddTestData(txtAddMe.Text);
}
}
Are you sure you don’t want to try an Object Relational Mapper?
Maybe Linq to SQL or nHibernate?