PDA

View Full Version : سوال: استفاده از parameter در برنامه نویسی سه لایه



mahan0o0
پنج شنبه 06 فروردین 1394, 12:46 عصر
سلام دوستان
من یه برنامه windows application ثبت اطلاعات کاربران دارم که مشخصات کاربران را میگیره و توی جدول sql ثبت میکنه. من از روش سه لابه استقاده کردم. مشکلم اینه که الان میخوام مقادیری که از کاربر میگیره رو به صورت پارامتری به sql بفرسته ولی چون دارم روش سه لایه استفاده میکنم نمیدونم چطور باید اینکار رو انجام یدم. الان کد من به این شکله

لایه اول

class DAL
{
SqlConnection con;
SqlCommand cmd;
SqlDataAdapter da;
public DAL()
{
con = new SqlConnection();
cmd = new SqlCommand();
da = new SqlDataAdapter();
cmd.Connection = con;
da.SelectCommand = cmd;
}
public void conect()
{
con.ConnectionString = "Server=.;Integrated security=SSPI;database=urreg;Trusted_Connection=ye s;";
con.Open();
}
public void disconnect()
{
con.Close();
}
public void EXE(string SQL)
{ cmd.CommandText = SQL;
cmd.ExecuteNonQuery();
}
public DataTable select(string SQL)
{
cmd.CommandText = SQL;
DataTable dt = new DataTable();
da.Fill(dt);
return dt;
}


لایه دوم

class BAL
{
DAL dd = new DAL();
public string name;
public string birthDate;
public string idnum;
public string tel;
public string adres;
public string oldidnimber;
public int idd;

public void ADD()
{
string sql = "insert into usr(Name,BirthDateIDNumber,Number,Adres)";
sql += "values ('{0}','{1}','{2}','{3}','{4}','{5}','{6}','{7}',' {8}','{9}')";
sql = string.Format(sql, this.name,this.birthDate ,this.idnum,this.tel, this.adres);
dd.EXE(sql);
dd.disconnect();
} public void EDIT()
{
dd.conect();
string sql = "update usr set FirstName=N'{1},BirthDate=N'{2}',IDNumber='{3}',Nu mber=N'{4}',Adress=N'{5}' where IDNumber=N'{6}'";
sql = string.Format(sql, this.name, this.birthDate, this.idNum,, this.tel, this.adres, this.oldidnimber);
dd.EXE(sql);
dd.disconnect();

}
public void delete()
{
dd.conect();
string sql = "delete from usr where IDNumber=N'{0}'";
sql = string.Format(sql, this.oldidnimber);
dd.EXE(sql);
dd.disconnect();
}



لایه سوم

public partial class Form1 : Form
private void addbutton_Click(object sender, EventArgs e)
{
BAL ad = new BAL();
ad.name = textBox1.Text;
ad.birthDate = maskedTextBox1.Text;
ad.idNum = textBox2.Text;
ad.tel = textBox3.Text;
ad.adress = textBox4.Text;
ad.ADD();
Form1_Load(null, null);
MessageBox.Show("اطلاعات ثبت شد");
}



اگر بخوام از پارامتر استفاده کنم یعنی به شکل زیر چطور کد زیر رو توی سه لایه استفاده کنم؟ یعنی این کد رو بشکونم و هر قسمت کد توی لایه خودش قرار بگیره. ممنون میشم راهنمایی کنید. چون مبتدی هستم اگه بهم بگید کدم کلا به چه شکل میشه که خیلی لطف کردید

SqlConnection conn = new SqlConnection();
conn .ConnectionString = "Server=.;Integrated security=SSPI;database=ursreg;Trusted_Connection=y es";
con.open();
string sql = "insert into Personnel(Name,BirthDate,IDNumber,Number,Adres) values (@Name, @BirthDate, @IdNumber,@Number, @Adres)";
SqlCommand cmd = new SqlCommand(sql,conn);
cmd.Parameters.AddWithValue("@Name", textBox1.Text);
cmd.Parameters.AddWithValue("@BirthDate", maskedTexBox1.Text);
cmd.Parameters.AddWithValue("@IDNumber", textBox2.Text);
cmd.Parameters.AddWithValue("@Number", textBox3.Text);
cmd.Parameters.AddWithValue("@Adres", textBox4.Text);
cmd.ExecuteNonQuery(sql);
con.close();

ali_md110
پنج شنبه 06 فروردین 1394, 19:00 عصر
سلام
جستجو بزنید توی سایت راهنمایی و آموزش زیاد هست

شما باید کلاس DAL خودتون بدین صورت بنویسید طبق همون مثال خودتون
فرض کنید متد برای درج دارید


public void EXE(string SQL)
{ cmd.CommandText = SQL;
cmd.ExecuteNonQuery();
}


بجای رشته اسکیول یک کالکشن یا آرایه به متد ارسال کنید مثلا یک DataTable




private int EXE(DataTable tbl)
{

int intID = 0;


using (SqlCommand cmd = new SqlCommand("دستورات اسکیول ", cnn))
{
try
{

cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add("@id", SqlDbType.Int, 4);
cmd.Parameters.Add("@Name", SqlDbType.NVarChar, 50);

for (int i = 0; i < tbl.Rows.Count; i++)
{

cmd.Parameters["@id"].Value = tbl.Rows[i]["id"];
cmd.Parameters["@Name"].Value = tbl.Rows[i]["Name"];
intID = cmd.ExecuteNonQuery();
}
}
catch (Exception ex)
{
throw new Exception(ex.Message);
}
finally
{
if (cmd != null)
cmd.Dispose();
}
}
return intID;
}




البته ملزم به استفاده از حلقه نیستید حتی میتونید بجای یک دیتاتیبل پارامترهای ورودی را تک تک بدید ولی کالکشنها مرجح تر هستند

جالا توی لایه دوم BAL یک دیتاتیبل بسازید و تک تک فیلدهای جدول رو درونش تعریف کنید در واقع یک Temp میسازید


public DataTable tempdata()
{
DataTable dt = new DataTable();
DataColumn col;
col = new DataColumn("id", typeof(int));
dt.Columns.Add(col);

col = new DataColumn("Name", typeof(string));
dt.Columns.Add(col);
return dt;

}


این دیتاتیبل وظیفه دریافت اطلاعات و اعتبار سنجی از لایه نمایش و ارسال به لایه DAL بر عهده دارد
ایتدا توی سازنده یک وهله سازی از کلاس DAl بکنید


private DAL _DAL;
public BLL()
{
_DAL = new DAL();

}

باید یک متد دیگه به این لایه اضافه کنید




public int EXE( DataTable tbl, )

{
عملیات اعتبار سنجی مثلا چک کردن فیلدهای دیتاتیبل اینجا انجام بدید درست قبل از اینکه داده به سمت لایه DAL ارسال شود

مثلا:
if (tbl.Rows[0]["Name"] == DBNull.Value)
throw new Exception("اطلاعات را تکمیل کنید");

}
return _DAL.EXE(tbl);

}


قدم بعدی لایه نمایش
یک متد اضافه کرده:


void EXE()
{

}
try
{
using (BLL bll = new BLL())
{

DataTable tbl = new DataTable();
tbl = bll.tempData();
DataRow Drow;
Drow = tbl.NewRow();
Drow["AccName"] = txtName.Text;

tbl.Rows.Add(Drow);
int Affected;
if (tbl.Rows.Count > 0)
{
Affected = bll.EXE(tbl,");
if (Affected < 1)
{

MessageBox.Show(" ثبت شد" );

{

}

catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}




این یک روش ساده بود میتونید از تکنیکهای دیگه هم استغاده کنید

gabrieleb
شنبه 08 فروردین 1394, 20:02 عصر
سلام ، در این تاپیک (http://www.w3-farsi.com/category/%D9%85%D8%B9%D9%85%D8%A7%D8%B1%DB%8C-%D8%B3%D9%87-%D9%84%D8%A7%DB%8C%D9%87/) برنامه نویسی سه لایه به طور کامل توضیح داده شده