PDA

View Full Version : راهنمایی برای اجرای stored procedure در برنامه نویسی 3 لایه



mehdiba3
یک شنبه 31 فروردین 1393, 01: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;
}

}



}





لطفا دوستان من رو کمک کنن

parvizwpf
یک شنبه 31 فروردین 1393, 02:32 صبح
خطا چیه دقیقا؟

esafb52
یک شنبه 31 فروردین 1393, 08:07 صبح
فیلدهای کلاست نباید پابلیک باشن با پرارپرتی اونها رو کپسوله کن خطا ت رو هم بذارکلا روش کارت اشتباه هست اون متد اد رو که اینجوری نمینویسن تو پست های من سرچ کن یه نمونه خوب گذاشتم

Davidd
یک شنبه 31 فروردین 1393, 08:11 صبح
شما كه اسم SP رو توي كوئري نياوردي و اينم ربطي به لايه بندي نداره كوئري اشتباهه (string Sql = "@name,@family,@Address,@Phone";) . سرچ كني مطلب زياده در مورد فراخواني رويه ذخيره شده.
اما در مورد لايه بندي دو تا نكته ديدم اول اينكه براي تمام دستورات connect, EXE , disconnect به ترتيب فراخواني ميشه پس بهتره اينا رو توي لايه داده بذاري توي يك متد و در لايه BAL فقط يك متد فراخواني بشه نه 3 تا.
نكته دوم اينه كه لايه داده براي متدهاي وابسته به پايگاه داده هست و هدفشم اينه كه اگر پايگاه داده يا تكنوژي اتصال به پايگاه داده عوض شد فقط لايه داده عوض بشه نه بقيه لايه ها. بنابراين اوردن كوئري در لايه BAL يعني لايه BAL هم بايد تغيير كنه. فك كنم اگه يك زيرلايه در لايه داده براي ساخت كوئري بسازي بهتر باشه.

mehdiba3
یک شنبه 31 فروردین 1393, 08:34 صبح
فیلادای کلاس BAL رو برای این عمومی تعریف کردم که در لایه بهدی که همون لایه اول هستش بتونم به مقادیرش پارامتر از طریق تکس باکس ها ارسال کنم

mehdiba3
یک شنبه 31 فروردین 1393, 09:38 صبح
بنظرتون آیا درسته کسی از این روش برنامه نویسی استفاده کنه؟
یعنی هم از SP استفاده کنه هم از لایه بندی؟

ببنیند اینجا لایه ها به صورت منطقی از هم جدا هستن اما فکرشو بکنید که قرار برنامتون به صورت توزیع شده بر روی چند ماشین واقعی جدا از هم N-tier اجرا بشه. بعدش حتما درک می کنید چی میگم

alireza_wills
یک شنبه 31 فروردین 1393, 10:52 صبح
سلام
کلا کارت اشتباهه.

نباید متغیرات public باشن.
شما باید با property این کار رو انجام بدی. انواع و اقسام این نمونه پروژه در دنیای وب وجود داره.

شما باید با کد زیر اطلاعات رو ارسال کنی:
publice string FirstName{get;set}

شما قبل از اینکه به این صورت کد بنویسی پیشنهاد میکنم بحث شیء گرایی رو مطالعه بفرمایید.

mehdiba3
یک شنبه 31 فروردین 1393, 11:58 صبح
سلام
کلا کارت اشتباهه.

نباید متغیرات public باشن.
شما باید با property این کار رو انجام بدی. انواع و اقسام این نمونه پروژه در دنیای وب وجود داره.

شما باید با کد زیر اطلاعات رو ارسال کنی:
publice string FirstName{get;set}

شما قبل از اینکه به این صورت کد بنویسی پیشنهاد میکنم بحث شیء گرایی رو مطالعه بفرمایید.

میشه با مثال توضیح بدین؟
فقط بگین من چطور یک فیلد رو به صورتی که توضیح دادین get;set بتونم به لایه های دیگه و در نهایت به SP ارسال کنم
تشکر

esafb52
یک شنبه 31 فروردین 1393, 12:36 عصر
میشه با مثال توضیح بدین؟
فقط بگین من چطور یک فیلد رو به صورتی که توضیح دادین get;set بتونم به لایه های دیگه و در نهایت به SP ارسال کنم
تشکر
public class database
{
private static string dbname=null;
private static string servername=null;

public static string Servername
{
get { return servername; }
set { servername = value; }
}

public static string Dbname
{
get { return dbname; }
set { dbname = value; }
}
}

esafb52
یک شنبه 31 فروردین 1393, 12:41 عصر
پس حذف کجا رفته؟؟؟

mehdiba3
یک شنبه 31 فروردین 1393, 13:50 عصر
public class database
{
private static string dbname=null;
private static string servername=null;

public static string Servername
{
get { return servername; }
set { servername = value; }
}

public static string Dbname
{
get { return dbname; }
set { dbname = value; }
}
}

میشه راهنمایی کنید که تعاریف بالا برای چیه؟ و اینکه باید در کدوم لایه از نرم افزار قرار بگیره؟ UI یا BLL یا DAL

behnam-soft
یک شنبه 31 فروردین 1393, 18:18 عصر
ببین دوست من، شما می خوای یهو از مرحله 1 بپری مرحله پتج و همین باعث میشه تا با زحمت بیشتری به خواسته ت برسی.در مورد سوالت که در پست قبلی پرسیدی، ببین، در تعاریف کلاس ها، یه سری متغیر ها هستن که بصورت خصوصی تعریف میشن، یعنی فقط در خود کلاس قابل دیدن و تغییر هستن، خب، حالا اگر نیاز شد که مقدار این فیلد های خصوصی رو عوض کنیم چی؟ باید یه متغیر دیگه در نظر بگیریم و بگیم مقدار شما، همون مقداری هست که در اون فیلد خصوصی تعریف شده(معمولا همنام فیلد خصوصی می گرن اسم اون متغیر رو).حالا چطوری می خوننش؟ خب، با نوشتن دستور get ،یعنی هرجا مثلا اول اسم کلاس اومد و بعد اسم این متغیر که پابلیک تعریف شده،بیا این مقداری که داخل بلوک get نوشتیم رو به ما برگردون! اگر هم قرار شد که مقدار جدید داشته باشی، بیا و مقدار جدید رو توسط دستور set بریز در همون متغیر خصوصی که تعریف کردیم! به همین سادگی !
یه مثال :
کاربرد get :
MessageBox.Show(ClassName.PublicName)
مقدار فیلد رو برای ما برمی گردونه
کاربرد Set:
ClassName.PublicName=123
که میاد123 رو میریزه داخل متغیر خصوصی کلاس
موفق باشی