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