چه توری ميشه با وی بی نت لايه DAL ساخته شده رو استفاده کرد ؟
با سی شارپ ميتونم بنويسم ولی الان با وی بی نت لازم دارم شديداً
Printable View
چه توری ميشه با وی بی نت لايه DAL ساخته شده رو استفاده کرد ؟
با سی شارپ ميتونم بنويسم ولی الان با وی بی نت لازم دارم شديداً
سلام
یعنی چی؟؟؟؟؟
با #C میتونید با VB نمیتونید؟؟؟؟ مگه فرقی داره؟؟؟؟؟؟ در هر دومورد کاملاً یکسان است و اصولاً برنامه نویسی چند لایه ربطی به زبان دارد که حتی بگویم با php میتوانم با delphi نمیتوانم !!!!!!!!!!!!!!؟؟؟؟؟؟؟؟؟؟؟؟؟
مثل این است که بگوییم با delphi میتوانم برنامه بنویسیم ولی با java نمیتوانم!!!!!!!! (نتیجه اخلاقی آنکه پس java بلد نیستید)
اصلاً برنامه نویسی چند لایه هیچ کدخاص یا کلمه کلیدی خاصی ندارد که بگوییم این را استفاده کن تا سه لایه شود .....
یک استاندارد کد نویسی است و بیان میکند که کدهایی که برای ارتباط با هسته بانک اطلاعاتی استفاده میشوند در یک بخش کاملاً مجزا و واحد مجتمع شوند و کدهای کار را با UI هم همینطور و یک سری کد کاملاً مجزا هم این دو را به هم وصل کند......
این فقط یک استاندارد کد نویسی برای تمیز و قابل فهم شدن و نگه داری و توسعه بهتر کد است.
اغلب برای شفاف سازی بیشتر هر لایه را در یک dll یا exe مجزا جا میدهند....
یک چیزی مثل این است که بگوییم نامگذاری متغییر های Integer را برای فهم بیشتر با int یا i شروع کنیم (intTotal یا iSum و....) و اصلاً معنا ندارد که بگوییم در یک زبان میشود و در زبان دیگر نه؟؟؟؟ یک جور توصیه مفید است.
خدمته مهنس h2 جون ارز کنم که من مفهوم برنامه نويسی چند لايه رو مشکل نداشتم که زحمت کشيدين توضيح دادين من منظورم اينه که ميتونم لايه رو با کلاس های وی بی ايجادکنم اينش زياد فرق نداره ولی تو وی بی مثل سی شارپ کلاس ها رو استفاده نميکنن و کاملاً یکسان نیست نحوه ی استفاده ی کلاس تو دو تا زبون فرق داره که من نتونستم تو وی بی به همون صورت که تو سی شارپ استفاده کردم به کار ببرم ،
در ضمن مثال های بی ربطی که زدين نشون ميداد من نتونستم منظورم رو بفهمونم و شما اصلا متوجه سوال نشدين
درسته من استفاده ی کلاس هايی که ايجاد کردم رو تو وی بی بلد نيستم که پرسيدم
سوال اينه که اصلاً چطور ميشه کلاس هاي ايجاد شده در وی بی رو تو برنامه استفاده کردبرنامه اي که نوشتم رو به زودی ميزارم تا راحت تر کمک کنيد
مثلا تو سی شارپ اين کارو ميکنيم
اين کد کلاس لايه DAL
کد:
publicclassUserData
{
public UserData()
{
//
// TODO: Add constructor logic here
//
}
publicint IsUserValid(string user, string pass)
{
SqlConnection con = new SqlConnection(DataHelper.ConStr);
SqlCommand cmd = new SqlCommand();
SqlDataReader dr = null;
int result = -1;
cmd.Connection = con;
cmd.CommandText = string.Format("SELECT * FROM TBL_USER WHERE username='{0}' AND password='{1}'", user, pass);
con.Open();
dr = cmd.ExecuteReader();
if ( dr.Read() )
{
result = (int) dr["PK_ID"];
}
dr.Close();
con.Close();
return result;
}
}
اينم استفادش تو لايه BLL
اينم استفادش تو برنامه یعنی لایه UIکد:
public
classUserManager
{
public UserManager()
{
//
// TODO: Add constructor logic here
//
}
publicint IsUserValid(string user, string pass)
{
UserData dal = new UserData();
return dal.IsUserValid(user, pass);
}
}
کد:
protectedvoid Login1_Authenticate(object sender, AuthenticateEventArgs e)
{
UserManager bll = new UserManager();
int userId = bll.IsUserValid(Login1.UserName, Login1.Password);
if ( userId != -1 )
{
FormsAuthentication.RedirectFromLoginPage(Login1.UserName, false);
}
}
حالا تو وی بی چيکارش ميکنن ؟
به VB تبديل کردم کار نکرد يعنی تو کلاس هاش مشکل نبود تو UI مشکل داشت
اينم از وی بی
DAL
کد:PublicClass UserData
PublicFunction IsUserValid(ByVal user AsString, ByVal pass AsString) AsBoolean
Dim con AsNew SqlConnection
Dim cmd AsNew SqlCommand
Dim dr As SqlDataReader
Dim result AsBoolean = False
con.ConnectionString = "server=(local);database=test;uid=sa;password=123456;"
cmd.Connection = con
cmd.CommandText = String.Format("SELECT * FROM TBL_USER WHERE username='{0}' AND password='{1}'", user, pass)
con.Open()
dr = cmd.ExecuteReader()
If (dr.Read()) Then
result = True
EndIf
dr.Close()
con.Close()
Return result
EndFunction
EndClass
BLLکد:PublicClass UserManager
PublicFunction Authenticate(ByVal user AsString, ByVal pass AsString) AsBoolean
Dim dal AsNew UserData
Return dal.IsUserValid(user, pass)
EndFunction
EndClass
UIهمینه ؟کد:
ProtectedSub Login1_Authenticate(ByVal sender AsObject, ByVal e As System.Web.UI.WebControls.AuthenticateEventArgs) Handles Login1.Authenticate
Dim bll AsNew UserManager
Dim valid AsBoolean
valid = bll.Authenticate(Login1.UserName, Login1.Password)
If (valid) Then
FormsAuthentication.RedirectFromLoginPage(Login1.UserName, False)
EndIf
EndSub
جا هايی که Bold شده مشکل داره
user manager رو نمیشناسه
حالا منظورم رو متوجه شدید استاد ؟!!
سلام مجدد
با عرض پوزش چیزی که من از پست اول برداشت کردم، مشکل در فهم برنامه نویسی سه لایه بوده که به نظر میرسد شما در این مورد مشکلی ندارید.
در کل عضرخواهی میکنم.
کدهای شما در ظاهر هیچ مشکلی ندارند... !؟!؟
شاید مشکل در Refrence کردن ها باشه!؟
مثلاً لایه BLL را کجا تعریف کرده اید؟ در یک DLL دیگر؟؟؟ Refrence را حذف و مجدداً اضافه کنید !؟!؟
اگر هر لایه را در یک اسمبلی (exe یا dll دات نتی) جا داده اید حتماً همه را در قالب یک Solution واحد مجتمع کنید و با کمک property پروژه ها Refrence ها را به هم حذف کرده و مجدداً Refrence را اضافه کنید و در پنجره Add Refrence که به همین منظور نشان داده خواهد شد حتماً از تب Projects استفاده کنید تا حالت دینامیک داشته باشید و بتوانید به راحتی دیباگ کنید و با تغییر کد و کامپایل مجدد مشکلی پیش نیاید.
برای اطمینان بیشتر من خودم کدهای شما را در VS وارد کردم و بجز Login1 که در کد من تعریف شده نبود مشکل دیگری ندیدم، مشکل شما حتماً باید از refrence ها باشد.
ضمناً ربطی به بحث جاری ندارد ولی چه در نمونه #C و VB بهتر است برای com و cmd و dr از Using استفاده کنید و نیز در کد اولیه که صرف وجود سطر در بانک برای اعتبار سنجی شما کفایت میکند بهتر است به جای برگرداندن سطر از (*)COUNT استفاده کنید.
مثلاً کد زیر
کد:'DAL
Public Class UserData
Public Function IsUserValid(ByVal user As String, ByVal pass As String) As Boolean
Using _
con As New System.Data.SqlClient.SqlConnection("server=(local);database=test;uid=sa;password=123456;"), _
cmd As New System.Data.SqlClient.SqlCommand(String.Format("SELECT COUNT(*) FROM TBL_USER WHERE username='{0}' AND password='{1}'", user, pass), con)
Try
con.Open()
Return CInt(cmd.ExecuteScalar) > 0
Catch
End Try
End Using
Return False
End Function
End Class
البته دوستانی که چندان با سه لایه نویسی کار نکرده اند زیاد متعجب نشوند، در یک پروژه بزرگ و کامل این لایه مسئولیت بیشتری خواهد داشت ! و این لایه موجب ایزوله شدن دولایه دیگر از هم میشود و تا تغییر در یکی موجب تغییر در دیگری نشود و....کد:'BLL
Public Class UserManager
Public Function Authenticate(ByVal user As String, ByVal pass As String) As Boolean
Dim dal As New UserData
Return dal.IsUserValid(user, pass)
End Function
End Class
کد:'UI یا PL
Protected Sub Login1_Authenticate(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.AuthenticateEventArgs) Handles Login1.Authenticate
Dim bll As New UserManager
Dim valid As Boolean
valid = bll.Authenticate(Login1.UserName, Login1.Password)
If (valid) Then
System.Web.Security.FormsAuthentication.RedirectFromLoginPage(Login1.UserName, False)
End If
End Sub
اگر باز هم مشکل مذکور ادامه یافت بگویید تا همین مثال خودتان را به صورت اماده تر و در قالب یک Solution واحد بفرستم.
ضمناً من استاد نیستم .
جمیعاً موفق و پیروز و سربلند باشید.
نمی دونم چرا به فکر خودم نرسیده بود ! solution رو دو باره ایجاد کردم مشکل حل شد !
کدهای لایه هم بصورت فایل VB تو َapp_code ایجاد کردم
:21:
در ضمن مزیت استفاده از Using نسبت به روش خودم رو میشه توضیح بدی
از راهنماییت هم ممنونم
سلام
خوشحالم که مشکلتان حل شد.
در مورد Using شما فرض کنید در همین کد جاری در خط ExecuteScalar خطایی پیش آمد و به هزار دلیل مختلف دستور شما در سرور اجرا نشد در کد اولی شما با پیش امدن این وضعیت کدهای Close دیگر اجرا نخواهد شد و Connection باز خواهد ماند، البته میتوان به خود دات نت اعتماد کرد و قضیه را پای خودش گذاشت ولی End Using (یا معادل { اش در #C) با تضمین صددرصد ودر هر شرایط اجرا خواهد شد و شی مورد نظر را نابود خواهد کرد، حتی وقتی من در بدنه و وسط کد دستور Return دادم که به ظاهر نباید کدهای زیرین دیگر اجرا شوند....
یعنی هیچ پیشامدی نمیتواند از End Using و نابودی شی مورد نظر جلوگیری کند.
و نیز End Using از Dispose استفاده میکند که در مورد جاری نه فقط Close را انجام میدهد بلکه شی را هم برای نابود سازی تحویل garbage میدهد.
برای توضیح بیشتر به تاپیک زیر مراجعه کنید
کد:http://forum.p30world.com/showthread.php?t=136911&page=8
موفق و پیروز و سربلند باشید.
از راهنماييتون خيلی خيلی ممنونم مقاله اي که معرفی کردين هم عالی و بسيار مفيد بود