PDA

View Full Version : آموزش: ساخت دستور SQL برای هر فرمی با هر تعداد کنترل



m110_110
دوشنبه 25 آبان 1388, 22:43 عصر
با سلام
البته این کار سخت و یا خیلی خاص نبود و در حد یک ایده کوچک و جالب برای خودم بود که خیلی هم راهگشا برام بود
حالا هم خواستم اینجا بگذارم تا دیگران هم استفاده کنند و اون رو از لحاظ ضعف ها و خوبی ها بررسی کنیم
پیشاپیش ممنونم از نظر های دوستان

------
نمی دونم تا حالا خواستید به راحتی بتوانید یک دستور sql بنویسید که در هر فرمی با هر تعداد کنترلی رو انجام بدهید یا نه؟؟
این یک نمونه از این کدهاست که با بهتر کردن و بهینه تر کردن آن در همه پروژه هاتون و در تمام فرم ها تون می توانید استفاده کنید
البته من فقط کد زیر را برای دستور insert و همچنین نوع کنترل TextBox نوشتم که البته شما می توانید نوع های بیشتری رو بهش اضافه کنید که توصیه می کنم برای این کار یک کلاس بنویسید
راستی یادتون نره که نام کنترل ها همنام فیلد هاست تا بتوان بدون هیچ قید و بندی در هر کجا استفاده کرد
خوب می دونید که این کد رو می توانید در windows application هم استفاده کنید
و اما کد ها

در صفحه ی Default.aspx




<divid="MainControls"runat="server">
<asp:TextBoxID="FieldName1"runat="server">asp:TextBox><br/>
<asp:TextBoxID="FieldName2"runat="server">asp:TextBox><br/>
<asp:TextBoxID="FieldName3"runat="server">asp:TextBox><br/>
<asp:TextBoxID="FieldName4"runat="server">asp:TextBox>
div>
<asp:ButtonID="Button1"runat="server"Text="Button"onclick="Button1_Click"/>


و در صفحه

Default.aspx.cs




protectedvoid Button1_Click(object sender, EventArgs e)
{
string Insert1 = "Insert Into TableName (", Insert2 = ") Values (";
foreach (Control ct in MainControls.Controls)
{
if (ct.GetType().ToString() == "System.Web.UI.WebControls.TextBox")
{
Insert1 += ct.ID + ", ";
Insert2 += "'" + ((TextBox)ct).Text + "', ";
}
}
Insert1 = Insert1.Substring(0, Insert1.Length - 2);
Insert2 = Insert2.Substring(0, Insert2.Length - 2);
Insert1 += Insert2;
}


حالا دستور sql اماده است و می توانید استفاده کنید

raziee
دوشنبه 25 آبان 1388, 23:36 عصر
از نظز امنیت به نظرت پر ریسک نیست؟
این لینک رو بخون.
روش های محافظت و موارد رعایت اصول امنیتی در برنامه های ASP.NET (http://barnamenevis.org/forum/showthread.php?t=91241)

m110_110
سه شنبه 26 آبان 1388, 10:36 صبح
سلام
شما درست مي گوييد
اول اينكه اگر از اين مورد در برنامه هاي ويندوزي بخواهي استفاده كني كه خوب مشكلي نداره
اما در وب از اونجايي كه من از مستر استفاده كرده ام و يك فرمي دارم كه اون اين فرم مثلا درج بالا (كه به عنوان يك UserControl هست) را لود مي كنه كه اين كار باعث ميشه id هاي كنترل هاي در سمت كلاينت تغيير زيادي بكنه

Mostafa_Dindar
سه شنبه 26 آبان 1388, 11:24 صبح
راه رو براي Sql Injection خوب باز گذاشتين !
در ضمن داخل حلقه ميتونستين شرط رو اينطوري بنويسين :

if (ct is TextBox)
يا

if (ct is ُSystem.Web.UI.WebControls.TextBox)

m110_110
سه شنبه 26 آبان 1388, 11:33 صبح
سلام
خوب
من كه نگفتم كه حتما اين خوبه همون اول هم گفتم كمك كنيد مشكلاتش رو حل كنيم تا هم از لحاظ امنيت و هم از لحاظ كارايي بالا بره و بتونيم در هر فرمي استفاده كنيم
ممنون ميشم كه همراه با عنوان كردن مشكل ، راه حلي هم ارائه بدهيد

Mostafa_Dindar
سه شنبه 26 آبان 1388, 11:50 صبح
نمی دونم تا حالا خواستید به راحتی بتوانید یک دستور sql بنویسید که در هر فرمی با هر تعداد کنترلی رو انجام بدهید یا نه؟؟

دوست من .پيشنهاد ميكنم هميشه از Stored Procedure ها استفاده كني ضمن اينكه Code Generator هاي رايگان زيادي هست كه چهار عمل اصلي و حتي بيشتر را براحتي براي شما توليد ميكنند .

abbasjafarnezhad
سه شنبه 26 آبان 1388, 15:45 عصر
دوست عزیز میشه سایتی رو معرفی کنی که Code Generator رو بشه دانلود کنی و روش استفاده زا اون بگی
با تشکر

Mostafa_Dindar
سه شنبه 26 آبان 1388, 18:45 عصر
دوست عزیز میشه سایتی رو معرفی کنی که Code Generator رو بشه دانلود کنی و روش استفاده زا اون بگی
با تشکر
همين سايت چند تا داره كه اگه بگردي ميتوني پيدا كني . (يكيشون رو DelphiAssistant نوشته )
من خودم از CodeSmith استفاده ميكنم كه اگه بخواي ميتونم Template اونو برات بزارم .

Mostafa_Dindar
سه شنبه 26 آبان 1388, 20:02 عصر
اين آدرسCodeGenerator آقاي Delphi Assistant

http://barnamenevis.org/forum/showthread.php?t=87372

اينم Template كد اسميتي كه من استفاده ميكنم 12 مدل Stored Procedure رو برات ميزنه

abbasjafarnezhad
چهارشنبه 27 آبان 1388, 16:01 عصر
با تشکر از توجه و لطف شما
میشه یکم توضیح بدی

Mostafa_Dindar
پنج شنبه 28 آبان 1388, 09:39 صبح
با تشکر از توجه و لطف شما
میشه یکم توضیح بدی

كد اسميت يك نرم افزار (غير رايگان) هست كه به شما كمك ميكنه كارهاتون رو بسيار سريعتر انجام بدين . بعبارت ديگر يك توليد كننده Source Code هست كه بر اساس Template نوشته شده كار ميكنه . شما ميتونيد از Template هاي آماده و نوشته شده رايگان به معماريهاي متفاوت استفاده كنيد مثل : .netTiers (http://www.codesmithtools.com/features/frameworks.aspx#nettiers), CSLA (http://www.codesmithtools.com/features/frameworks.aspxC#%E2%80%8E%E2%80%8Esla), NHibernate (http://www.codesmithtools.com/features/frameworks.aspx#nhibernate), PLINQO (http://www.codesmithtools.com/features/frameworks.aspx#plinqo), Wilson's ORMapper (http://www.codesmithtools.com/features/frameworks.aspx#wilsonormapper), APOSA (http://www.codesmithtools.com/features/frameworks.aspx#aposa),
يا اونها رو تغير بدين يا Template رو خودتون بنويسين تا دقيقا كد مورد نظر شما رو توليد كنه . نكته قابل توجه اينه كه زبان Template ها بسيار ساده و شبيه نوشتن كد در ASP.NET با زبانهاي C#‎‎ , VB, JScrpt هستش پس براي كار لازم نيست زبان ديگري رو ياد بگيريد . قبلا دوستان در اين فروم در مورد اون صحبت كردند ميتونيد جستجو كنيد ولي براي اطلاعات بيشتر توصيه ميكنم اين لينك رو دنبال كنيد :http://community.codesmithtools.com/blogs/tutorials/archive/2006/02/13/nettiers.aspx

iman_ad
پنج شنبه 28 آبان 1388, 19:14 عصر
sp هم جنریت می کنه؟

irlogo
پنج شنبه 28 آبان 1388, 19:33 عصر
می تونین یه کم بیشتر توضیح بدین؛ برای من کار نکرد

Mostafa_Dindar
پنج شنبه 28 آبان 1388, 20:58 عصر
می تونین یه کم بیشتر توضیح بدین؛ برای من کار نکرد

چي براي شما كار نكرد ؟ دوست من ابتدا بايد نرم افزار اونو دانلود كني , و از Template ها براي مقاصد گوناگون استفاده كني تا كد توليد كني

بله sp هم توليد ميكنه
به طور كلي هر چيزي كه به طور متني باشه رو ميتونيد توليد كنيد .

m110_110
جمعه 29 آبان 1388, 11:35 صبح
سلام
می بخشید کمی دیر شد تازه وقت کردم در مورد عنوانی که زدم نظر خودم رو کامل بگم
ببینید این برنامه ها خیلی خوب هست اما من به قصد کار دیگری این کد را نوشتم
البته اصل کد خیلی بزرگ هست و خیلی هم کامل . اما درون شرکت نوشتم و نمی تونم اون رو اینجا وارد کنم
البته پایه ی اون کد همین هست و نکته این که در قسمت اول گفتم برای اینکه بتواند تمام کنترل ها رو ساپورت کنه می توانید یک کلاس بنویسید
و اما چه شد که به فکر چنین صفحاتی با این کد ها افتادم و کد بهینه در این مورد چی هست
قضبه این شد که ما در حال نوشتن یک سایت بزرگ هستیم و از اون جا که این سایت جداول بسیاری را شامل می باشد، کد زیادی را می طلبد
اما ما این جداول را به دو قسمت تقسیم کردیم که قسمتی شامل جداول پایه ای که اغلب جداول کوچکی هستند می باشد و قسمت دیگر شامل جداول دیگر
اگر توجه کنید جداول پایه ای که کوچک هم هستند فقط در قسمت admin و با اطلاعات خیلی ساده که نقش های کلید های خارجی در جداول دیگری را بازی می کنند می باشد مثل جدول نام بانک ، مقاطع تحصیلی و ...
خوب اگر بخواهیم برای هر یک از جداول فرم های درج ، ویرایش و لیست و حذف در نظر بگیریم چقدر باید کد نویسی کرد اون هم برای کار های بسیار ساده برنامه نویسی
یکی از راه های که با بچه ها بررسی کردیم و خوب به نظر رسید این بود که برای هر جدول یک xml داشته باشیم و سه فرم که یکی برای درج ، یکی برای ویرایش ، و یکی هم برای لیست و حذف داشته باشیم که با توجه به xml ایی که به اون پاس می دهیم خود فرم هایش را طراحی کند
برای این کار هم یک کلاس نوشتیم تا کنترل های مختلف را درست کند و مقدارش را بدست می اورد و ...
حالا در درست کردن دستور sql از روشی استفاده کردیم که پایه اش همون کد اولی هست و در آخر این قسمت می توانید کد بهینه شده را هم ببینید
حالا برای هر جدول پایه ایی که به سایت اضافه می شود کافی یک xml ازش داشته باشیم و در یک قسمت تنظیمات ان را انجام دهیم
امیدوارم تا حدودی مشکلات کد قبلی که بیشتر از نظر امنیت بود را برطرف کرده باشیم
این هم کد بهینه شده تا حالا


string Insert1 = "Insert Into TableName (", Insert2 = ") Values (";
SqlCommand cmd = newSqlCommand();
foreach (Control ct in MainControls.Controls)
{
if (ct.GetType().ToString() == "System.Web.UI.WebControls.TextBox")
{
Insert1 += ct.ID + ", ";
cmd.Parameters.Add(ct.ID, SqlDbType.VarChar).Value = ((TextBox)ct).Text;
Insert2 += "@" + ct.ID + ", ";
}
}
Insert1 = Insert1.Substring(0, Insert1.Length - 2);
Insert2 = Insert2.Substring(0, Insert2.Length - 2);
Insert1 += Insert2;
//sqlcommand InsertSql