ذخیره تنظیمات یک برنامه دسکتاپ در دات نت

در اکثر برنامه های دسکتاپ، قسمتی به عنوان تنظیمات (Settings، Options یا Preferences) در نظر گرفته می شود تا کاربران امکان تنظیم اجزای مختلف برنامه را بر اساس سلیقه یا نیاز خود داشته باشند. در دات نت فریم ورک قابلیتی به نام Settings وجود دارد که شما با استفاده از آن می توانید تنظیمات برنامه خود را در یک فایل به نام App.config در کنار برنامه خود ذخیره کنید. Settings می تواند شامل مقادیر مختلفی باشد که برنامه شما برای به یادآوردن ترجیحات کاربران و تنظیم قسمت های مختلفش به آن ها نیاز دارد. به طور مثال می توانید تغییراتی که کاربر در ظاهر برنامه می دهد (مثل اندازه پنجره و تم برنامه) یا رشته اتصال به دیتابیس را درون فایل App.config ذخیره کنید و هر بار هنگام اجرای برنامه این فایل را بخوانید و تنظیمات کاربر را اعمال کنید.

برای استفاده از قابلیت Settings، در ویژاول استادیو از Solution Explorer بر روی پروژه خود کلیلک راست کنید و گزینه Properties را برگزنید (و یا از پوشه Properties پروژه خود فایل Settings.settings را باز کنید). اگر در تب Settings نیستید، به تب Settings بروید. حالا باید چیزی شبیه به تصویر زیر را ببینید که Settings Designer نام دارد.

Settings Designerهمانطور که مشاهده می کنید هر Setting دارای 4 خصوصیت است :

  • Name : نامی است که در کدنویسی برای دستیابی به مقدار ذخیره شده در این Setting مورد استفاده قرار می گیرد.
  • Type : نوع مقداری است که قرار است در این Setting ذخیره شود. در اینجا تمام نوع های داده ای دات نت فریم ورک پشتیبانی می شوند. به طور مثال شما می توانید رنگ پس زمینه یک پنجره را با توع System.Color ذخیره کنید.
  • Scope : نحوه دستیابی به یک Setting را در زمان اجرا کنترل می کند. اگر از نوع User انتخاب شود، مقدار هم خواندنی است و هم نوشتنی اما اگر از نوع Application در نظر بگیرید،مقدار Setting فقط خواندنی است و از طریق کدنویسی و در حال اجرا غیر قابل تغییر است.
  • Value : مقداری است که هنگام دستیابی به Setting برگردانده خواهد شد. این مقدار باید از همان نوعی باشد که در Type مشخص شده است.

پس از مشخص کردن Settingهای مورد نیاز برنامه خود، می توانید از طریق کد به آن ها دسترسی داشته باشید. در سی شارپ برای دسترسی به این تنظیمات از طریق کد باید از فضای نام Properties استفاده کنید. تمام تنظیماتی که مشخص کرده اید از طریق Properties.Settings.Default در کدنویسی قابل دسترسی اند و IntelliSense آن ها را می شناسد و به شما نشان می دهد. تمام آن ها از نوع مشخصی برخوردار هستند و به اصطلاح Strongly typed هستند.

فرض می کنیم یک Setting به نام Title از نوع String ساخته اید که عنوان پنجره اصلی برنامه شما را در خود ذخیره می کند. برای خواندن آن به صورت زیر کد می نویسیم :

this.Title = Properties.Settings.Default.Title;

و برای ذخیره مقدار ورودی کاربر در این Setting به صورت زیر عمل می کنیم :

Properties.Settings.Default.Title = txtTitle.Text;

Properties.Settings.Default.Save();

بدون صدا زدن متد Save تغییرات درون فایل ذخیره نخواهد شد. فقط به این نکته توجه داشته باشید که Settingهایی که دارای محدوده Application هستند را نمی توانید به صورت کد نویسی تغییر دهید. این نوع تنظیمات فقط از طریق Setting Designer یا تغییر دستی مقدار آن ها در یک ویرایشگر متن قابل تغییر هستند.

استفاده از چند فایل تنظیمات

در بعضی موارد ممکن است برنامه شما به جای یک فایل تنظیمات نیاز به چند فایل تنظیمات داشته باشد. در این مواقع شما می توانید در ویژوال استادیو روی پروژه خود کلیک راست کنید و گزینه Add New item را انتخاب کنید و به دنبال Settings File بگردید. یک نام به جز Settings مثلاً MyNewSettings را برای آن مشخص کنید و دکمه Add را بزنید تا به پروژه شما اضافه شود. حالا به جای Properties.Settings برای دسترسی به تنظیمات فایل جدید از Properties.MyNewSettings استفاده کنید. همین!

farasun.wordpress.com

پ.ن : وبلاگ جدیدی ساختم با عنوان سافتینگ، که نقل قول های مربوط به برنامه نویسی و توسعه نرم افزار را در آن منتشر خواهم کرد. می توانید از اینجا یا اینجا مشترک فید آن شوید. بدیهی است که سرعت آپدیت آن وبلاگ به علت مینیمال بودن از این وبلاگ بسیار سریع تر خواهد بود!

Advertisements

استفاده از MySQL در دات نت فریم ورک

بانک اطلاعاتی اوپن سورس MySql را می توان یکی از محبوب ترین و پر استفاده ترین نرم افزارهای بانک اطلاعاتی مورد استفاده در وب دانست. به علت سادگی، قدرت و هزینه پایین این بانک اطلاعاتی، سر و کله اش را می توانید در تمام پکیج های هاستینگ پیدا کنید. خیلی وقت ها ممکن است در یک پکیج هاستینگ ویندوزی نتوانید از SQL Server به عنوان دیتابیس استفاده کنید، یا محدودیت هایی برای آن وجود داشته باشد، اما همیشه و به راحتی می توانید از دیتابیس های MySql استفاده کنید. استفاده از بانک اطلاعاتی MySql در کنار ASP.NET می تواند هزینه و زمان توسعه شما را کاهش بدهد و به نظر من دردسرهای شما را کمتر کند!

دات نت فریم ورک به صورت توکار از MySql پشتیبانی نمی کند و فراهم کننده پیش فرضی  برای کار با آن ارائه نمی کند. شما باید برای استفاده از MySql در دات نت از کتابخانه ای که خود MySql در اختیار برنامه نویسان قرار داده استفاده کنید. استفاده از MySql به لطف این کتابخانه دقیقاً مشابه استفاده از SQL Server یا Access است. ابتدا از اینجا کانکتور MySQL برای دات نت فریم ورک را دریافت کنید. متاسفانه اگر ایران هستید نمی توانید از وب سایت رسمی MySQL فایلی دریافت کنید! دوستان داخل ایران از این لینک برای دریافت این کتابخانه استفاده کنند.

این فراهم کننده از معماری ADO.NET پیروی می کند و به همین علت اگر قبلاً با کامپوننت های ADO.NET مثلاً برای برقراری ارتباط با یک دیتابیس SQL Server استفاده کرده باشید، در اینجا مشکلی نخواهید داشت. به عنوان یک مثال ساده قصد داریم جدول tblUsers را بر روی دیتابیسی به نام Sample بسازیم. ابتدا یک پروژه تحت وب (یا تحت ویندوز، فرقی نمی کند) بسازید و فایلی را که دانلود کردید را به ارجاع های پروژه خود اضافه کنید (با کلیک راست روی نام پروژه در Solution Explorer ، انتخاب Add Reference و انتخاب فایل MySql.dll)  سپس فضای نام MySql.Data.MySqlClient را using کنید و سپس کدهای زیر را در جای مناسب قرار دهید.

string ConnectionString = "server=localhost; userid=root;password=;pooling=yes;Database=Sample;charset=utf8";
using (MySqlConnection connection = new MySqlConnection(ConnectionString))
{
connection.Open();
using (MySqlCommand command = new MySqlCommand())
{
command.Connection = connection;
command.CommandText = "CREATE TABLE tblUsers (Uid INT AUTO_INCREMENT, Uname VARCHAR(100) NOT NULL, " +
"Pwd VARCHAR(100) NOT NULL, PRIMARY KEY(Uid)) CHARACTER SET utf8 COLLATE utf8_persian_ci;";
command.ExecuteNonQuery();
}
}

همانطور که در این مثال مشاهده می کنید در کانکشن استرینگ MySql فوق نام سرور، نام کاربری، رمز عبور و نام دیتابیس تعیین شده اند که شما باید به جای آن ها اطلاعات مربوط به خود را قرار دهید. برای اجرای یک دستور SQL بر روی سرور MySql شما نیاز به یک آبجکت MySqlConnection دارید که با تعیین یک رشته اتصال و فراخوانی متد Open به دیتابیس Sample موجود بر روی localhost وصل می شود. سپس با ایجاد یک آبجکت MySqlCommand و تعیین دستور SQL ساخت جدول tblUsers و اجرای متد ExecuteNonQuery به مقصود خود می رسید.

حالا می خواهیم روالی بنویسم تا عملیات ثبت نام کاربران در سایت را انجام دهد. این روال با گرفتن نام کاربری و رمز عبور اقدام به ایجاد رکورد کاربر در جدول tblUsers می کند.

public void InsertUser(string Username, string Password)
{
using (MySqlConnection connection = new MySqlConnection(ConnectionString))
{
connection.Open();
using (MySqlCommand command = new MySqlCommand())
{
command.Connection = connection;
command.CommandText = "INSERT INTO tblUsers (Uname, Pwd) VALUES (?Uname, ?Pwd)";
command.Parameters.AddWithValue("?Uname", Username);
command.Parameters.AddWithValue("?Pwd", Password);
command.ExecuteNonQuery();
}
}
}

همانطور که مشاهده می کنید اگر کار با کلاس های استاندارد ADO.NET مثل SqlCommand را بلد باشید در استفاده از MySQL هیچ مشکلی نخواهید داشت. تنها فرق MySQL با SQL Server در اینجا این است که برای مشخص کردن پارامترها به جای علامت @ باید از علامت ? استفاده کنید. من کد درج رکورد به یک دیتابیس MySql را نوشتم، شما کدهای Update و Delete را بنویسید!

این کتابخانه شامل کلاس های MySqlDataReader و MySqlDataAdapter نیز هست که شما می توانید از آن ها مثل دیگر کلاس های پیش فرض ADO.NET استفاده کنید و اعمال Data Binding و نمایش اطلاعات در یک GridView را به راحتی و با روش های آشنا انجام دهید. به طور مثال برای نشان دادن محتویات جدول tblUsers در یک GridView می توانید از کدی شبیه به کد زیر کمک بگیرید :

DataSet ds = new DataSet();
MySqlDataAdapter dataAdapter = new MySqlDataAdapter("SELECT * FROM tblUsers", connection);
dataAdapter.Fill(ds);
GridView1.DataSource = ds;

همانطور که مشاهده می کنید استفاده از دیتابیس های MySql به لطف معماری ADO.NET هیچ فرقی با دیگر دیتابیس های پشتیبانی شده توسط دات نت ندارد.

farasun.wordpress.com

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

پ.ن 2 : سایت ها یا وبلاگ های دیگری که به نام «فراسان» فعالیت می کنند به بنده و این وبلاگ هیچ ارتباطی ندارند! من سه سال پیش این نام را کاملاً از ذهنم بیرون کشیدم و از هیچ جایی کپی نکردم! فقط این وبلاگ و این سایت با نام «فراسان»  به من مربوط هستند.

PHP برای برنامه نویسان ASP.NET – قسمت دوم

قسمت اول را در اینجا بخوانید.

پردازش فرم ها

ASP.NET تمام سعی خود را کرده تا برنامه نویس را درگیر پردازش فرم های HTML نکند. در واقع یک برنامه نویس ASP.NET ممکن است با فرم های HTML آشنایی نداشته باشد اما در هر صفحه وبی که ایجاد می کند از آن ها استفاده کند. ASP.NET به صورت پیش فرض در هر یک از صفحات aspx یک فرم HTML قرار می دهد تا برنامه نویس بتواند با داده های ورودی کاربر کار کند. شاید در ASP.NET احتیاجی به دانستن نحوه ایجاد و کارکرد فرم های HTML نداشتید اما پردازش فرم های وب یکی از ملزومات اساسی PHP است.

فرم وب

اطلاعات فرم های HTML به دو روش Get و Post فرستاده و دریافت می شوند. در ASP.NET شاید این روش ها از دید برنامه نویس پنهان بمانند اما در PHP این برنامه نویسان هستند که باید در مورد استفاده از این روش ها در شرایط مختلف تصمیم گیری کنند. اطلاعات فرم ها در ASP.NET همیشه به خود صفحه فرستاده می شوند و به صورت پیش فرض از متد post برای این کار استفاده می کند. هنگامی که اطلاعات فرم به سرور برای پردازش فرستاده می شود و دوباره به صفحه باز می گردد، یک PostBack اتفاق می افتد. برای اینکه از متد get استفاده کنیم می توانیم یکسری پارامتر به صفحه مورد نظر خود بفرستیم و در صفحه مقصد با استفاده از Request.QueryString (که آرایه ای است از پارامترهای فرستاده شده توسط صفحه مبدا) اطلاعات فرستاده شده را بخوانیم.

اما در PHP این پروسه تفاوت زیادی دارد. شما باید خودتان در مورد متد ارسال اطلاعات تصمیم گیری کنید. در PHP اطلاعاتی که به روش get فرستاده می شوند را می توان در آرایه $_GET و اطلاعاتی که به روش post فرستاده می شوند را در آرایه $_POST پیدا کرد.

روش Post

همانطور که گفتم ASP.NET از این روش به صورت پیش فرض برای پردازش فرم ها استفاده می کند. در PHP شما می توانید با استفاده از متغیر سراسری $_POST به اطلاعات فرستاده شده توسط این روش دستیابی پیدا کنید. یک مثال کوچک می تواند مسئله را روشن تر کند :

<form action=«welcome.php» method=«post»>
Name: <input type=«text» name=«fname» />
<input type=«submit» name=«btnSubmit» />
</form>

یک فرم ساده HTML ساختیم که اطلاعات خودش (فیلد نام) را به صفحه welcome.php با روش post می فرستد. حالا فایل welcome.php را به صورت زیر می سازیم :

Welcome <?php echo $_POST[«fname»]; ?>!<br />

با این یک خط کد ساده اطلاعات فیلد fname را که در صفحه قبل قرار داشت، خواندیم. PHP در روش Post به صورت خودکار فیلدهای فرم را شناسایی می کند. اطلاعات ارسالی توسط این روش برای دیگران قابل رویت نیست و محدودیتی در حجم اطلاعات ارسالی نداریم. البته به صورت پیش فرض ماکزیمم حجم اطلاعات ارسالی در روش Post در PHP برابر با 8 مگابایت است که این مقدار را می توانید در فایل php.ini و با تغییر ثابت post_max_size در این فایل تغییر دهید.

یکی از کاربردهای مهم روش post که در ASP.NET هم استفاده می شود، اعتبار سنجی سمت سرور یا Server Side Validation است. به این صورت که اطلاعات فرم را به جای اینکه به یک صفحه دیگر بفرستید به خود صفحه می فرستید تا عمل اعتبار سنجی انجام شود. سپس اگر اطلاعات ورودی خطایی داشته باشد، در همین صفحه از کاربر می خواهید که اطلاعات را صحیح وارد کند. این روش برای اعتبارسنجی سمت سرور اطلاعاتی که می خواهند در دیتابیس ذخیره شوند بسیار مرسوم است.

روش Get

بر خلاف متد post، اطلاعاتی که با این روش فرستاده می شوند توسط همه قابل رویت هستند. کاربران این اطلاعات را در نوار آدرس مرورگر خود می بینند و برای اطلاعات ارسالی محدودیت حجمی داریم. متغیر $_GET در PHP شامل اطلاعات فرمی است که با متد get ارسال شده است. به مثال زیر توجه کنید :

<form action=«welcome.php» method=«get»>
Name: <input type=«text» name=«fname» />
<input type=«submit» />
</form>

برای نشان دادن اطلاعاتی که از این فرم به فایل welcome.php با استفاده از روش get فرستاده می شود، فایل welcome.php را به صورت زیر می سازیم :

Welcome <?php echo $_GET[«fname»]; ?>.<br />

هنگامی که کاربر روی دکمه submit فرم کلیک کند، نوار آدرس مرورگر او آدرسی شبیه به آدرس زیر را نشان خواهد داد :

http://yoursitename.com/welcome.php?name=value

این همان QueryString خودمان در ASP.NET است! در  URL بالا قسمتی که آبی است و بعد از علامت سئوال قرار گرفته را Query String می گویند. ما در ASP.NET برای دسترسی به مقدار پارامتر name در URL بالا از دستور زیر استفاده می کنیم :

Request.QueryString[«fname»]

یکی از مزایای استفاده از روش Get این است که کاربر می تواند صفحه را بوکمارک کند، چون دارای یک آدرس مشخص است. هنگامی که از متد get در PHP استفاده می کنید باید به این نکته توجه کنید که تمام فیلد ها به علاوه مقادیر آن ها در نوار آدرس مرورگر قابل مشاهده هستند، پس نباید برای ارسال اطلاعات حساس مثل رمز عبور از این روش استفاده کنید.

نکات تکمیلی

ما در ASP.NET قبل از اینکه از مقادیر موجود در QueryString استفاده کنیم، چک می کنیم که مقداردهی شده باشد، یعنی null نباشد. برای این کار از کدی شبیه به زیر بهره می بریم :

if (Request.QueryString[«fname»] != null)
//do something

معادل شرط بالا در PHP کدی شبیه به کد زیر است :

if (isset($_GET[«fname»]){
//do something
}

یعنی اگر فیلد fname مقداردهی شده بود عمل مورد نظر را روی آن انجام بده.

farasun.wordpress.com

در مطلب بعد با کوکی ها و نحوه استفاده از آن ها در PHP آشنا خواهید شد. برای اینکه مطالب بعدی را از دست ندهید مشترک فراسان شوید! چطور مشترک شوید؟

farasun.wordpress.com

این مطلب ادامه دارد…

پ.ن : از این به بعد برای تماس با من از این فرم استفاده کنید!

PHP برای برنامه نویسان ASP.NET – قسمت اول

برخی مواقع ممکن است یک برنامه نویس ASP.NET احتیاج به استفاده از PHP پیدا کند یا بخواهد ASP.NET را کنار بگذارد و به دنیای PHP کوچ کند! هرچند این اتفاق در مورد برنامه نویسان ایرانی کمتر می افتد زیرا تمام ابزارهای تکنولوژی گرانی مثل ASP.NET به صورت رایگان در اختیار آن هاست. ممکن است وب سرور مشتری شما لینوکس باشد و مونو هم روی آن نصب نباشد و شما برای اینکه مشتری خود را از دست ندهید می توانید از PHP استفاده کنید. حتی اگر هیچ گاه نیازی به PHP هم پیدا نکنید، دانستن دستورات معادل ASP.NET در PHP بهتر از ندانستن آن است. اگر شما هم یک برنامه نویس ASP.NET هستید یا حتی برنامه نویس PHP هستید، این مطلب می تواند دید خوبی در مورد تکنولوژی که با آن آشنایی ندارید به شما بدهد.

PHP for ASP.NET Developers

همانطور که می دانید ASP.NET یک زبان نیست، بلکه یک فریم ورک رایگان و مجموعه ای از مولفه های نرم افزاری است که شما می توانید به کمک آن وب اپلیکیشن هایی را با زبان هایی مثل سی شارپ و ویژوال بیسیک بنویسید. برنامه های ASP.NET ابتدا کامپایل می شوند و سپس روی سرور اجرا می شوند. PHP یک زبان اسکریپت نویسی کدباز است که دارای کتابخانه های مختلفی برای انجام دادن کارهای مورد نیاز در وب است. کدهای PHP معمولاً با کدهای HTML ترکیب می شوند و پس از تفسیر توسط مفسر PHP به مرورگر فرستاده می شود.

سینتاکس PHP

PHP از خانواده زبان های C است، قواعد نوشتن دستورات PHP کاملاً شبیه به زبان C است. به طور مثال باید در آخر هر دستور از علامت ; استفاده کنید. اگر با سی شارپ آشنا باشید برای یادگیری سینتاکس PHP مشکلی نخواهید داشت. به یک مثال کوچک و ساده از PHP توجه کنید :

<html>
<head>
<title>
PHP Test</title>
</head>
<body>

<?php echo ‹<p>Hello World</p>›; ?>
</body>
</html>

همانطور که گفتم می توان دستورات PHP را داخل یک فایل HTML نوشت. ما در ASP.NET وقتی بخواهیم در لابه لای کدهای HTML برنامه نویسی کنیم از تگ های <% %> استفاده می کنیم. در PHP هم برای اینکه بتوانیم به مفسر بفهمانیم که این دستورات را برای ما تفسیر کند، بایستی کدهای خود را در تگ های <?php و <? قرار دهیم. دستور echo در اینجا همان کار Response.Write را انجام می دهد. در حقیقت دستور معادل آن یک خط کد PHP در ASP.NET دستور زیر است :

Response.Write(«<p>Hello World</p>»);

متغییر ها در PHP

برای تعریف یک متغیر در PHP یک علامت $ در ابتدای نام متغیر می گذاریم و سپس آن را برابر مقداری که می خواهیم در آن متغیر ذخیره شود قرار می دهیم. برخلاف زبان های ASP.NET که حتماً باید نوع یک متغیر را در هنگام تعریف آن صریحاً اعلام کنید، در PHP این کار لازم نیست و خود مفسر با توجه به مقداری که درون متغیر می ریزید نوع آن را تعیین می کند. به مثال زیر توجه کنید :

<?php
$a = «iman»; // string
$b = 22; // integer
$c = TRUE; // boolean
$d = 24.895; //float
?>

فکر نمیکنم نیازی به توضیح اضافی باشد. امیدوارم این را بدانید که کلمات بعد از // به عنوان توضیحات نوشته شده اند! البته PHP دارای انواع دیگری نیز هست که ما در این مطب به آن ها نخواهیم پرداخت. فقط برای استفاده از یک متغیر باز هم باید نام آن را با $ همراه سازید. برای مثال برای چاپ مقدار متغیر a که در بالا تعریف کردیم باید به صورت زیر عمل کنیم :

echo ‹my name is $a›;

همچنین برای تعریف یک ثابت در PHP از سینتاکس زیر پیروی کنید :

define(«CONST_NAME», «farasun»);

تعریف توابع در PHP

می خواهیم متد زیر که به زبان سی شارپ است را به یک تابع PHP تبدیل کنیم :

private bool Example(int arg)
{
if (arg == 10) return true;
else return false;
}

همانطور که گفتیم در PHP هنگام تعریف متغیر نوع آن را مشخص نمی کنیم. در تعریف تابع نیز احتیاجی به تعیین نوع برگشتی تابع یا نوع آرگومان های آن نداریم. تابع متناظر با متد بالا در زبان PHP چنین چیزی می شود :

function Example($arg)
{
if ($arg == 10) { return TRUE; }
else { return false; }
}

مشاهده می کنید که در اینجا دیگر خبری از کلمات کلیدی private یا bool نیست! در ASP.NET هر صفحه خودش یک کلاس است اما در PHP چون به صورت پیش فرض کلاسی وجود ندارد پس خبری از private یا public بودن تابع نیست. برای صدا زدن تابع نیز کافیست نام آن را همراه با پارامترهای آن صدا بزنیم. همانند سی شارپ یا ویژوال بیسیک خودمان!

جایگزینی برای Response.Redirect

ما در ASP.NET برای فرستادن کاربر به یک صفحه وب دیگر از Response.Redirect استفاده می کنیم که در حقیفت یک درخواست به مرورگر کاربر برای تغییر صفحه وب می فرستد. در PHP تابعی به نام header وجود دار که کی تواند یک هدر HTTP را به مرورگر کاربر بفرستد. با کد PHP زیر می توانیم کاربر را به سایت گوگل بفرستیم :

header(«location: http://www.google.com&raquo;);

جایگزینی برای Request.Url

برای بدست آوردن آدرس URL صفحه وب جاری در ASP.NET از Request.Url استفاده می کنیم. در PHP می توانیم این آدرس را با روش زیر بسازیم :

$host = $_SERVER[‹SERVER_NAME›];
$uri = $_SERVER[‹PHP_SELF›];
echo «$host$uri»;

متغیر host آدرس سایت (به طور مثال http://emaple.com) و متغیر uri آدرس فایل (به طور مثال directory/test.php) را ذخیره می کند. سپس در خط سوم این دو به هم می چسبند و آدرس کامل صفحه را چاپ می کنند.

نکات تکمیلی

در این مطلب کوتاه نمی توان تمام جایگزین ها را معرفی کرد. اکثر جایگزین های پراپرتی ها و متدهای شیء Request را می توانید در متغیر رزور شده $_SERVER پیدا کنید. مستندات کامل این متغیر را در اینجا بخوانید. به علت شباهت زیاد PHP با زبان های خانواده C در اینجا از آموزش ساختارهای کنترلی این زبان مانند if و switch و حلقه های for و while اجتناب کردیم. اگر سی شارپ بلد باشید مطمئن باشید این دستورات PHP را نیز بلد خواهید بود.

در مطالب بعدی به مباحث مورد نیاز دیگر مانند پردازش فرم های وب، کوکی ها و مدیریت Sessionها و دسترسی به داده های یک دیتابیس در PHP خواهیم پرداخت. برای اینکه این مطالب را از دست ندهید، می توانید مشترک فراسان شوید! چطور مشترک شوید؟

farasun.wordpress.com

این مطلب ادامه دارد…

پیاده سازی «من را بخاطر بسپار» در ASP.NET

اکثر وب سایت ها هنگام ورود کاربران یا همان Login کردن، برای راحتی کاربر قابلیتی دارند به نام «Remember me» یا «من را بخاطر بسپار» که با تیک زدن آن کاربر از آن به بعد می تواند بدون اینکه نام کاربری یا رمز عبور خود را وارد کند، از امکانات سایت استفاده کند. نمونه این قابلیت را حتماً هنگام وارد شدن در جی میل دیده اید. در این مطلب کوتاه آموزشی می خواهیم چنین قابلیتی برای یک وب سایت مبتنی بر ASP.NET پیاده سازی کنیم.
ابتدا باید بدانید که این قابلیت توسط کوکی ها پیاده سازی می شوند. Cookie یک فایل فایل متنی کوچک است که توسط مرورگر به درخواست یک صفحه وب ساخته می شود و برای استفاده های بعدی خوانده می شود. از آنجا که اطلاعات یک کوکی در هارد دیسک کاربر ذخیره می شوند، شما نباید اطلاعات حساس مانند رمزعبور کاربر را در آن نگهداری کنید. ASP.NET برای استفاده از کوکی ها کلاس هایی در نظر گرفته است. شما باید برای استفاده از کوکی ها ابتدا فضای نام System.Net را using کنید. در این مثال فرض می کنیم که شما با مباحث پایه ای ASP.NET آشنایی دارید.
صفحه لاگین خود را باز کنید و یک کنترل CheckBox به آن اضافه کنید و نام آن را به chkRemember تغییر دهید. در روال لاگین خود یعنی وقتی که کاربر درخواست ورود به سایت را می فرستد (مثلاً روی دکمه Login کلیک می کند) کدهای زیر را قرار دهید.

if (chkRemember.Checked)
{
HttpCookie cookie = new HttpCookie(«YourAppLogin»);
cookie.Values.Add(«username», txtUsername.Text);
cookie.Expires = DateTime.Now.AddDays(15);
Response.Cookies.Add(cookie);
}

کد بالا ابتدا چک می کند که آیا چک باکس توسط کاربر تیک خورده است یا خیر. اگر تیک خورده یعنی اینکه کاربر می خواهد وب سایت شما او را بخاطر بسپارد. سپس cookie را از کلاس HttpCookie نمونه سازی می کنیم و نام آن را YourAppLogin می گذاریم که در اینجا شما باید نام اپلیکیشن خود را به جای آن بگذارید (یا هر نام دلخواه دیگری) سپس Username کاربر را در این کوکی ذخیره می کنیم. txtUsername را به نام کامپوننتی که Username را از کاربر می گیرد تغییر دهید. در اینجا شما می توانید مقادیر دیگری را به همین شکل به کوکی اضافه کنید، به طور مثال ID کاربر را نیز برای هدف خاصی ذخیره کنید. در خط بعدی با Expires به مرورگر می گوئیم که پس از 15 روز این کوکی را به صورت خودکار حذف کند. این زمان را می توانید با تغییر عدد 15 عوض کنید. در خط آخر نیز باید این کوکی را به مجموعه کوکی های مرورگر اضافه کنیم.

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

if (Request.Cookies[«YourApLogin»] != null)
{
string username = Request.Cookies[«YourAppLogin»].Values[«username»]);
}

استفاده از کدهای بالا در صورتی است که شما Login را به صورت دستی کدنویسی کرده باشید. کسانی که از روش Forms Authentication و قابلیت Membership در ASP.NET استفاده می کنند به راحتی با یک خط کد زیر می توانند از این  قابلیت استفاده کنند :

FormsAuthentication.SetAuthCookie(txtUsername.Text, chkRemember.Checked);

farasun.wordpress.com

پ.ن : این مطلب هم تقدیم می شود به همکلاسی های عزیز!

آپلود تصاویر در ASP.NET (در فایل فیزیکی و در دیتابیس)

در این مطلب کوتاه آموزشی با نحوه آپلود تصاویر در یک وب سایت مبتنی بر ASP.NET آشنا خواهید شد. در اینجا ما یک برنامه کوچک به زبان سی شارپ می نویسیم که کاربر را قادر می سازد که یک فایل تصویری با پسوند JPG را انتخاب و آپلود کند. در این آموزش فرض بر این است که شما با سی شارپ و مباحث پایه ای دات نت آشنا هستید.
برای این کار ابتدا یک کنترل FileUpload را از Toolbox (موجود در قسمت Standard) به صفحه خود اضافه کنید. یا اینکه کد زیر را در محلی که می خواهید کنترل آپلود فایل نمایش داده شود، قرار دهید.

<asp:FileUpload ID="PicUpload" runat="server" />

قبل از هر چیز فضای نام System.IO را using کنید. حالا کدهای زیر را در روالی که می خواهید عمل آپلود فایل در آن انجام شود قرار دهید. به طور مثال اگر می خواهید وقتی روی دکمه Upload کلیک شد، تصویر کاربر بر روی سرور آپلود شود، این کدها را درون روال Upload_Click قرار دهید.

if (PicUpload.PostedFile != null)
{
HttpPostedFile Pic = PicUpload.PostedFile;
if (Pic.ContentLength == 0)
{
Response.Write("فایل شما هیچ محتوایی ندارد!");
return;

}
if (Path.GetExtension(Pic.FileName).ToLower() != «.jpg»)
{
Response.Write(«پسوند این فایل نامعتبر است.»);
return;
}
byte[] data = new Byte[Pic.ContentLength];
Pic.InputStream.Read(data, 0, Pic.ContentLength);
string SavePath = @»images/»;
FileStream newPic = new FileStream(Server.MapPath(SavePath + Pic.FileName), FileMode.Create);
newPic.Write(data, 0, Pic.ContentLength);
newPic.Close();
}

این کد چطور کار می کند؟

در خط اول ابتدا چک می کنیم که آیا کاربر فایلی را برای آپلود انتخاب کرده است یا خیر. یعنی خاصیت PostedFile اگر برابر null بود به این معنی است که کاربر هیچ فایلی را برای آپلود انتخاب نکرده است پس کدهای زیر آن نباید اجرا شوند. سپس متغیری به نام Pic از نوع HttpPostedFile می سازیم تا بتوانیم اطلاعاتی در مورد فایل انتخابی کاربر بدست آوریم. بعد از آن با یک شرط چک می کنیم که حجم فایل انتخابی کاربر برابر با صفر نباشد. در if بعدی هم چک می کنیم که اگر پسوند فایل برابر jpg نبود یک پیغام خطای مناسب به کاربر نشان بده. بدیهی است که در اینجا می توانید پسوندهای دیگری مثل pdf را چک کنید.

دو خط زیر هم اطلاعات فایل انتخابی توسط کاربر را می خوانند :

byte[] data = new Byte[Pic.ContentLength];
Pic.InputStream.Read(data, 0, Pic.ContentLength);

و خط های زیر نیز عمل ساختن فایل جدید از روی فایل کاربر بر روی سرور (عمل آپلود) را انجام می دهند :

FileStream newPic = new FileStream(Server.MapPath(SavePath + Pic.FileName), FileMode.Create);
newPic.Write(data, 0, Pic.ContentLength);

آپلود تصاویر در یک دیتابیس SQL Server

اگر بخواهید به جای آپلود فایل کاربر روی یک فایل فیزیکی موجود در سرور آن را در یک دیتابیس SQL Server آپلود کنید، می توانید از قطعه کد زیر به جای دو خط بالا استفاده کنید. ابتدا فضاهای نام System.Data و System.Data.SqlClient را using کنید و سپس کد زیر را در جای مناسب قرار دهید.

object objImage = data;
SqlConnection connection = new SqlConnection(connectionString);
string sql_insert = "INSERT INTO tblImage (picture) values (@img)";
SqlCommand command = new SqlCommand(sql_insert, connection);
SqlParameter parameter = new SqlParameter("@img", SqlDbType.Image);
parameter.Value = objImage;
command.Parameters.Add(parameter);
connection.Open();
command.ExecuteNonQuery();
connection.Close();

در کد بالا رشته اتصال دیتابیس خود را به جای connectionString قرار دهید و نام جدول و فیلدهای خود را در متغیر sql_insert بنویسید.

farasun.wordpress.com

پ.ن : این مطلب تقدیم می شود به همکلاسی های عزیز!

if (Path.GetExtension(Pic.FileName).ToLower() != «.jpg»)
{
Response.Write(«پسوند این فایل نامعتبر است.»);
return;
}

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

در اکثر برنامه های کامپیوتری نیاز به ذخیره و بازیابی داده ها وجود دارد. داده هایی که بدون آن ها سیستم نرم افزاری ما معنایی ندارد. برنامه نویسان معمولاً راه های مختلفی برای این کار سراغ دارند. کسانی که با دات نت فریم ورک برنامه نویسی می کنند راه های مختلفی برای دسترسی به داده ها دارند. در این مطلب با تکنولوژی های مایکروسافت برای این کار آشنا خواهیم شد و سه ORM معروف دنیای دات نت را معرفی خواهیم کرد. مایکروسافت انتخاب های زیادی برای دسترسی به داده ها به برنامه نویسان دات نت می دهد که شما باید با بررسی آن ها و با توجه به نیازهای خودتان یکی از آن ها را انتخاب کنید.

ADO.NET

ADO.NET مجموعه ای از کامپوننت هاست که برنامه نویسان می توانند از آن ها برای برقراری ارتباط با دیتابیس های مختلف استفاده کنند. ADO.NET بخشی از کتابخانه کلاس های پایه دات نت فریم ورک است که توسط مایکروسافت توسعه داده می شود. برنامه نویسان به صورت گسترده از این تکنولوژی برای دسترسی و دستکاری داده های ذخیره شده در یک دیتابیس رابطه ای استفاده می کنند. ADO.NET می تواند با اکثر دیتابیس های موجود کار کند، هر چند به صورت پیش فرض در دات نت فریم ورک فقط فراهم کننده های SQL Server، OleDb و Odbc وجود دارد، افراد و شرکت های دیگر فراهم کننده های دیتابیس های دیگر را برای دات نت ایجاد کرده اند.

برای هر Provider کامپوننت هایی وجود دارند که برنامه نویس با استفاده از آن ها به مقصودش می رسد. به طور مثال برای استفاده از SQL Server در روش ADO.NET کامپوننت هایی مانند SQLConnection و SQLCommand وجود دارد که با استفاده از آن ها می توانید یک دستور SQL را روی داده های موجود در یک دیتابیس SQL Server اجرا کنید. با SQLConnection به دیتابیس موجود در SQL Server وصل می شویم و با استفاده از یک SQLCommand می توانیم یک عبارت T-SQL را که می تواند دستور INSERT, UPDATE, DELETE یا SELECT باشد یا حتی یک Stored Procedure یا عبارت DDL باشد را برای مقصود خاصی روی دیتابیس اجرا کنیم. چون ADO.NET در مورد سینتاکس دیتابیس چیزی نمی داند، دستورات را به صورت یک رشته ساده به SQLCommand می دهیم و این شیء نیز به صورت مستقیم به دیتابیس دستور می دهد.

string query = "SELECT * FROM tblCustomers";
SqlConnection con = new SqlConnection(cnnString);
SqlCommand command = new SqlCommand(query, con);
con.Open();
SqlDataReader reader = command.ExecuteReader();
while (reader.Read())
{
Response.Write(reader.GetInt32(0) +
reader.GetString(1));
}

نکته ای که باید در مورد ADO.NET بدانید این است که برای استفاده از هر سیستم دیتابیس رابطه ای، مجموعه کامپوننت های جدایی وجود دارد. در مثال بالا از آبجکت های مربوط به SQL Server استفاده کردیم. اگر بخواهید مثلاً از یک دیتابیس اوراکل در برنامه خود استفاده کنید، بایستی از کامپوننت های مربوط به اوراکل استفاده کنید. خوشبختانه تمام این کامپوننت ها بر پایه یک Interface ساخته شده اند، این یعنی شما می توانید با استفاده از کلاس DbProviderFactory برنامه ای بسیازید که با چند نوع دیتابیس مختلف کار کند.

Linq to SQL

مایکروسافت با دات نت فریم ورک 3.0 و 3.5 یک ORM به نام Linq to SQL را به عنوان بخشی از پروژه LINQ خود عرضه کرد. این شرکت مدت ها پیش از آن قول داده بود که یک ORM برای دات نت فریم ورک طراحی کند اما تا نسخه 3.0 دات نت فریم ورک خبری از آن پروژه نشد. Linq to SQL به شما اجازه می دهد که کوئری های LINQ را روی دیتابیس های SQL Server اجرا کنید. علاوه بر این از یک Mapping Framework بهره می برد که به برنامه نویسان اجازه Map کردن جدول های یک دیتابیس را به کلاس ها و بالعکس می دهد. این کار در ویژوال استادیو می تواند به صورت ویژوال یا کدنویسی انجام گیرد. به این صورت که برای هر جدول از دیتابیس یک کلاس تعریف می شود که هر ستون از یک جدول به عنوان یک Property درون آن کلاس تعریف می شود.

نمایی از ابزار طراحی ویژوال Linq to SQL

به مثال زیر توجه کنید :
public class Customer
{
[Column(Name="CustomerID",IsPrimaryKey = true)]
public long ID
{
get { return _ID;}
set { _ID = value;}
}
[Column(Name = "CustomerName")]
public string Name
{
get { return _name; }
set { _name = value; }
}
}

کلاس بالا به جدول tblCustomers که دارای دو ستون CustomerID و CustomerName است Map می شود. قبل از اینکه بخواهید از Linq to SQL استفاده کنید باید این کلاس ها را تعریف کنید. ویژوال استادیو 2008 دارای ابزاری است که به صورت ویژوال به شما امکان Map کردن جدول های یک دیتابیس SQL Server را به کلاس های دات نت می دهد. این ابزار می تواند به صورت اتوماتیک کلاس های مورد نیاز شما را از روی مدل دیتابیس بسازد، و حتی اجازه تغییرات دستی و ایجاد Viewهای مختلف از دیتابیس را به شما می دهد. عملیات Mapping با استفاده از DataContext (که یک رشته اتصال به سرور نیاز دارد) پیاده سازی می شود. سپس شما قادر خواهید بود کوئری های LINQ خود را روی دیتابیس موجود در سرور اجرا کنید، که البته این کوئری ها ابتدا به دستوارت T-SQL متناظر ترجمه و سپس روی دیتابیس مورد نظر اجرا می شوند.

Entity Framework

Entity Framework یک فریم ورک ORM برای دات نت فریم ورک است که نسخه یک آن به همراه دات نت فریم ورک 3.5 سرویس پک 1 عرضه شد اما مورد استقبال توسعه دهندگان قرار نگرفت. نسخه 2 این فریم ورک به صورت بتا به عنوان بخشی از ویژوال استادیو 2010 قابل دسترس است. ADO.NET Entity Framework نام اصلی این فریم ورک است و جزئی از تکنولوژی ADO.NET است.

ابزار طراحی Entity Framework در ویژوال استادیو

ابزار طراحی Entity Framework در ویژوال استادیو

Entity Framework مدل رابطه ای موجود در یک دیتابیس را به مدل مفهمومی تبدیل می کند و آن را به اپلیکیشن ما تحویل می دهد. در مدل رابطه ای عناصر ترکیبی از جداول هستند، به همراه کلید های اصلی و خارجی که جدول ها را به هم مرتبط می سازند. برعکس آن، انواع موجودیت ها مدل مفهومی داده را تعریف می کنند. انواع موجودیت  اجتماعی از چند فیلد است (هر فیلد به یک ستون از دیتابیس Map می شود) و می تواند شامل اطلاعات از چند جدول فیزیکی باشد. انواع موجودیت می توانند به هم مرتبط باشند، مستقل از ارتباطاتی که در مدل فیزیکی دارند. شمای منطقی و نگاشت (mapping) آن به شمای فیزیکی به عنوان یک Entity Data Model یا EDM نمایش داده می شوند که مشخصات EDM در یک فایل XML ذخیره می شود. Entity Framework از EDM برای انجام عملیات نگاشت و دادن قابلیت کار با موجودیت ها به اپلیکیشن استفاده می کند. Entity Framework اطلاعات مورد نیاز هر موجودیت را با Join کردن چندین جدول از مدل فیزیکی (دیتابیس) بدست می آورد. هنگامی که اطلاعات یک موجودیت آپدیت می شود، Entity Framework بررسی می کند که داده ها مربوط به کدام یک از جدول های موجود در دیتابیس هستند، سپس آن ها را با دستور SQL مناسب آپدیت می کند.

هر چند Entity Framework و Linq to SQL بسیار شبیه به هم به نظر می رسند، هر دو ابزارهایی برای طراحی گرافیکی و ویزاردی برای نگاشت یک دیتابیس به مدل شیء گرا دارند و هر دو می توانند از کوئری های LINQ برای مقصود خاصی استفاده کنند، اما با هم تفاوت هایی هم دارند. بیان تفاوت های این دو در این مطلب جایی ندارد.

NHibernate

نمی توان در مورد ORMها در دات نت صحبت کرد اما نام NHiernate را ذکر نکرد. NH یک فریم ورک ORM اوپن سورس برای دات نت فریم ورک است که از روی پروژه موفق Hibernate جاوا وارد دنیای دات نت شد. توضیحات بیشتر در مورد NHibernate توضیحات اضافی است، زیرا این فریم ورک هم وظیفه ORMهای دیگر را انجام می دهد. اکثر برنامه نویسانی که از NH برای نگاشت استفاده می کنند، ابتدا کلاس های خود را تعریف می کنند و سپس با استفاده از یک فایل XML آن ها را به جدول های دیتابیس Map می کنند. Linq to SQL و Entity Framework برخلاف NHibernate از روش Model-first یا مبتنی در دیتابیس استفاده می کنند، به این معنی که هر دو ORM تصور می کنند شما دیتابیسی در اختیار دارید که می خواهید آن به تعدادی آبجکت Map کنید.

در مورد Nhibernate بیش از این صحبت نمی کنم، آقای وحید نصیری در اینجا به صورت کامل در مورد این ORM محبوب نوشته است.

farasun.wordpress.com

انتخاب از میان روش های بالا به عهده خود شماست. در این مطلب کوتاه نمی توان به بررسی تمام زوایا و تفاوت های میان آن ها پرداخت. در مطالب آینده سعی میکنم در مورد نحوه استفاده از هر کدام یک مثال عملی بزنم (البته به جز NHibernate).