mehdiba3
یک شنبه 31 فروردین 1393, 02:06 صبح
دستورات رو اصلاح و توضیحات بیشتر رو بهش اضافه کردم فقط هرکی میتونه راهنماییم کنه ممنون میشم
سلام
هفته دیگه یک پروژه رو با زبان سی شارپ و معماری سه لایه و با اجرای کوئری به صورت stored procedure که تو sql server تعریف شده باید سر کلاس اجرا کنم. میخوام کمکم کنید. ممنون می شم
شاید این کمک بسیار بدرد دوستای دیکه هم بخوره.
پس یک توضیح کوتاه می دم
---------------------------------------------------------
یکم توش تغییرات دادم اما بازم مشکل دارم امیدوارم کسی باشه بتونه درک کنه منظورم چیه
ببینید من باید یم سری پارامتر از تکس باکس از لایه اول (همون فرم اول که کاربر میبینه) رو بگیرم و ارسال کنم به لایه دوم BLL به صورت زیر
لابه اول:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace data_base_3_tier_Architecture
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void BtnAdd_Click(object sender, EventArgs e)
{
BLL bal=new BLL(); // یک شی از کلاس لایه دوم ایجاد می کنمیم تا به متغیر های عمومیش دسترسی داشته باشیم و بهش پارامتر بدیم
bal.Name = Txtname.Text;
bal.family = Txtfamily.Text;
bal.Phone = TxtPhone.Text;
bal.Address = TxtAdress.Text;
bal.Add();// متد اضافه کردن دستورات که در لایه بعدی تعریف شده و اینجا فراخوانیش کردیم
MessageBox.Show("ذخیره شد");
}
private void Form1_Load(object sender, EventArgs e)
{
}
}
}
لایه دوم رو بیشتر توضیح دادم چیکار میخوام بکنم
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace data_base_3_tier_Architecture
{
class BLL
{
DAL dal=new DAL();
public string Name;
public string family;
public string Address;
public string Phone;
public void Add()
{
// string Sql = "@name,@family,@Address,@Phone";
string Sql= string.Format(this.Name, this.family, this.Phone, this.Address);// مقادیری که باید به صورت پارامتر به روال تعریف شده در اس کیو ال ارسال بشه
// معادل دستور بالا رو به صورت معمولی اگه بخوایم به روال ارسال کنیم باید به صورت زیر باشه
// command.parametr.addwhitvalue(" نام روال ذخیره شده در اس کی ال", textbox1.text)
// اما در اینجا ما نمیتونیم مستقیم تکس باکس 1 رو ارسال کنیم و باید از لاله اول مقادیرش رو بگیریم و ارسال کنیم و این مشکل اصلی منه کخ چطور این کار رو انجام بدم
dal.connect(); // اتصال به بانک که در لایه آخر انجام میشه
dal.EXE(Sql);// اجرای دستور اس کیو ال
dal.Disconnect();// ارتباط با پایگاه داده دیسکونکت شود
// نکنه مهم اینه من دیگه در این نوع برنامه نویسی نباید دستوری مثل دستور زیر رو در برنامه تعریف کنم
// insert into tbl (name,family,address,phone) values(@Name,@Family,@Address,@phone)
// یعنی فقط باید پارامتر ها رو بتونم اینجا تعریف کنم. متوجه هستید؟
// پارامتر ها رو هم چند خط بالا تر اینطور تعریف کردم
// string Sql= string.Format(this.Name, this.family, this.Phone, this.Address)
}
}
}
اینم لایه دسترسی به داده ها یا همون لایه آخر DAL
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data;
using System.Data.SqlClient;
namespace data_base_3_tier_Architecture
{
class DAL
{
SqlConnection con;
SqlCommand com;
SqlDataAdapter Da;
public DAL() // سازنده کلاس
{
con=new SqlConnection();
com = new SqlCommand();
Da=new SqlDataAdapter();
com.Connection = con;
Da.SelectCommand = com;
}
public void connect()
{
con.ConnectionString = "Data Source=.;Initial Catalog=phonbook;Integrated Security=True ";
con.Open();
}
public void Disconnect()
{
con.Close();
}
public void EXE(string Sql)
{
com = new SqlCommand("insertintable",con);// چون نوع برنامه نویسی من استورید پروسیجر هست اینجا حتما فقط و فقط باید به صورتی تعریف بشه که اسم روال ذخیره شده در اس کی ال اول بیاد و بعدش اتصال به بانک انجام بشه که من فکر می کنم این یک اشتباه باشه که بخوام اینجا روال رو فراخونی کنم. یعنی خودم فکر می کنم باید در لایه دوم همه عملیات اس کی الی مثل درج حذف انجام بشه ولی نمیدونم چطور
com.CommandType = CommandType.StoredProcedure;
com.Parameters.AddWithValue("@name, @family, @Address, @Phone",Sql);// بنظرتون اینطور نوشتن درسته؟ که بخوایم به یک باره چنتا پارامتر رو بهش بدیم؟
com.CommandText = Sql;
com.ExecuteNonQuery();
}
public DataTable Select(string Sql)
{
DataTable Dt=new DataTable();
Da.Fill(Dt);
return Dt;
}
}
}
لطفا دوستان من رو کمک کنن
سلام
هفته دیگه یک پروژه رو با زبان سی شارپ و معماری سه لایه و با اجرای کوئری به صورت stored procedure که تو sql server تعریف شده باید سر کلاس اجرا کنم. میخوام کمکم کنید. ممنون می شم
شاید این کمک بسیار بدرد دوستای دیکه هم بخوره.
پس یک توضیح کوتاه می دم
---------------------------------------------------------
یکم توش تغییرات دادم اما بازم مشکل دارم امیدوارم کسی باشه بتونه درک کنه منظورم چیه
ببینید من باید یم سری پارامتر از تکس باکس از لایه اول (همون فرم اول که کاربر میبینه) رو بگیرم و ارسال کنم به لایه دوم BLL به صورت زیر
لابه اول:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace data_base_3_tier_Architecture
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void BtnAdd_Click(object sender, EventArgs e)
{
BLL bal=new BLL(); // یک شی از کلاس لایه دوم ایجاد می کنمیم تا به متغیر های عمومیش دسترسی داشته باشیم و بهش پارامتر بدیم
bal.Name = Txtname.Text;
bal.family = Txtfamily.Text;
bal.Phone = TxtPhone.Text;
bal.Address = TxtAdress.Text;
bal.Add();// متد اضافه کردن دستورات که در لایه بعدی تعریف شده و اینجا فراخوانیش کردیم
MessageBox.Show("ذخیره شد");
}
private void Form1_Load(object sender, EventArgs e)
{
}
}
}
لایه دوم رو بیشتر توضیح دادم چیکار میخوام بکنم
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace data_base_3_tier_Architecture
{
class BLL
{
DAL dal=new DAL();
public string Name;
public string family;
public string Address;
public string Phone;
public void Add()
{
// string Sql = "@name,@family,@Address,@Phone";
string Sql= string.Format(this.Name, this.family, this.Phone, this.Address);// مقادیری که باید به صورت پارامتر به روال تعریف شده در اس کیو ال ارسال بشه
// معادل دستور بالا رو به صورت معمولی اگه بخوایم به روال ارسال کنیم باید به صورت زیر باشه
// command.parametr.addwhitvalue(" نام روال ذخیره شده در اس کی ال", textbox1.text)
// اما در اینجا ما نمیتونیم مستقیم تکس باکس 1 رو ارسال کنیم و باید از لاله اول مقادیرش رو بگیریم و ارسال کنیم و این مشکل اصلی منه کخ چطور این کار رو انجام بدم
dal.connect(); // اتصال به بانک که در لایه آخر انجام میشه
dal.EXE(Sql);// اجرای دستور اس کیو ال
dal.Disconnect();// ارتباط با پایگاه داده دیسکونکت شود
// نکنه مهم اینه من دیگه در این نوع برنامه نویسی نباید دستوری مثل دستور زیر رو در برنامه تعریف کنم
// insert into tbl (name,family,address,phone) values(@Name,@Family,@Address,@phone)
// یعنی فقط باید پارامتر ها رو بتونم اینجا تعریف کنم. متوجه هستید؟
// پارامتر ها رو هم چند خط بالا تر اینطور تعریف کردم
// string Sql= string.Format(this.Name, this.family, this.Phone, this.Address)
}
}
}
اینم لایه دسترسی به داده ها یا همون لایه آخر DAL
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data;
using System.Data.SqlClient;
namespace data_base_3_tier_Architecture
{
class DAL
{
SqlConnection con;
SqlCommand com;
SqlDataAdapter Da;
public DAL() // سازنده کلاس
{
con=new SqlConnection();
com = new SqlCommand();
Da=new SqlDataAdapter();
com.Connection = con;
Da.SelectCommand = com;
}
public void connect()
{
con.ConnectionString = "Data Source=.;Initial Catalog=phonbook;Integrated Security=True ";
con.Open();
}
public void Disconnect()
{
con.Close();
}
public void EXE(string Sql)
{
com = new SqlCommand("insertintable",con);// چون نوع برنامه نویسی من استورید پروسیجر هست اینجا حتما فقط و فقط باید به صورتی تعریف بشه که اسم روال ذخیره شده در اس کی ال اول بیاد و بعدش اتصال به بانک انجام بشه که من فکر می کنم این یک اشتباه باشه که بخوام اینجا روال رو فراخونی کنم. یعنی خودم فکر می کنم باید در لایه دوم همه عملیات اس کی الی مثل درج حذف انجام بشه ولی نمیدونم چطور
com.CommandType = CommandType.StoredProcedure;
com.Parameters.AddWithValue("@name, @family, @Address, @Phone",Sql);// بنظرتون اینطور نوشتن درسته؟ که بخوایم به یک باره چنتا پارامتر رو بهش بدیم؟
com.CommandText = Sql;
com.ExecuteNonQuery();
}
public DataTable Select(string Sql)
{
DataTable Dt=new DataTable();
Da.Fill(Dt);
return Dt;
}
}
}
لطفا دوستان من رو کمک کنن