PDA

View Full Version : سوال: مشکل در ویرایش اطلاعات در معماری سه لایه ...



ghasem110deh
یک شنبه 16 فروردین 1394, 16:55 عصر
سلام به همه ...
دوستان تو معماری سهلایه به مشکل برخوردم (ویرایش)

BLL :

public void update()
{
base.connet();
string query = "Update TGroup Set Id = '{0}', Grouh = N'{1}', Toz = N'{2}' Where Id = {3}";
query = string.Format(query, Id, Grouh, Toz);
base.execute(query);
base.disconnect();
}

و اینم select (یه سطر از جدول)

public DataTable selectone()
{
base.connet();
string query = "Select * From TGroup Where Id = {0}";
query = string.Format(query, Id);
DataTable dt = base.select(query);
base.disconnect();
return dt;
}

UI : (کلید ویرایش)

TGroup tg = new TGroup();
tg.Id = int.Parse(textBox3.Text);
tg.Grouh = textBox1.Text;
tg.Toz = textBox2.Text;
tg.update();

جدول هم اینه :
Tgroup : id - grouh - toz که آیدی identity
خطا هم میگه مقدار نال بر نمی گردونه ... یا یه همچین چیزی !

am_al_59
یک شنبه 16 فروردین 1394, 18:53 عصر
خطاط مال اینه

string query = "Update TGroup Set Id = '{0}', Grouh = N'{1}', Toz = N'{2}' Where Id = {3}";
query = string.Format(query, Id, Grouh, Toz);

چهار تا پارامتر استفاده کردی اما سه تا شو پاس دادی

درضمن این برنامه سه لایه هست؟ منظور از BLL همون لایه Business هست؟
من فکر میکنم BusinessLayer نباید با دیتابیس در ارتباط باشه این وظیفه DataLayer هست
معمولاً Business رابط بین DataLayer و AppLayer هست

ghasem110deh
یک شنبه 16 فروردین 1394, 20:56 عصر
یعنی باس اون آیدی آخر رو دوباره بنویسم ؟
---
اولین تجربم هست !
همین رو هم تیکه پاره از این ورو اونور گیر آوردم ... مطلب هست ولی تیکه پاره !

am_al_59
یک شنبه 16 فروردین 1394, 21:43 عصر
منظورم این نیست که دوباره بنویسی
شما الان توی رشتت 4 تا پارا متر استفاده کردی که عبارتند از

{0} {1} {2} {3}



حالا مقادیرت اینطوری تو رشته میشینه


{0}=id
{1}=Goruh
{2}=Toz
{3}=???????????? هیچی نیست!!!!!!!!!! خطامیده



این لینکو ببین یک برنامه فوق العاده ساده برای برنامه نویسی لایه ای هست
http://www.codeproject.com/Tips/662107/Understand-Tier-Architecture-in-Csharp
فعلاً خودتو درگیر تفاوت tier و Layer نکن. این برنامه رو بنویس و کدهاشو نگاه کن توضیح خواستی بگو همینجا شرحشو بدم بدرد بقیه هم بخوره

ghasem110deh
دوشنبه 17 فروردین 1394, 17:53 عصر
حاجی بنظرم باید یه توضیح بدی !
با اون که نوشته بودم (از یه فیلم آموزشی) خیلی فرق میکنه !

am_al_59
دوشنبه 17 فروردین 1394, 19:32 عصر
این درستشه

string query = "Update TGroup Set Id = '{0}', Grouh = N'{1}', Toz = N'{2}' Where Id = {0}";
query = string.Format(query, Id, Grouh, Toz);

ghasem110deh
دوشنبه 17 فروردین 1394, 23:06 عصر
ممنون بابت اصلاح کد ...
ولی منظورم توضیح اون روشی که تو نمونه ای که لطف کردین بود :)
.
.
.
روش اصولی رو یاد بگیرم بهتره دیگه !

am_al_59
دوشنبه 17 فروردین 1394, 23:15 عصر
توضیح این:

منظورم این نیست که دوباره بنویسی
شما الان توی رشتت 4 تا پارا متر استفاده کردی که عبارتند از

{0} {1} {2} {3}



حالا مقادیرت اینطوری تو رشته میشینه


{0}=id
{1}=Goruh
{2}=Toz
{3}=???????????? هیچی نیست!!!!!!!!!! خطامیده




یا توضیح این:
[QUOTE=am_al_59;2195360]
این لینکو ببین یک برنامه فوق العاده ساده برای برنامه نویسی لایه ای هست
http://www.codeproject.com/Tips/6621...ture-in-Csharp
فعلاً خودتو درگیر تفاوت tier و Layer نکن. این برنامه رو بنویس و کدهاشو نگاه کن توضیح خواستی بگو همینجا شرحشو بدم بدرد بقیه هم بخوره


اولی که به نظر خودم خیلی واضح گفتم
دومی هم که با تصویر و متنی به زبان ساده شرح داده از متن من خیلی بهتره که
اگر دومی منظورتونه چشم شما یک نگاه بنداز هر جاشو متوجه نشدی کدشو بزار من همون قسمتو شرح میدم

ghasem110deh
سه شنبه 18 فروردین 1394, 00:03 صبح
دقیقا منظورم دومیه ! لینک "codeproject" که لطف کردین ...
اینحا همه دستورات (خواندن از بانک) رو توی DA نوشته :

public DataTable Read() {
con.ConnectionString = ConString;
if (ConnectionState.Closed == con.State)
con.Open();
SqlCommand cmd = new SqlCommand("select * from Person",con);
try
{
SqlDataReader rd = cmd.ExecuteReader();
dt.Load(rd);
return dt;
}
catch
{
throw;
} }

و توی BL فقط با دیتاتیبل فراخوانی کرده :

public class PersonBLL {
public DataTable GetPersons()
{
try
{
PersonDAL objdal = new PersonDAL();
return objdal.Read();
}
catch
{
throw;
} }

اینجا هم اورده تو دیتاگرید :

private void Form1_Load(object sender, EventArgs e) {
try
{
PersonBLL p = new PersonBLL();
this.dataGridView1.DataSource = p.GetPersons();
}
catch
{
MessageBox.Show("Error Occurred");
} }

حالا واسه 4 عمل اصلی (که یکیش رو گفته) مثل همین عمل کنم دیگه !
فقط من توی BL دستورات مربوط به دیتابیس رو نوشتم درسته ؟

am_al_59
سه شنبه 18 فروردین 1394, 00:27 صبح
توی این کد و نمونه هایی که من دیدم BusinessLayer مخصوص انتقال اطلاعات بین DataLayer و ApplicationLayer بوده
DataLayer مستقیم با دیتابیس طرفه یعنی وظایف زیر رو انجام میده
اتصال به سرور
عملیات دیتابیس مثل ایجاد دیتابیس، حذف دیتابیس، پشتیبان گیری از دیتابیس
انتقال داده ها با دیتابیس مثل درج، جذف، آپدیت، گزارش گیری (منظورم همون select هست)
شما الان یک متد عمومی توی همین لایه بزار که یک select کلی از یکی از جداول دیتابیست بگیره

BusinessLayer کارهای کنترلی و تبدیل انجام میده
چون تجربه اوله پیشنهاد میکنم تا نیازت نشده زیاد بهش فکر نکنی تا سر در گم نشی
فعلاً توی این لایه فقط یک متد عمومی تعریف کن که نتیجه اون متدی که توی لایه داده هات نوشتی رو بگیره و بریزه تو یک DataTable

ApplicationLayer هم که دیگه معلومه زبان سادش این میشه: هر کنترلی که کاربر میبینه و روش کیلیک میکنه یا توش تایپ میکنه میره تو این لایه
برای این لایه هم شما فعلاً یک فرم بزار یک گرید هم در داخلش، بعد از اون متدی که تو لایه بیزینست هست DataTable رو بگیر و تو گرید نمایش بده

کلش همین بود حالا کم کم هی گسترشش بده
تجربه اولو بخوای از همون ابتدا همه چیزو تو همه جا تکمیل کنی اذیت میشی آخرم با کلی اشتباه و خطا ناقص یاد میگیری
اینطوری فکر می کنم مفهومی تر بشه

ghasem110deh
سه شنبه 18 فروردین 1394, 00:57 صبح
ایول ...
فکر کنم گرفتم چی شد !


فعلاً توی این لایه فقط یک متد عمومی تعریف کن که نتیجه اون متدی که توی لایه داده هات نوشتی رو بگیره و بریزه تو یک DataTable

لایه بیزینس در واقع فقط داد و ستد میکنه ! هیچ کاری نمیکنه ... واسه همین هم میگن از هم مستقل هستن !؟ اما اون روش قبلی که رفته بودم دیگه هیچ کدوم مستقل نبودن ...
یعنی اگه لایه بیزینس حذف میشد ، کلا پروژه میرفت رو هوا ! ولی اینجوری نه (میشه اطلاعات رو از توی لایه کاربرد هم گرفت)
درست فهمیدن یا نه :)

am_al_59
سه شنبه 18 فروردین 1394, 01:13 صبح
ایول ...
فکر کنم گرفتم چی شد !



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


لایه بیزینس فعالیت های مهم زیادی داره و فقط اینو میتونم بگم در موردش اعمال تغییرات روی داده ها و انجام عملیات کنترل
مثلاً من یک برنامه دارم که حسابداریه وقتی مجبورم قیمت تمام شده کالاهارو حساب کنم اینو با کوئری که نمیشه درآورد
با لایه دیتام اطلاعات لازم رو فیلتر میکنم و میگیرم اونوقت توی لایه بیزینسم میام از اون اطلاعات استفاده میکنم جمعو تفریق و محاسبات قیمت تمام شده هر کالا رو حساب میکنم میریزم تو یک جدول مثلاً DataTable که بتونم تو لایه اپلیکیشنم استفاده کنم
اما بستگی به برنامه داره در یک برنامه ممکنه شما اصلاً نیازی به این لایه نداشته باشی
اینکه برنامه حتماً باید سه تا لایه داشته باشه که وحی نشده جزء اصول دین هم نیست
وقتی عملیاتی مثل اونچه گفتم نداری و فقط باید بریزی تو دیتابیس و کوئری رو فیلتر کنی و نمایش بدی دیگه business به درد نمیخوره مبشه کار و بار اضافه پس خیلی شیک میتونی حذفش کنی

اصول لایه ها هم اینه که فقط به لایه زیریشون دسترسی داشته باشن اگر برنامه هم به لایه زیریش هم به لایه زیر زیریش دسترسی داشته باشه که دیگه اسمش لایه ای نمیشه، اسمش میشه tier اگر سه تا باشه میشه 3tier توی همون لینک ببین نوشته 3tier

ghasem110deh
پنج شنبه 20 فروردین 1394, 17:50 عصر
الان واسه هر جدول باس تو DAL و BLL یه کلاس جدا طراحی کرد دیگه ؟

am_al_59
پنج شنبه 20 فروردین 1394, 22:54 عصر
میتونی کلاس تعریف کنی اگر هدف فقط انتقاله از DataTable استفاده کن
اگر میخوای تعریف کنی کلاس ها تو DAL تعریف نمیشن باید تو BAL تعریف کنی اما باید توجیه داشته باشه
همیشه روش استاندارد روش مناسبی نیست
برنامه شماست قوانین هم قوانین شماست حالا اینکه چه روشی خوبه یا چه روشی بهتر فقط تجربه هست

ghasem110deh
سه شنبه 25 فروردین 1394, 12:10 عصر
سلام
به این روش که توی code project گفته ، تو درج (Insert) به مشکل خوردم !

Todco.ir
سه شنبه 25 فروردین 1394, 12:30 عصر
با سلام.
کدتونو بذارید تا بررسی بشه

ghasem110deh
سه شنبه 25 فروردین 1394, 12:41 عصر
این لایه DAL هست ... واسه یه جدول به اسم Agent :

using System;using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;


namespace DAL
{
public class Agent
{
public string ConString = "Data Source=.;Initial Catalog=Rahgoshafan;Integrated Security=True";
SqlConnection con = new SqlConnection();
DataTable dt = new DataTable();

public string Agent;
public string Mobile;
public byte Pic;
public string Toz;


public DataTable Read()
{
con.ConnectionString = ConString;
if (ConnectionState.Closed == con.State)
con.Open();
SqlCommand cmd = new SqlCommand("Select * From Agent", con);
try
{
SqlDataReader rd = cmd.ExecuteReader();
dt.Load(rd);
return dt;
}
catch
{
throw;
}
}


public void Insert()
{
con.ConnectionString = ConString;
if (ConnectionState.Closed == con.State)
con.Open();
SqlCommand cmd = new SqlCommand("Insert Into Agent (Agent, Mobile, Pic, Toz) Values (N'{0}', N'{1}', '{3}' ,N'{4}')", con);
try
{
cmd.ExecuteNonQuery();
}
catch
{
throw;
}
}


public void Delete()
{
con.ConnectionString = ConString;
if (ConnectionState.Closed == con.State)
con.Open();
SqlCommand cmd = new SqlCommand("Delete From TGroup Where Id = {0}", con);
try
{
cmd.ExecuteNonQuery();
}
catch
{
throw;
}
}


public void Update()
{
con.ConnectionString = ConString;
if (ConnectionState.Closed == con.State)
con.Open();
SqlCommand cmd = new SqlCommand("Update TGroup Set Agent = N'{0}', Mobile = N'{1}', Pic = '{2}', Toz = N'{3}' Where Id = {4}", con);
try
{
cmd.ExecuteNonQuery();
}
catch
{
throw;
}
}
}
}

این لایه BLL هستش :

using System;using System.Collections.Generic;
using System.Data;
using DAL;


namespace BLL
{
public class Agent_BLL
{
public DataTable Get_Agent()
{
try
{
Agent Agent_Read = new Agent();
return Agent_Read.Read();
}
catch
{
throw;
}
}


public void Insert_Agent()
{
try
{
Agent Agent_Insert = new Agent();
Agent_Insert.Insert();
}
catch
{
throw;
}
}


public void Delete_Agent()
{
try
{
Agent Agent_Delete = new Agent();
Agent_Delete.Delete();
}
catch
{
throw;
}
}


public void Update_Agent()
{
try
{
Agent Agent_Update = new Agent();
Agent_Update.Update();
}
catch
{
throw;
}
}
}
}


حالا همه فرم هام اینجوری شدن ! (عکس ضمیمه)

ebrahim.rayatparvar
سه شنبه 25 فروردین 1394, 20:17 عصر
سلام دوستان.
طبق چیزایی که من دیدم موضوعتون برنامه نویسی 3لایه بوده و چگونگی پیاده سازی و رو این که فقط در لایه BLL کلاس ها رو تعریف می کنیم باید بگم من برای برنامه های خودم اگر در لایه BLL کلاسی برای مشتری است همون کلاس در لایه DAL هم هست. حالا میگین چرا برای هر کلاس در BLL باید یک کلاس در لایه DAL وجود داشته باشه. اولا که من هیچ کدی در محیط سی شارپ نمی زنم و از روش stored procedure در SQL استفاده میکنم و هیچ کدی از SQL نباید در محیط سی شارپ زده بشه چون خیلی خیلی برای یک برنامه حرفه ای ضرر داره اولین و بزرگترین مشکل اینکه رو حافظه و دیتابیس مدیریت دارید ولی در روش بالا غیر ممکن است. و برای درست کردن کد هایی که در SQL زدن در یک برنامه بزرگ که در یک شرکت بزرگ نوشته شده است نیاز نیست که تمام برنامه ها آپدیت بشن بلکه یه دیتابیس آپدیت بشه برای همه اعمال میشه . زیاد وارد بحث SQL نمیشم ولی بخاطر استفاده از این روش برای فرستادن مقدار در SQL و اجرای آن برای هر بخش نیاز به 1 کلاس در هر لایه یعنی BLL و DAL داریم.

ghasem110deh
چهارشنبه 26 فروردین 1394, 10:38 صبح
سلام
یعنی درج و ویرایش و ... رو با پروسیجر میزنین !
بعد پروسیجر رو توی DAL صدا میزنین --> بعد به BLL و در آخر توی فرم !؟
.
.
.
اگه اینطوره که فهمیدم ... فرق DAL و BLL تو چیه ؟ لطفا بیشتر توضیح بدین !

ghasem110deh
چهارشنبه 26 فروردین 1394, 16:34 عصر
این پروسیجر واسه درج :

USE [RahgoshafanDB]GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE Category_Insert
@Category NVARCHAR(MAX),
@Toz NVARCHAR(MAX)
AS
BEGIN
INSERT INTO Category(Category, Toz)
VALUES (@Category, @Toz)
END

این لایه دیتااکسس :

using System;using System.Data;
using System.Data.SqlClient;


namespace DAL
{
public class Category_Dal
{
SqlConnection SqlCon = new SqlConnection("Data Source=.;Initial Catalog=RahgoshafanDB;Integrated Security=True");
int id;
public void Category_Insert()
{
try
{
SqlCommand cmd = new SqlCommand("Category_Insert", SqlCon);
cmd.CommandType = CommandType.StoredProcedure;
SqlCon.Open();
cmd.ExecuteNonQuery();
}
finally
{
if (SqlCon.State != ConnectionState.Closed)
SqlCon.Close();
}
}
}
}

توی BLL و کلید درج گیر کردم !
--------------------------------
توی روش معمولی (که همه کدها پشت فرم بود) تکست باکس ها رو میشناخت ... و این رو اضافه میکردم و خلاص

cmd.Parameters.AddWithValue("@Category", txt1.Text.Trim());
cmd.Parameters.AddWithValue("@Toz", txt2.Text.Trim());

الان چی !؟

ghasem110deh
چهارشنبه 02 اردیبهشت 1394, 12:16 عصر
سلام
الان توی sql فیلد عکس رو img گذاشتم ...
و توی DAL از نوع byte تعریفش کردم (چون image نداره)
.
.
.
حالا واس insert گیر کردم ... تصویر رو به بایت تبدیل کردم ولی متد insert فقط مقدار byte میخواد :


public static byte[] ImageToByte(Image img)
{
ImageConverter converter = new ImageConverter();
return (byte[])converter.ConvertTo(img, typeof(byte[]));
}


private void Btn_Insert_Click(object sender, EventArgs e)
{
var result = 0;
try
{
result = new Agent_Bll().Insert(Txt_Agent.Text.Trim(), Txt_Mob.Text.Trim(), pictureBox1.Image(ImageToByte), Txt_Toz.Text.Trim());


به این گیر میده که از نوع بایت نیست :

pictureBox1.Image(ImageToByte)

چیکارش کنم !

ghasem110deh
پنج شنبه 03 اردیبهشت 1394, 18:49 عصر
من هر جوری عکس رو به بایت تبدیل میکنم ... باز توی این تیکه به بایت نبودن ورودی گیر میده :


pictureBox1.Image(ImageToByte)


از کانورت تو ایمیج هم استفاده کردم ... جواب نداد !