PDA

View Full Version : باز کردن لایه DataAccess به دو لایه مجزا در معماری لایه ای



Rejnev
یک شنبه 27 دی 1388, 21:51 عصر
سلام
در معماری لایه ای برنامه معمولا از سه لایۀ Interface و BusinessLogic و DataAccess بهره میبره.
بحث ما بیشتر روی لایه DataAccess هست و قصد دارم اون رو به دو لایه تبدیل کنم.
علت این کار اینه که وظایف لایه ها هر چه بیشتر از هم متمایز شوند. و این تمایز باعث پیدایش لایه ای جدید میشه که در ادامه میارم.
مطمئن نیستم که قبلا هم این روش ارائه شده باشه اما طبق Search ای که زدم توی جامعه برنامه نویس نبود!
حالا شروع میکنیم
معمولا برای اجرای دستورات در لایه DataAccess متد ها ملزم به ایجاد و قطع اتصال با بانک،ایجاد دستور و اجرای آن و در نهایت در صورت لزوم برگرداندن خروجی مناسب به Logic هست.
با یک تغییر کوچک در لایه میتوانیم وظیفه ایجاد اتصال و اجرای دستور رو از وظایف این لایه جدا کرده و در لایه ای جدید به نام Database قرار بدیم.
پس بطور خلاصه ایجاد اتصال، اجرای یک دستور ارسالی و در صورت لزوم برگرداندن نتیجه حاصل از اجرا از وظایف این لایه است.


http://barnamenevis.org/forum/attachment.php?attachmentid=42713&stc=1&d=1263753959


اگر بخواهیم این لایه رو به شکل یک کلاس تعریف کنیم متدها و خصوصیات زیر رو خواهیم داشت




public class Database
{
static SqlDataAdapter da=new SqlDataAdapter("",Database.Connection());
static DataTable dt=new DataTable();
static SqlCommand cmd = new SqlCommand("", Database.Connection());
private static SqlConnection Connection()
{
string cnnString = "...";
SqlConnection cnn = new SqlConnection(cnnString);
return cnn;
}

public static int executeNone(string sql)
{
int count = 0;
cmd.CommandText = sql;
cmd.Connection.Open();

count = cmd.ExecuteNonQuery();

cmd.Connection.Close();
return count;
}

public static DataTable executeRead(string sql)
{
dt.Clear();
da.SelectCommand.CommandText = sql;

da.Fill(dt);

return dt;
}
}

متد Connection یک اتصال به بانک برمیگردونه
متد excuteNone یک رشته حاوی یک دستور sql گرفته و اجرا میکند و نتیجه عددی معادل تعداد رکوردهایی که تحت تاثیر قرار گرفته اند بر میگردونه. این متد برای اجرای دستورات تغییر در اطلاعات ساخته شده.
متد execute مانند متد قبل منتها جهت خواندن اطلاعات استفاده میشه و در قالب یک dataTable اطلاعات رو برمیگردونه.
متد ها از نوع static تعریف شدن تا در هنگام استفاده در لایه dataAccess نیازی به ساخت شیئ database نباشه.
حالا در لایه DataAccess در بدنه متدها کافیست یک دستور sql ایجاد کنیم و متد مورد نیاز برای اجرا شدن رو از کلاس database انتخاب کنیم.
با تشکر

arashmidos2020
سه شنبه 20 بهمن 1388, 05:07 صبح
بهتر نیست ما به عنوان ورودی متدها یک sqlcommand رو بدیم تا بتونیم استورپروسیجر ها رو هم اجرا کنیم؟

Rejnev
چهارشنبه 21 بهمن 1388, 01:49 صبح
بهتر نیست ما به عنوان ورودی متدها یک sqlcommand رو بدیم تا بتونیم استورپروسیجر ها رو هم اجرا کنیم؟
برای اجرای SP ها کافیه دستورتون رو بصورت زیر بنویسید



string q="exec spName Param1, Param2,..."
database.executeRead(q);

arashmidos2020
پنج شنبه 22 بهمن 1388, 05:43 صبح
سلام منم راجع به این موضوع یک چیزی نوشتم ببینید این چطوره.

public class Database
{
private SqlCommand m_cmd;
private SqlDataAdapter m_da;
private static SqlConnection connection;
public Database(string ConnectionString)
{
Connection.ConnectionString = ConnectionString;

connection = Connection.connection;
}

#region special executing Storprocedures
public int ExecuteNonQuery(string StorprocedureName, List<StoreprocuderParameter> parameters)
{
SqlCommand cmd = GenerateCommand(StorprocedureName,parameters,conne ction);

try
{
Connection.Open();

int i = cmd.ExecuteNonQuery();

Connection.Close();
return i;
}
catch (Exception e)
{
throw new Exception(e.Message);
}
}

private SqlCommand GenerateCommand(string storprocName, List<StoreprocuderParameter> parameters, SqlConnection sqlConnection)
{
SqlCommand cmd = new SqlCommand();

cmd.Connection = sqlConnection;
cmd.CommandType = CommandType.StoredProcedure;
cmd.CommandText = storprocName;
if (parameters != null)
{
foreach (StoreprocuderParameter item in parameters)
{
cmd.Parameters.Add(item.Name, item.InputType).Value = item.InputData;
}
}

return cmd;
}

public object ExecuteScalar(string StorprocedureName, List<StoreprocuderParameter> parameters)
{
SqlCommand cmd = GenerateCommand(StorprocedureName, parameters,connection);

try
{
Connection.Open();

object data = cmd.ExecuteScalar();

Connection.Close();

return data;
}
catch (Exception e)
{
throw new Exception(e.Message);
}
}

public DataTable ExecuteCollection(string StorprocedureName, List<StoreprocuderParameter> parameters)
{
DataSet ds = new DataSet();
DataTable dt = new DataTable("target");

m_cmd = GenerateCommand(StorprocedureName, parameters, connection);

m_da = new SqlDataAdapter();
m_da.SelectCommand = m_cmd;

try
{
m_da.Fill(ds);

return ds.Tables[0];
}
catch (Exception e)
{
throw new Exception(e.Message);
}
}
#endregion

#region special executing common query string commands
public int ExecuteNonQuery(string querystring)
{
SqlCommand cmd = GenerateCommand(querystring,connection);

try
{
Connection.Open();

int i = cmd.ExecuteNonQuery();

Connection.Close();

return i;
}
catch (Exception e)
{
throw new Exception(e.Message);
}
}

public object ExecuteScalar(string querystring)
{
SqlCommand cmd = GenerateCommand(querystring, connection);

try
{
Connection.Open();

object data = cmd.ExecuteScalar();

Connection.Close();

return data;
}
catch (Exception e)
{
throw new Exception(e.Message);
}
}
public DataTable ExecuteCollection(string querystring)
{
SqlCommand cmd = GenerateCommand(querystring, connection);

DataSet ds = new DataSet();
DataTable dt = new DataTable("target");
m_da = new SqlDataAdapter();

try
{
m_da.SelectCommand = cmd;
m_da.Fill(ds);

dt = ds.Tables[0];

return dt;
}
catch (Exception e)
{
throw new Exception(e.Message);
}
}

private SqlCommand GenerateCommand(string querystring, SqlConnection sqlConnection)
{
m_cmd = new SqlCommand(querystring, sqlConnection);

return m_cmd;
}
#endregion
}
کلا یک کتابخانه کردمش گذاشتمش اینجا ...