سلام دوستان گل !!!! 
در طول دوره ی کارآموزی پروژه ایی از سوی سرپرست به من محول شد با عنوان طراحی یک فروشگاه الکترونیکی که محصولات نرم افزاری می فروشد.
طرح کلی : این سایت تعدادی عضو دارد که با وارد کردن نام کاربری و رمز عبور وارد سایت شده و محصولات نرم افزاری مورد نظر خود را انتخاب و خریداری می کنند این سایت یک مدیر دارد که می تواند محصولی را اضافه , حذف یا ویرایش کندو با انتخاب گزینه ی گزارش می تواند از لیست فروش سایت اطلاعات در یافت کند.

مراحل انجام پروژه :
در اولین مرحله باید پایگاه داده ایی برای ذخیره ی اطلاعات طراحی کنم این کار را می توان با نرم افزار های طراحی پایگاه داده مثل MS SQL Server یا Oracle و یا حتی ساده تر از همه با نرم افزار Access انجام داد . اما من MS SQL Server را انتخاب کردم . چون قابلیت مدیریت بالایی دارد.
SQL Server 2008
در ابتدا یک دیتا بیس جدید با نام Shop software E و سه جدول با نام های MEMBERS , SOFTWARE , FACTOR ایجاد کردم که به صورت زیر است.
MEMBERS:
UNAME, UPASS, UKHARID, UADD, UDEL, UUPDATE, REPORT
SOFTWARE:
SOFTWARE#, SNAME, PEYMENT, MOJOODI
FACTOR:
FACTOR#, UNMAEKH, CODESOFT
Microsoft Visual Studio 2010
یک مجموعه از برنامههایی است که ارتباط بسيار نزديک با هم دارند که مایکروسافت آن را به توسعه دهندگان و برنامه نویسان برنامههای کاربردی اهدا نمود تا آنها را وادار نماید در محیطی توسعه یافته بر روی پلت فرم های ویندوز و دات نت به ساخت برنامههای خود بپردازند . Visual Studio میتواند برای نوشتن برنامههای کنسولی ، ویندوزی ، سرویس های ویندوز ، برنامههای کاربردی موبایل ، برنامههای کاربردی ASP.NET و سرویسهای وب ASP.NET بنا به انتخاب شما همراه با زبانهایی مانند C++, C#, VB.NET, J# استفاده شود . با Visual Studio واقعا چه کارهایی میتوان انجام داد ؟ در زیر تعدادی از کاربردهایی را که برای تولید آنها میتوان از Visual Studio استفاده نمود معرفی گردیده اند : Console applications : این کاربرد برای اجرای خطوط دستور البته بدون محیط گرافیکی استفاده میشود که از این کاربرد برای برخی از ابزارهای کوچک یا برای اجرا شدن کدها توسط دیگر کاربردها استفاده میشود . Windows forms applications : برای برنامههای کاربردی ویندوزی که با استفاده از .NET frameworkنوشته میشوند . Windows services : سرویس ها برنامههای کاربردی هستند که در پس زمینه ویندوز اجرا میشوند . ASP.NET applications : ASP.NET یک تکنولوژی قدرتمند که برای طراحی و ساخت صفحات وب پویا استفاده میشود . ASP.NET web services : ASP.NET مدل سرویسهای وب را بطور کامل فراهم نموده تا شما براحتی و با سرعت سرویسهای وب را تولید نمایید . Windows Mobile applications : که میتواند بر روی ابزارهایی که شامل framework هستند مانند Pocket PC ها و همچنین cell phones هایی که پلت فرم Microsoft Smartphone بر روی آنها اجرا میشود ، اجرا گردد . MFC/ATL/Win32 applications : شما همچنان میتوانید برنامههای سنتی MFC ، ATL یا برنامههای Win32را با استفاده از C++ ایجاد نمایید . این برنامههای برای اجرا به .NET Framework نیاز ندارند اما نمیتوانند از مزایای .Net framework نیز بهرهای ببرند . Visual Studio add-ins : شما میتوانید از خود ویژوال استودیو برای ساخت توابعی جدید و قابل اضافه شدن به خود ویژوال استودیو استفاده نمایید . کاربردهای دیگر : ویژوال لستودیو همچنین شامل پروژههایی برای توسعه برنامههای کاربردی شما ، کار با databases ، ساخت گزارشها و ... میباشد .
برای برقراری ارتباط برنامه ی کاربردی با دیتا بیس از تکنیک ADO.NET استفاده می کنیم به این صورت که این تکنیک مجموعه ای از کلاس هایی است که باعث ارتباط برنامه ی کاربردی با دیتا بیس می شود . این مجموعه شامل اعضای زیر است :
Dataset: یک پایگاه داده ی مجازی است که از روی پایگاه داده ی اصلی ساخته می شود. مزیت استفاده از این پایگاه مجازی سرعت دسترسی به آن است . چون در حافظه ی RAM ساخته می شود.
Table Adapter: رابط جداول مجازی با جداول پایگاه داده ی اصلی است.
Binding source: رابط میان برنامه ی کاربردی و دیتاست است.
ابتدا کلاس MYDB را ساختم که شامل 4 متد و یک سازنده برای اتصال به دیتابیس است که در بسیاری از قسمت ها از این کلاس نمونه هایی ساخته می شود .
در ابتدا فرض کنید یک کاربر برای اولین بار وارد سایت می شود و گزینه ی (عضویت) را انتخاب می کند .

در رویداد این دکمه یک دستور INSERT ساده نوشته شده است . و چون باید سصح دسترسی برای اعضا داشته باشیم پس به غیر از گزینه ی ukharid در جدول members بقیه ی گزینه ها false می شود. این فرم به شکل زیر است.
string sql="insert into members (uname,upass,ukharid,uadd,udel,uupdate,report)";
sql+="values('{0}','{1}','{2}','{3}','{4}','{5}',{6})";
sql = string.Format(sql, txtname.Text, txtid.Text, "true", "false", "false", "false", "false");
cmd.CommandText = sql;
حالا اگر این کاربر جدید بخواهد وارد سایت بشود با وارد کردن نام کاربری و رمز عبور با انتخاب گزینه ی (ورود) با فرم زیر روبه رو می شود .

بنابراین مشاهده می شود که کاربر فقط می تواند به سبد خرید دسترسی داشته باشد . اما این اتفاق چه گونه رخ داده است ؟ این بخش شامل دو قسمت است . اول این که باید عضویت کاربر در سایت ثابت شود و دوم این که آیا کاربر admin است یا یک user معمولی . برای قسمت اول دستو رselect با یک شرط به صورت زیر را داریم :
string sql="select count(*) from members where uname='{0}' and upass='{1}' ";
بنا براین این دستور مشخص می کند که کاربر عضو سایت هست یا نه ؟
در مرحله ی دوم باید سطح دسترسی مشخص شود . برای این کار ابتدا به ازای هر option موجود در فرم یک متغییر استاتیک از نوع bool ایجاد می کنیم.
public static bool sabad=false;
public static bool add=false;
public static bool del=false;
public static bool update = false;
public static bool report = false;
باید هر نام کاربری که وارد می شود در جدول members از لحاظ سطح دسترسی بررسی شود برای این کار یک دستور select برای واکشی کل اطلاعات مربوط به آن نام کاربری نیاز داریم .این دستور یک رکورد بر می گرداند پس آن رکورد را وارد شی از Datatable می کنیم . سپس مقادیر تک تک فیلد ها را وارد متغیر های استاتیک که از قبل تعریف کرده بودیم قرار می دهیم . بدین ترتیب اگر کاربر معمولی وارد شود می دانیم که برای او فقط سبد خرید true خواهد بود . اما اگر admin وارد شود همه ی فیلدها به غیر از سبد خرید برای او true است.
string sql = "select * from members where uname='{0}'";
sql = string.Format(sql, name);
DataTable dt = new DataTable();
dt = db.Select(sql);
db.DisConnect();
sabad=Convert.ToBoolean(dt.Rows[0]["ukharid"].ToString());
add=Convert.ToBoolean(dt.Rows[0]["uadd"].ToString());
del=Convert.ToBoolean(dt.Rows[0]["udel"].ToString());
update = Convert.ToBoolean(dt.Rows[0]["uupdate"].ToString());
report = Convert.ToBoolean(dt.Rows[0]["report"].ToString());
و برای کاربر admin به شکل زیر است :

حال فرض کنید کاربر گزینه ی سبد خرید را انتخاب کند . در ادامه وارد فرم خرید محصول خواهد شد.
با انتخاب گزینه نمایش محصول تمام اطلاعات جدول software در DataGridview نمایش داده می شود . حتی کاربر می تواند نرم افزار مورد نظر خود را در جدول جستجو کند و فقط کافیه حرف ابتدای آن را در Text Box تایپ کرده و گزینه ی جستجو را انتخاب کند.

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

یک متد دیگر هم در رویداد (اضافه کردن به سبد خرید ) وجود دارد که مربوط به پر کردن جدول factor می شود. یک insert ساده به صورت زیر است .
string sql1 = "insert into factor (unmaekh,codesoft)";
sql1 += "values('{0}',{1})";
sql1 = string.Format(sql1, txtnamek.Text, code);
cmd2.CommandText = sql1;
cmd2.ExecuteNonQuery();
این متد برای گزارش گیری نهایی برای admin کاربرد دارد که اطلاعاتی در مورد کاربر X که محصول Y را خریداری کرده به او می دهد.
تا این جا وظایف کاربر تمام می شود پس به سراغ admin می رویم :
سطح دسترسی admin :
1- اضافه کردن محصول
2- حذف کردن محصول
3- ویرایش
4- گزارش
اضافه کردن محصول : از دستور insert برای ایجاد رکورد جدید در جدول software استفاده کردم به این صورت که admin مشخصات نرم افزار جدید را وارد می کند و سپس دکمه ی تایید را کلیک می کند و در همین زمان می تواند محصول جدید را درDataGridview مشاهده کند.

حذف کردن محصول :
گاهی admin نیاز دارد که محصولی را از لیست فروش حذف کند برای همین این امکان را برایش قرار دادم به این صورت که فقط کافیست روی محصول مورد نظر کلیک کرده و گزینه ی حذف را انتخاب کند.

با یک دستور ساده ی delete این امکان فراهم شده است .
if (dataGridView1.CurrentRow == null)
return;
DialogResult result;
result= MessageBox.Show("آیا مطمئن هستید ؟ ", " ", MessageBoxButtons.YesNo, MessageBoxIcon.Warning);
if (result == DialogResult.No)
return;
int row;
int col = 0;
row = dataGridView1.CurrentRow.Index;
string val = dataGridView1[col, row].Value.ToString();
string sql=("delete from software where software#="+val);
db.DoCommand(sql);
ویرایش :
اگر admin قصد داشته باشد پارامتر های محصولی را تغییر دهد می تواند با انتخاب آن از لیست محصولات و , وارد کردن اطلاعات جدید , اطلاعات قبلی را ویرایش کند. که این کار از طریق دستور update انجام شده است.
با انتخاب محصول مورد نظر و اجرای کد زیر اطلاعات محصول وارد TextBox فرم ویرایش نرم افزار می شود
int row;
int col = 0;
row = dataGridView1.CurrentRow.Index;
string val = dataGridView1[col, row].Value.ToString();
DataTable dt =new DataTable();
dt = db.Select("select * from software where software#=" + val);
db.DisConnect();
form_virayesh fv = new form_virayesh();
fv.txtcode.Text = dt.Rows[0]["software#"].ToString();
fv.txtname.Text = dt.Rows[0]["sname"].ToString();
fv.txtpe.Text = dt.Rows[0]["peyment"].ToString();
fv.txtmoj.Text = dt.Rows[0]["mojoodi"].ToString();
fv.ShowDialog();
formEdit_Load(null, null);
سپس admin می تواند اطلاعات را تغییر دهد مثلا مقدار موجودی یا قیمت محصول مورد نظر را اضافه یا کم کند. زمانی که گزینه ی تایید را انتخاب کند. با اجرای دستور update بلافاصله تغییرات در لیست محصولات مشاهده می شود.
db.Connect();
string sql = "update software set sname='{0}',peyment={1},mojoodi={2} where software#={3}";
sql = string.Format(sql, txtname.Text,txtpe.Text , txtmoj.Text, txtcode.Text);
db.DoCommand(sql);

گزارش :
هدف این قسمت در واقع کسب اطلاعاتی در مورد کالای X است که توسط کاربر Y خریداری شده . این اطلاعات فقط قابل مشاهده برای admin است. برای قسمت گزارش گیری نیاز به برنامه ی کریستال ریپورت داشتم. اما visual studio 2010 به طور پیش فرض کریستال ریپورت ندارد برای همین کریستال ریپورت 13 را از اینترنت دانلود کردم . ( مثلا visual studio 2010 برای این ساخته شده که برخی از کمبود های 2008 جبران کنه اما انگار کمبود هاش بیشتر از 2008 )
بعد از نصب کریستال ریپورت و ساخت یک گزارش باید فایل آن را برای اجرا وارد پوشه ی Debug می کردم تا در زمان اجرا برنامه فایل را بخواند. باید فرم جدیدی برای نمایش گزارش آماده می کردم و شی crystal report viewer را داخل آن قرار می دادم که متاسفانه چنین چیزی در جعبه ابزار موجود نبود ! اول فکر کردم اشکال از ساخت فایل گزارش است. پس تا متوجه ی اصل مشکل نشده بودم حدود 20 تا فایل گزارش می ساختم و delete میکردم . تا این که به فکرم رسید تا Framework را تغییر دهم چون در تجربیات گذشته با وب سرویس ها تغییر Framework باعث آشکار سازی خیلی چیز ها می شد. پس پروژه را از Framework 4 client به Framework 4 تغییر دادم و یک فایل جدید کریستال ریپورت ساختم الان در جعبه ابزار شی crystal report viewer وجود داشت . اما داستان این جا تمام نمی شد و اصل مشکل در زمان اجرا رخ می داد به این صورت که فایل کریستال ریپورت از Debug خوانده نمی شد و خطا داشت. باز همان ماجرا ی ایجاد و حذف فایل کریستال ریپورت اما این بار حدود 12 دفعه تا مرز کلافگی !
تا این که با جستجو در اینترنت به این رسیدم که فایل app.config را تغییر دهم :
بعد از این تغییر همه چیز درست شد و برنامه اجرا شد.

حالا وقت اینه که از نرم افزار یک setup بسازم که اونم خیلی راحته !!!! 

بروبچ عزیز می تونن از لینک زیر setup برنامه رو دانلود کنند. البته باید قبلش .netframework 4 رو سیستم نصب باشه ....
لینک مستقیم دانلود

لینک دانلود برنامه یانبار داری