PDA

View Full Version : گرفتن اسم جدول از کاربر برای login شدن به دیتابیس



User-os
جمعه 03 خرداد 1387, 20:00 عصر
سلام . اگر تو دستور insert بخوایم اسم جدول رو از کاربر بگیریم تا بعد به دیتابیس لاگین بشیم. چطور باید متغیری که اسم جدول رو میگیره وسط این دستور جا بدیم?

من اینطوری مینویسم اما جواب نمیده:


cmd.CommandText = " select * from '"+textbox3.text+"' where user_n='" + textBox2.Text + "' and pass='" + textBox1.Text + "'";

Mahdi.Kiani
جمعه 03 خرداد 1387, 20:11 عصر
چه دلیلی داره که کاربر اسم جداول شما را بدونه؟

User-os
جمعه 03 خرداد 1387, 20:31 عصر
میخوام برای درست کردن یه usercontrol ازش استفاده کنم که موقع اضافه کردن اون به برنامه با دادن 2 مقدار connectionstring و اسم جدول به دو property اون بشه لاگین شد.

top7news
جمعه 03 خرداد 1387, 20:34 عصر
خوب چرا مستقیما textbox رو گذاشتی
اول با دستور

selectcommand.parameter.addwithvalue("@a1",textbox1.text)
مقدار textbox رو بریز تو @a1 و بعد اونو جایی که لازم داری به کار ببر.

User-os
جمعه 03 خرداد 1387, 21:13 عصر
خوب چرا مستقیما textbox رو گذاشتی
اول با دستور

مقدار textbox رو بریز تو @a1 و بعد اونو جایی که لازم داری به کار ببر.
اون پست اول رو فقط به فرض مثال نوشتم . وگرنه داخل برنامه که باید از propert استفاده کنم مثلا


public string tablename
{
set
{
_tblname = value;
}
get
{
return _tblname;
}
}

sinpin
جمعه 03 خرداد 1387, 21:14 عصر
سلام . اگر تو دستور insert بخوایم اسم جدول رو از کاربر بگیریم تا بعد به دیتابیس لاگین بشیم. چطور باید متغیری که اسم جدول رو میگیره وسط این دستور جا بدیم?

من اینطوری مینویسم اما جواب نمیده:


cmd.CommandText = " select * from '"+textbox3.text+"' where user_n='" + textBox2.Text + "' and pass='" + textBox1.Text + "'";


به شكل زير نبايد مشكلي داشته باشه:

cmd.CommandText = " select * from "+textbox3.text+" where user_n='" + textBox2.Text + "' and pass='" + textBox1.Text + "'";

Mahdi.Kiani
جمعه 03 خرداد 1387, 21:29 عصر
صرف نظر از صحیح بودن روشتان، به طور کلی در هنگام استفاده از کوئری هایی که به صورت متنی می نویسید بهتره از Place Holder استفاده کنید
هم خوانایی برنامتون را افزایش می دهید و هم مدیرات ان آسان تر خواهد شد و ...

User-os
جمعه 03 خرداد 1387, 22:29 عصر
صرف نظر از صحیح بودن روشتان، به طور کلی در هنگام استفاده از کوئری هایی که به صورت متنی می نویسید بهتره از Place Holder استفاده کنید
هم خوانایی برنامتون را افزایش می دهید و هم مدیرات ان آسان تر خواهد شد و ...
نمیدونم منظورتون از (صرف نظر از صحیح بودن روشتان، )چیه! صورت کلی مسئله که درش اشکالی وارد نیست:ساخت یه usercontrol برای استفاده در برنامه ها برای لاگین شدن .
از نظر من با تعریف دو property به نام connectionstring برای گرفتن رشته اتصال به دیتابیس , tblname برای گرفتن نام جدول مسئله با یه مقدار کد نویسی ها داخل usercontrol حل میشه .
حالا اگر نظر بهتری برای حل مسئله دارین خوشحال میشم بفرمایید .
بهر حال این تالارها صرف پیدا کردن راه حل و جواب برای سوالات نیست . بین این تبادل نظرها گاهی هم ممکنه منفعتی دوطرفه بوجود بیاد.خوبه بدونیم در هر مرحله ای که باشیم باز هم یادگیری میتونه دو طرفه باشه.
ضمنا چون مدتی زیادی نیست که سی شارپ رو اونهم به صورت تجربی شروع کردم راجع به خیلی مسائل هنوز آشنایی ندارم در مورد place holder اگر توضیح بدید خیلی خوبه.

Mahdi.Kiani
جمعه 03 خرداد 1387, 23:08 عصر
نمیدونم منظورتون از (صرف نظر از صحیح بودن روشتان، )چیه! صورت کلی مسئله که درش اشکالی وارد نیست:ساخت یه usercontrol برای استفاده در برنامه ها برای لاگین شدن .
از نظر من با تعریف دو property به نام connectionstring برای گرفتن رشته اتصال به دیتابیس , tblname برای گرفتن نام جدول مسئله با یه مقدار کد نویسی ها داخل usercontrol حل میشه .
حالا اگر نظر بهتری برای حل مسئله دارین خوشحال میشم بفرمایید .


سلام
ایجاد کنترل login کار اشتباهی نیست
من مشکلم اینه که چرا شما می خواهید اسم جدول را از کاربر بگیرید؟
اصلا چه نیازی است که یک کنترل login نیاز به اسم جد.ل داشته باشه؟
کار کنترلی مثل کنترل login چیه؟
این که یک username و یک pwd میگیره و در صورت مطابقت و ok بودن همه چیز ، یک مقدار true و در غیر این صورت یک مقدار false بر می گردونه ( در ساده ترین شکل)
در واقع در حالت ساده یک یوزر کنترل برای لاگین باید شامل یک textBox برای username و یکی برای pass و دو دکمه برای login و cancle داشته باشه و احیانا یک دکمه یا linkLabel نیز برای forget pass و پیاده سازیه event های مربوطه..

***
شاید هم من درست منظور شما را متوجه نشدم



بهر حال این تالارها صرف پیدا کردن راه حل و جواب برای سوالات نیست . بین این تبادل نظرها گاهی هم ممکنه منفعتی دوطرفه بوجود بیاد.خوبه بدونیم در هر مرحله ای که باشیم باز هم یادگیری میتونه دو طرفه باشه.




100% با اون تیکه ای که bold کردم موافقم. (بنده خودم همیشه بیش و پیش از آن که یاد دهنده باشم، یاد گیرنده هستم. نه در این سایت، بلکه در تاریخ استفاده از com )

فکر کنم ظاهرا سوء تفاهمی پیش اومده براتون
موفق باشید

User-os
شنبه 04 خرداد 1387, 06:45 صبح
هنوز احتمال میدم یه ابهاماتی در طرح مسئله م هست .یا اینکه من اشتباه میکنم!

شما اگر یه کنترل بخواهید داشته باشید که همه تو برنامه شون بتونن استفاده کننن . جدای اون اسم جدول که شما مخالفین چه خصوصیاتی براش تعریف میکنید ؟

من فرض رو به پیاده سازی این کد گذاشتم و بعد خواستم بنا بر نیاز خصوصیاتی رو که گفتم تعریف کنم. البته چیزهای دیگم لازم داره !


cnn.ConnectionString = ("integrated security=SSPI;persist security info=True;initial catalog=my3");
cnn.Open();
cmd = new SqlCommand();
cmd.CommandText = " select * from login where user_n='" + textBox2.Text + "' and pass='" + textBox1.Text + "'";
cmd.Connection = cnn;
da = new SqlDataAdapter();
da.SelectCommand = cmd;
dset = new DataSet();
da.Fill(dset);
if (dset.Tables[0].Rows.Count > 0)
{
MessageBox.Show(" خوش آمدید ");

sinpin
شنبه 04 خرداد 1387, 08:02 صبح
شما اگر یه کنترل بخواهید داشته باشید که همه تو برنامه شون بتونن استفاده کننن . جدای اون اسم جدول که شما مخالفین چه خصوصیاتی براش تعریف میکنید ؟
دليلي نداره كه حتما اسم جدول رو به اون كنترل پاس بديد ! ميتونيد يك DataTable بهش پاس كنيد، در هر صورت كدي كه نوشتيد اصلا Reuseable‌ نيست.

بهتره منطق هاي مختلف رو از هم جدا كنيد :
http://barnamenevis.org/forum/showthread.php?t=94791

Mahdi.Kiani
شنبه 04 خرداد 1387, 09:23 صبح
توضیحات را که در پست قبلی دادم که یک کنترل لاگین در ساده ترین حالت چه امکاناتنی باید داشته باشه..
شما نباید کنترل را به نحوی طراحی کنید که کاربر را مجبور به استفاده از روش خاصی ( در مثال شما ، وصل شدن به sql و دادن اسم جدول مورد نظر) کنید.
شاید کاربر بخواهد به صورت دستی userName و pass را چک کنه
شاید کاربر بخواهد اطلاعات user ها را از یک فایل مثل فایل xml ، text , و یا هر جای دیگه ای بخونه
شاید کاربر از sql server متنفره و هزاران شاید دیگه که شما را مجبور می کنه کنترل خود را به نحوی بنویسید که وابستگی اونو به روش خاصی از بین ببره
******
جدای این مسائل، خود کنترل شما، جزء بخش UI در یک نرم افزار به حساب میاد و در معماری های لایه ای نظیر 3 tier ، مخلوط کردن بخش UI با بخش DB کار درستی نیست

موفق باشید

ASKaffash
شنبه 04 خرداد 1387, 10:44 صبح
با سلام
بهتر است شما ظاهر UI را پیاده ساز کنید وبا گرفتن ConnectionString و یک مثلا تابع به SQL اعتبار سنجی را به End User واگذار کنید در ضمن سورس شما SQLInjection خواهد خورد

User-os
شنبه 04 خرداد 1387, 21:25 عصر
سلام مجدد و وقت بخیر.
از شما جناب کیانی و همچنین شما جناب sinpin به خاطر توضیحاتتون متشکرم.
البته بماند که منظور من کلا usercontrol خاص sql بود.ولی با کد شما جناب sinpin متقاعد شدم.

برنامه شما خیلی عالی بود.شما کنترل رو از تمام متعلقاتش خالی کردین.راه ساده و خلاصه ای بود.
لذت بردم .ممنون.

البته فکر نمیکنید که فلسفه اصلی طراحی کنترل حذف دوباره کاری هی طولانی و صرفه جویی زمانی برای هر برنامه است.در مورد کنترل شما مثلا اگه سیستم کاربرای زیادی داشته باشه و کنترل هم الزاما باید به دیتا بیس وصل بشه خوب دوباره باید همون کارهای وصل به دیتابیس و ... رو انجام داد .... درسته؟

Mahdi.Kiani
شنبه 04 خرداد 1387, 23:01 عصر
از اساسی ترین و پایه ای ترین و در عیت حال مقدماتی ترین مباحث OOP اینه که تا حد امکان وابستگی بخش های مختلف برنامه را به هم کم کنیم
خصوصا وابستگی بین UI و DB
و معماری های لایه ای، به ویژه سه لایه اون و نیز معماری های دیگری نظیر MVC و ... نیز بر همین امر استوارند

User-os
شنبه 04 خرداد 1387, 23:41 عصر
از اساسی ترین و پایه ای ترین و در عین حال مقدماتی ترین مباحث OOP اینه که تا حد امکان وابستگی بخش های مختلف برنامه را به هم کم کنیم
خصوصا وابستگی بین UI و DB
و معماری های لایه ای، به ویژه سه لایه اون و نیز معماری های دیگری نظیر MVC و ... نیز بر همین امر استوارندقبول.به خاطر گل روی MVC , tier و.. همه مهندسین معماری
لایه ای.

مرسی جناب کیانی.
البته اکه جناب sinpin هم نظرشون رو بدن خوشحال میشم.