# برنامه نویسی با محصولات مایکروسافت > برنامه نویسی مبتنی بر Microsoft .Net Framework > C#‎‎ >  بررسی سوالات و نظرات "پروژه سی شارپ از ابتدا تا انتها"

## veniz2008

سلام دوستان.
طبق قولی که در رابطه با قرار دادن آموزش های مربوط به "ساخت یک پروژه سی شارپ از ابتدا تا انتها" داده بودم این ویدئوها رو میتونید از آدرس زیر دانلود کنید.
https://barnamenevis.org/showthread.p...AA%D9%87%D8%A7
اما تصمیم گرفتم برای اینکه نظم اون تاپیک بهم نخوره، این تاپیک رو برای رسیدگی به مشکلات شما در ارتباط با این آموزش ها ایجاد کنم. برای بازدهی بیشتر این تاپیک، لطفا به موارد زیر توجه بفرمایید:
1. فقط در محدوده آموزش هایی که قرار داده میشه سوالات یا اشکالات خودتون رو مطرح بفرمایید و از پرسیدن سوالات بی ارتباط با بحث آموزش ها جدا" پرهیز کنید.
2. از گذاشتن پست هایی برای تشکر جدا" خودداری کنید. اجازه بدیم پست هایی اینجا گذاشته بشه که محتوای فنی داشته باشه.
3. لطفا از گذاشتن پست تکراری و فاقد محتوا پرهیز کنید و قبل از گذاشتن یک پست، ابتدا بقیه پست ها رو مشاهده کنید. شاید جواب سوالتون در اون پست قرار داشته باشه.
توصیه میکنم با دیدن هر ویدئو، بعد از پرسیدن سوالات و ابهامات خودتون بصورت عملی شروع به طراحی یک پروژه کنید و قدم به قدم با اموزش ها جلو بیاید(شبیه به مواردی که در آموزش ها می بینید). شک نکنید که تا شروع به نوشتن نکنید چیزی رو یاد نمیگیرید. خیلی ها هستن که اگه ازشون بپرسید میگن که ما کدها و دستورات رو بلدیم ولی نمیتونیم پروژه بنویسیم. دلیلش اینه که هیچوقت استارت کار رو بصورت عملی نزدن. تا عملی کار نکنید هرگز موفقیتی حاصل نمیشه.
یادمون نره که شرط موفقیت، فکر کردن، ایده داشتن و تلاش کردن هست.
توجه : در طول ضبط هر ویدئو اگر موردی فراموش شده که ذکر بشه، در ابتدای ویدئوی بعدی این موارد ذکر شده.
پیشاپیش از همکاری همه شما دوستان، قدردانی میکنم.

----------


## esafb52

با سلام وخسته نباشید 
چون فرمودید مخاطبان این آموزش افراد سطح  متوسط هم هستند پیشنهادم این هست  که به صورت سه لایه پیاده سازی بشه من قسمت اول رو دیدم خوب بود
موفق باشید

----------


## veniz2008

> با سلام وخسته نباشید 
> چون فرمودید مخاطبان این آموزش افراد سطح  متوسط هم هستند پیشنهادم این هست  که به صورت سه لایه پیاده سازی بشه من قسمت اول رو دیدم خوب بود
> موفق باشید


 سلام دوست عزیزم.
ممنونم از اینکه اولین نظر رو شما دادید.
این ویدئوها بصورت کامل آماده شدن ولی در ارتباط با پیشنهادتون :
هدف اصلی این آموزش ها مخاطبان مبتدی هست و تلاش میشه که این مخاطبان تا حد متوسطی از لحاظ کدنویسی بالا کشیده بشن.
باور بفرمایید اگر برای یک مبتدی که هنوز با مفاهیم آشنا نیست من برم سراغ چند لایه نوشتن، چیزی رو یاد نخواهد گرفت. چند لایه آموزش دادن برای کسانی مفید خواهد بود که با مباحث اولیه آشنایی دارند.



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


 سلام دوست من.
ممنونم که نظر دادید.
نظر من متفاوت با نظر شما هست.
عقیده و باور من این هست که هر کس با توجه به امکاناتی که در اختیار داره باید به دیگران کمک کنه.
اگر این ویدئوها بتونه حتی به یک نفر چیزی رو یاد بده، اون لحظه، لحظه ای هست که من به هدفم رسیدم.
این ویدئوها فقط یک نقطه شروع خواهد بود برای کسانیکه واقعا قصد یادگیری دارند ولی امکاناتش رو ندارند. بقیش به تلاش و پشتکار خودشون مربوط میشه.
همین چند روز پیش توی بخش "گفتگو با مسولین سایت" یه نفر تاپیک گذاشته بود و میگفت که دوس داره یاد بگیره ولی پول نداره. از این جور آدم ها زیاد هست دوست من.
اگر قراره نون شب من با این 16 ویدئو قطع یا کم بشه، همون بهتر که بشه. این آموزش ها حتی 1 درصد از زبان سی شارپ هم نیستن.
یاد دادن و یاد گرفتن دو فرآیند هم روند و موازی هستن. من همزمان که دارم به دیگران یاد میدم در کنارش دارم از دیگران یاد می گیرم.
من همیشه گفتم : در کنار پشتکار خودم، برنامه نویس به من کمک کرده تا بزرگ بشم. اخلاق حکم میکنه که امروز من به دیگران کمک کنم. انصاف نیست که الان یه خورده یاد گرفتم نسبت به دیگران بی تفاوت باشم.
به هر حال، هرکس به یک شکل کمک میکنه ولی ثابت شده که آموزش های مالتی مدیا تاثیرگذاری خیلی بیشتری دارند.
بازم از اینکه نظرتون رو دادید تشکر میکنم.

----------


## esafb52

> هدف اصلی این آموزش ها مخاطبان مبتدی هست و تلاش میشه که این مخاطبان تا حد متوسطی از لحاظ کدنویسی بالا کشیده بشن.
> باور بفرمایید اگر برای یک مبتدی که هنوز با مفاهیم آشنا نیست من برم سراغ  چند لایه نوشتن، چیزی رو یاد نخواهد گرفت. چند لایه آموزش دادن برای کسانی  مفید خواهد بود که با مباحث اولیه آشنایی دارند.


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

----------


## amir200h

در مورد حذف کردن گروه های درسی که فرمودین نیاز به حذف نیست. من با این حرفتون مخالفم.
توی یک برنامه برای هر جدولی که ساخته میشه باید چهار عمل اصلی رو در برنامه براش ایجاد کنیم. البته نظر شخصیمه و تو صد در صد پروژه هام برای کاربر این امکانو فراهم میکنم.
البته نوع حذف کردن قضیه ش فرق میکنه چون ممکنه با یک حذف کردن حتی یک رکورد کل برنامه از کار بیوفته(در بعضی موارد) مخصوصا در زمان گزارش گیری و جستجو به مشکل بر بخوریم.
من خودم معتقدم که هیچ رکوردی نباید از بانکمون حذف بشه چون به نظرم ذات پایگاه داده که همون ذخیره داده هاست زیر سوال میره.(نظر شخصیمه و میدونم هم که در بعضی موارد صحیح نیست)
من خودم همیشه برای جداولم یک فیلد به نام State تعریف میکنم از نوع bit. و با true یا false کردن این مقدار در واقع همون عمل حذف رو انجام میدم.
موفق باشید ...

----------


## amir200h

> گفتن به علت کم بود وقت و اینکه دل بخواه هستش البته موافقم باید برای admin در نظر گرفت بشه 
> حالا چرا بیت ؟با همون id  همیشه انجام میشه شما دلیلی دارین؟


راحتی کار. اگه مقدارش true بود یعنی فعال و اگه false بود یعنی غیرفعال یا همون حذف شده

----------


## asrah6

سلام و تشکر فراوان از آموزشهای جنابعالی انشاالله به امید روزی که هیچ کس در امر آموزش به دیگران خسیس نباشد
چند پیشنهاد :
اگر امکان دارد جدولی اضافه کنید که جوابهای کاربران( آزمون دهنده ها ) را ذخیره تا در گزارش گیری های بعدی و مقایسه نمرات آنها استفاده شود و همچنین فیلدی به جدول گروه های امتحانی اضافه کنید تا مدیر بتواند از بین چندین گروه امتحانی یکی را برای امتحان دادن کاربران فعال کند و همه گروههای امتحانی نمایش داده نشود 
در پایان باز هم تشکر و اگر امکان دارد ویدئوهای بعدی را سریعتر آماده و آپلود نمایید. :تشویق:

----------


## veniz2008

> در مورد حذف کردن گروه های درسی که فرمودین نیاز به حذف نیست. من با این حرفتون مخالفم.
> توی یک برنامه برای هر جدولی که ساخته میشه باید چهار عمل اصلی رو در برنامه براش ایجاد کنیم. البته نظر شخصیمه و تو صد در صد پروژه هام برای کاربر این امکانو فراهم میکنم.
> البته نوع حذف کردن قضیه ش فرق میکنه چون ممکنه با یک حذف کردن حتی یک رکورد کل برنامه از کار بیوفته(در بعضی موارد) مخصوصا در زمان گزارش گیری و جستجو به مشکل بر بخوریم.
> من خودم معتقدم که هیچ رکوردی نباید از بانکمون حذف بشه چون به نظرم ذات پایگاه داده که همون ذخیره داده هاست زیر سوال میره.(نظر شخصیمه و میدونم هم که در بعضی موارد صحیح نیست)
> من خودم همیشه برای جداولم یک فیلد به نام State تعریف میکنم از نوع bit. و با true یا false کردن این مقدار در واقع همون عمل حذف رو انجام میدم.
> موفق باشید ...


 ممنونم از اینکه نظرتون رو دادید.
همونطور که در ویدئو هم عرض کردم میشد گذاشت و بهتر هم هست که در یک پروژه واقعی این امکان هم اضافه بشه ولی باید مواظب مدیریت کردن حذف در جداول مبدا باشیم. مثلا در هیمن مثال ما، باید این رو مد نظر داشته باشیم که اگر از جدول گروه، رکوردی حذف بشه بایستی در جدول سوالات هم، رکوردها(سوالاتی) که وابسته به این گروه هستن رو هم حذف کنیم. در کل با این نظرتون موافقم که میشد این مورد رو هم اضافه کرد ولی بخاطر اینکه در فرم سوالات این مورد بصورت کامل پیاده سازی میشه و ویدئوهای اولیه هم وقت گیر نشه از گذاشتن این امکان خودداری کردم.
اما در مورد اینکه گفتید اعتقاد دارید هیچ رکوردی رو حذف نکنیم، به نظرم صحیح نیست. ما با توجه به شرایط پروژه و نوع جداولمون این حذف رو قرار میدیم. مثلا در سیستم بایگانی ما معمولا هیچوقت سندی رو حذف نمی کنیم چون بایگانی اسمش به خودش هست ولی میتونیم از همین فیلد bit ای که شما گفتید استفاده کنیم و رکوردهای خیلی قدیمی رو (بر حسب یک شرط مثلا سال) غیر فعال کنیم. ولی در جاهایی که نیازی به این ذخیره سازی نیست بهتره که رکوردها رو حذف کنیم تا بیهوده فضای اضافی اشغال نکنه و بر روی performance دیتابیس تاثیر منفی نذاره.



> سلام و تشکر فراوان از آموزشهای جنابعالی انشاالله به امید روزی که هیچ کس در امر آموزش به دیگران خسیس نباشد
> چند پیشنهاد :
> اگر امکان دارد جدولی اضافه کنید که جوابهای کاربران( آزمون دهنده ها ) را ذخیره تا در گزارش گیری های بعدی و مقایسه نمرات آنها استفاده شود و همچنین فیلدی به جدول گروه های امتحانی اضافه کنید تا مدیر بتواند از بین چندین گروه امتحانی یکی را برای امتحان دادن کاربران فعال کند و همه گروههای امتحانی نمایش داده نشود 
> در پایان باز هم تشکر و اگر امکان دارد ویدئوهای بعدی را سریعتر آماده و آپلود نمایید.


 سلام دوست من.
همونطور که در پست 4 هم عرض کردم این ویدئوها بصورت کامل آماده شدن و متاسفانه امکان تغییری وجود نداره.
قطعا در یک پروژه واقعی باید چنین موردی رو قرار داد ولی این پروژه قرار نیست کاملا واقعی باشه. ساخت یک پروژه واقعی بصورت مالتی مدیا باور کنید ساعت ها بیشتر از اون چیزی که تا به امروز وقت گذاشتم، وقت میبره. همین 16 ویدئو فکر کنم حدود 20 ساعت زمان برده که اگر قرار بر کامل بودن اون داشتم حداقل به 20 ساعت دیگه هم زمان نیاز بود که فکر میکنم خارج از حوصله مخاطب باشه.
ولی در کل عجله نکنید. خواهید دید که ویدئو به ویدئو مطالب سطحشون بالاتر خواهد رفت و مطالب گسترده تر و حرفه ای تری رو یاد خواهید گرفت. سعی شده که آروم آروم ذهن شما به مطالب عادت کنه.
در مورد قرار دادن ویدئوها سعی میکنم این کار رو سریعتر انجام بدم ولی اینترنت کشورمون رو که بهتر از من می شناسید. سرعت اینرنت بعضی مواقع اونقدر پایین میاد که حتی نمیشه یک فایل 5 مگی رو اپلود کرد.

----------


## veniz2008

> با سلام 
> اگر در حین کد نوشتن کدها رو بیشتر با متد مینویشتین شاید بهتر بود خصوصا کدهایی مثل لود اطلاعات
> مثلا زمانی که شما مخواین تغییرات اعمال شده رو نشون بدین به کسی که جدیدا امده سراغ این مباحث فراخوانی فرم لود (با دوتا نال )تو ذهنش درکش شاید مشکل تر باشه از یه متد ساده که این کار رو انجام میده هم چنین اگر می گفتین بقیه کدهای نوشته شده خودشون رو  درصورت تمایل بذارن و پروژه مرحله به مرحله پیش میرفت شاید بهتر باشه و اگر جایی کسی چیزی رو اشتباه درک میکرد اصلاح هم میشد هر چند نکته مبهمی نداره
>  تشکر از زحماتتون
> موفق باشید


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

----------


## esafb52

در مورد بدست آوردن idgroup  که در جدول سوالات باید درج بشه من همیشه اسم گروه رو میگرفتم و بعد یه دونه select وبریز تو data table و بعد سطرid رو بدست می آوردم که روش کار شما خیلی عالی بودو استاندارد و کوتاه همچنین من تابع لود اطلاعات با دستور sql command مینوشتم کی خیلی طولانی تر از دستورات شما بود ضمنا ترس استفاده از استور پروسجور ها هم کاملا برطرف  شد حین کار هم نکاتی مفیدی گفته شد که تا حالا باش مواجه نشده بودم و همه رو تو این ویدیو ها یاد گرفتم
ممنون

----------


## esafb52

با سلام و تشکر از زحماتتون
نکته مربوط به DataRowView  جالب بود و راستش قبلا این رو ندیدم اگر توضیح بیشتری راجبش می دادین خوب بود چطور ما به یک آیتم دسترسی نداریم ولی میتونیم تون رو CAST کنیم و بریزیم تو یه دیتا رو ویو و ازش استفاده کنیم ؟؟
dataAdapter.SelectCommand.Parameters.AddWithValue(  "@GROUPID",((DataRowView) comboBox1.SelectedItem)["GROUPID"]);
من برای این قسمت از چکلیست باکس استفاده کردم و به نظرم دردسرش کمتر بود فقط یک سلکت اضافی داشت 

موفق باشین

----------


## veniz2008

> با سلام و تشکر از زحماتتون
> نکته مربوط به DataRowView  جالب بود و راستش قبلا این رو ندیدم اگر توضیح بیشتری راجبش می دادین خوب بود چطور ما به یک آیتم دسترسی نداریم ولی میتونیم تون رو CAST کنیم و بریزیم تو یه دیتا رو ویو و ازش استفاده کنیم ؟؟
> dataAdapter.SelectCommand.Parameters.AddWithValue(  "@GROUPID",((DataRowView) comboBox1.SelectedItem)["GROUPID"]);
> من برای این قسمت از چکلیست باکس استفاده کردم و به نظرم دردسرش کمتر بود فقط یک سلکت اضافی داشت


سلام دوست من.
اجازه بدید ابتدا درباره دلیل رخ دادن خطا در رویداد SelectedIndexChanged صحبت کنم.
در حالت عادی که یک کمبوباکس خالی هست، selectedindex اون برابر با 1- هست.
رویداد SelectedIndexChanged زمانی فعال میشه که selectedindex کمبو تغییر (change) کنه.
دلیل  اینکه به خاصیت selectedvalue یک آیتم دسترسی نداریم این هست که همزمان که  کمبو در حال پر شدن هست (یعنی selectedindex کمبوباکس تغییر میکنه) رویداد  SelectedIndexChanged صدا زده میشه که ناتوان از دریافت Value آیتمی هست  که هنوز بصورت کامل بارگذاری نشده. (comboboxname.selectedvalue ).
اما در مورد قطعه کدی که من استفاده کردم :
ابتدا  لازم هست که مختصری درباره DataView بدونیم. بصورت ساده اگر دیتاتیبل رو  یک جدول از داده های واقعی (RealData) در نظر بگیریم یک دیتاویو یک Shot  (عکس یا نما) از روی جدول واقعی ما خواهد بود. به بیان دیگه یه دیتاویو یه  جدول مجازی از روی جدول واقعی (دیتاتیبل یا دیتاست) ماست که قابلیت سفارشی  کردن مسقیم اطلاعات رو داره (مثل فیلتر کردن اطلاعات. در صورتیکه دیتاتیبل  مستقیما چنین امکانی رو نداره).
یه کم هم بهتره درباره DataRow بدونیم.  در حقیقت DataRow برای دسترسی به سطرهای درون یک دیتاتیبل (یا دیتاست) بکار  میره. چه زمانیکه بخوایم سطری رو به دیتاتیبل اضافه کنیم چه زمانیکه قصد  حذف سطری رو داریم و چه زمانیکه قصد خوندن یک ستون از یک سطر رو داشته  باشیم، از DataRow کمک میگیریم.
اما حالا باید ببینیم که DataRowView چی  هست. بصورت ساده DataRowView یک سطر از یک دیتاویو هست یا به عبارت دیگه  DataRow ای هست که به دیتاتیبل اشاره داره. بنابراین زمانیکه من به این سطر  اشاره میکنم همونجا هم اعلام میکنم که به مقدار کدوم ستون از این سطر نیاز  دارم :
((DataRowView)CmbGroup.SelectedItem)["GroupID"]
اما در مورد روشی که شما استفاده میکنید.
قطعا خودتون هم قبول دارید که این کار پاک کردن صورت مساله و مواجه نشدن با خطا هست.
من نظرم اینه که گذاشتن چک لیست باکس و سلکت زدن خیلی سخت تر (و البته غیر بهینه بودن) هست تا یک نصفه خط کد.
بهرحال بسیار خوشحالم که شما ابهامی که براتون بوجود اومده بود رو مطرح کردید و بی تفاوت از کنار موضوع رد نشدید.

----------


## amir200h

> سلام
> با تشکر از زحمتتون بابت آموزشها
> اگه امکانش هست سورس مریوط به هر قسمت را هم قرار دهید


اتفاقا خوب کاری میکنن سورس رو در اختیار دوستان نمیزارن. اگه سورس رو داشته باشین دیگه خودتون سراغ نوشتن کد نمیرین
بهتره خودتون شروع کنین به ساخت همین پروژه و نمرین کنین هرجاش به مشکل برخوردین به فیلم رجوع کنین

----------


## esafb52

> من نظرم اینه که گذاشتن چک لیست باکس و سلکت زدن خیلی سخت تر (و البته غیر بهینه بودن) هست تا یک نصفه خط کد.


با سلام مجدد نه من هم این رو به روش شما انجام دادم فقط در فرم سوالات بجای گرید از چکلیست باکس استفاده کردم که تفاوت چندانی نداشت ولی در یک جا از دیتا ریدر استفاده کردم

کدهای  این فرم 
using System;
using System.Data;
using System.Data.SqlClient;
using System.Windows.Forms;

namespace MYAZMOON
{
    public partial class frmdefineqestions : Form
    {
        private readonly SqlConnection connection;
        private SqlDataAdapter dataAdapter;
        private DataTable dt;

        public frmdefineqestions()
        {
            connection =
                new SqlConnection(
                    @"Data Source=.\SQLEXPRESS;AttachDbFilename=
            |DataDirectory|\DBAZMOON.mdf;Integrated Security=True;User Instance=True");
            InitializeComponent();
        }

        private void frmdefineqestions_Load(object sender, EventArgs e)
        {
            comboBox1loadddata();
            comboBox2.SelectedIndex = 0;
            loadqustintxt();
        }

        private void loadqustintxt()
        {
            dt = new DataTable();
            dataAdapter = new SqlDataAdapter("qustiontex", connection);
            dataAdapter.SelectCommand.CommandType = CommandType.StoredProcedure;
            dataAdapter.SelectCommand.Parameters.AddWithValue(  "@GROUPID",((DataRowView) comboBox1.SelectedItem)["GROUPID"]);
            dataAdapter.Fill(dt);
            checkedListBox1.DataSource = dt;
            checkedListBox1.DisplayMember = "QUSETIONTEXT";
            checkedListBox1.ValueMember = "QUSTIONID";
        }

        private void comboBox1loadddata()
        {
            dt = new DataTable();
            dataAdapter = new SqlDataAdapter("loaddall", connection);
            dataAdapter.SelectCommand.CommandType = CommandType.StoredProcedure;
            dataAdapter.Fill(dt);
            comboBox1.DataSource = dt;
            comboBox1.DisplayMember = "GROUPNAME";
            comboBox1.ValueMember = "GROUPID";
        }

        private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
        {
            loadqustintxt();
        }

        private void addqustion_Click(object sender, EventArgs e)
        {
            var command = new SqlCommand("addqusetion", connection);
            command.CommandType = CommandType.StoredProcedure;
            command.Parameters.AddWithValue("@QUSETIONTEXT", textBox1.Text);
            command.Parameters.AddWithValue("@CASE1", textBox2.Text);
            command.Parameters.AddWithValue("@CASE2", textBox3.Text);
            command.Parameters.AddWithValue("@CASE3", textBox4.Text);
            command.Parameters.AddWithValue("@CASE4", textBox5.Text);
            command.Parameters.AddWithValue("@ANSWER", comboBox2.Text);
            command.Parameters.AddWithValue("@GROUPID", comboBox1.SelectedValue);
            connection.Open();
            command.ExecuteNonQuery();
            connection.Close();
            frmdefineqestions_Load(null, null);
            MessageBox.Show("سوال درج شد");
            cleratxtbox();
        }

        private void cleratxtbox()
        {
            foreach (Control c in groupBox1.Controls)
            {
                if (c is TextBox)
                {
                    (c as TextBox).Text = string.Empty;
                }
            }
        }

        private void btndelete_Click(object sender, EventArgs e)
        {
            if (checkedListBox1.Items.Count > 0 && checkedListBox1.GetItemChecked(checkedListBox1.Sel  ectedIndex))
            {
                var command = new SqlCommand("DELETequstion", connection);
                command.CommandType = CommandType.StoredProcedure;
                command.Parameters.AddWithValue("@id", checkedListBox1.SelectedValue);
                connection.Open();
                command.ExecuteNonQuery();
                connection.Close();
                frmdefineqestions_Load(null, null);
                MessageBox.Show("حذف شد");
            }
        }

        private void checkedListBox1_DoubleClick(object sender, EventArgs e)
        {
            if (checkedListBox1.Items.Count > 0 && checkedListBox1.GetItemChecked(checkedListBox1.Sel  ectedIndex))
            {
                SqlDataReader reader;
                var command = new SqlCommand("sendqestionforupdate", connection);
                command.CommandType = CommandType.StoredProcedure;
                command.Parameters.AddWithValue("@id", checkedListBox1.SelectedValue);
                connection.Open();
                reader = command.ExecuteReader();
                try
                {
                    if (reader.Read())
                    {
                        textBox1.Text = reader["QUSETIONTEXT"].ToString();
                        textBox2.Text = reader["CASE1"].ToString();
                        textBox3.Text = reader["CASE2"].ToString();
                        textBox4.Text = reader["CASE3"].ToString();
                        textBox5.Text = reader["CASE4"].ToString();
                    }
                    connection.Close();
                    reader.Close();
                }
                catch (Exception exception)
                {
                    MessageBox.Show(exception.Message);
                }
            }
        }

        private void btnedit_Click(object sender, EventArgs e)
        {
            if (checkedListBox1.Items.Count > 0 && checkedListBox1.GetItemChecked(checkedListBox1.Sel  ectedIndex))
            {
                SqlDataReader reader;
                var command = new SqlCommand("sendqestionforupdate", connection);
                command.CommandType = CommandType.StoredProcedure;
                command.Parameters.AddWithValue("@id", checkedListBox1.SelectedValue);
                connection.Open();
                reader = command.ExecuteReader();
                try
                {
                    if (reader.Read())
                    {
                        textBox1.Text = reader["QUSETIONTEXT"].ToString();
                        textBox2.Text = reader["CASE1"].ToString();
                        textBox3.Text = reader["CASE2"].ToString();
                        textBox4.Text = reader["CASE3"].ToString();
                        textBox5.Text = reader["CASE4"].ToString();
                        comboBox2.Text = reader["ANSWER"].ToString();
                    }
                    connection.Close();
                    reader.Close();
                }
                catch (Exception exception)
                {
                    MessageBox.Show(exception.Message);
                }
            }
        }

        private void btnsaveedit_Click(object sender, EventArgs e)
        {
            var command = new SqlCommand("updatetblqusetion", connection);
            command.CommandType = CommandType.StoredProcedure;
            command.Parameters.AddWithValue("@qustinoid", checkedListBox1.SelectedValue);
            command.Parameters.AddWithValue("@QUSETIONTEXT", textBox1.Text);
            command.Parameters.AddWithValue("@CASE1", textBox2.Text);
            command.Parameters.AddWithValue("@CASE2", textBox3.Text);
            command.Parameters.AddWithValue("@CASE3", textBox4.Text);
            command.Parameters.AddWithValue("@CASE4", textBox5.Text);
            command.Parameters.AddWithValue("@ANSWER", comboBox2.Text);
            command.Parameters.AddWithValue("@GROUPID", comboBox1.SelectedValue);
            connection.Open();
            command.ExecuteNonQuery();
            connection.Close();
            frmdefineqestions_Load(null, null);
            MessageBox.Show("سوال ویرایش شد");
            cleratxtbox();
        }
    }
}

----------


## veniz2008

> با سلام مجدد نه من هم این رو به روش شما انجام دادم فقط در فرم سوالات بجای گرید از چکلیست باکس استفاده کردم که تفاوت چندانی نداشت ولی در یک جا از دیتا ریدر استفاده کردم


سلام.
بعضی از کارهایی رو که انجام دادید خوب هست (مثل همون foreach ای که باهاش تکست باکس ها رو خالی میکنید).
ولی بعضی از کارهای دیگه اصلا بهینه نیست و چندین مرتبه یک عمل رو انجام دادید که عملا اضافه کاری هست و باعث کاهش سرعت میشه.
مثلا در addquestion اومدید و فرم لود رو صدا زدید. ما وقتی سوال رو ویرایش میکنیم فقط به سوال دست زدیم نه به گروه های امتحانی. بنابراین صدا زدن فرم لودی که پر کردن کمبو گروه ها رو انجام میده عملا یک کار اضافی و بیهوده هست (با صدا زدن فرم لود عملا دارید به دیتابیس کانکشن میزنید و دوباره اطلاعات گروه ها رو از دیتابیس میخونید و می ریزید داخل کمبو. در صورتیکه این کار هیچ ضرورتی نداره و فقط یکبار بایستی انجام بشه). (این کار رو در btnsaveedit و btndelete هم انجام دادید).
مورد بعدی استفاده بی جهت از دیتا ریدر هست.
گرچه پیاده سازی یک پروژه به روش های متفاوتی انجام میشه و سلیقه برنامه نویس ها در استفاده از اشیای مختلف متفاوت هست ولی به این مورد توجه کنید در اینجا باز هم شکا دارید یک select اضافی رو پیاده سازی میکنید. یک select برای پر کردن چک لیست باکس (معادل همون پر کردن گرید)، و مورد بعدی باز هم اومدید آی دی رو از چک لیست باکس گرفتید و یک select به دیتابیس زدید و اونو با دیتاریدر به تکست باکس ها منتقل کردید که این کار عملا اضافه هست.
یه توصیه ای بهتون میکنم و اونم اینه تحت هیچ شرایطی عمل اضافی انجام ندید. وصل شدن به دیتابیس و خوندن یکسری اطلاعات و برگشت دادن اون، از منابع سیستم استفاده میشه. اگر قرار باشه در هر فرمی حداقل یک عمل نامناسب (عمل اضافی و غیر ضروری) صورت بگیره در کل پروژه تاثیر خودش رو میذاره.
بنابراین سعی کنید هیچ قطعه کدی رو اضافی ننویسید.
همونطور که دیدید من در انتهای ویدئوی چهارم هم عرض کردم که حتی اون FillGrid درون فرم لود هم اضافی هست و بهتره که نوشته نشه (با وجود اینکه فقط یکبار در طول کار کردن با اون فرم اجرا میشد و پردازش سنگینی رو هم در پی نداشت).
سعی کنید به گونه ای برنامه بنویسید که حداکثر صرفه جویی در منابع سیستم صورت بگیره.

----------


## esafb52

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

 public void iud(OleDbCommand cmd)
        {
            cmd.Connection = con;
            con.Open();
            da.SelectCommand = cmd;
            ds.Clear();
            cmd.ExecuteNonQuery();
            con.Close();
            da.Update(ds, "tbbook");
            cmd.Dispose();
        }

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

----------


## shahin60

سلام ممنون از آموزشاتون
یه سوال:
من از stored proc استفاده نمی کنم حالا چطور باید به پارامتری خارجی که تعریف کردم دسترسی داشته باشم؟ ومقدارشو چک کنم
کاش همه روش ها رو توضیح می دادید .ممنون می شم کد بزارید
یا علی

----------


## veniz2008

> سلام ممنون از آموزشاتون
> یه سوال:
> من از stored proc استفاده نمی کنم حالا چطور باید به پارامتری خارجی که تعریف کردم دسترسی داشته باشم؟ ومقدارشو چک کنم
> کاش همه روش ها رو توضیح می دادید .ممنون می شم کد بزارید
> یا علی


سلام.
من متوجه منظور شما نشدم. کاش کاملتر توضیح میدادید.
وقتی از sp استفاده نمی کنید، چطور پارامتر خروجی دارید؟ (منظورتون رو کامل توضیح بدید).
کدی رو که نوشتید اینجا قرار بدید تا دربارش بحث کنیم.
امکانش وجود نداشت که من بخوام همه روش ها رو در یک آموزش قرار بدم. ADO (بصورت کدنویسی مستقیم، با sp، چند لایه نویسی)، linq و EF .
حداقل بالای 150 ساعت آموزش میخواد. ضمن اینکه تعدد روش ها در یک مجموعه آموزشی باعث سردرگمی مخاطب میشه.
سعی شده هم افراد مبتدی در نظر گرفته بشه و هم روشی گفته بشه که در آینده بتونن با همین روش کارهای بزرگتری رو انجام بدن.
به شخصه بهتون پیشنهاد نمیکنم که از کدنویسی مستقیم درون ویژوال استفاده کنید.
اگر از ADO.Net استفاده میکنید حتما برید سمت استفاده از Stored Procedure ها.
من قبلا در این باره در یکی از تاپیک ها صحبت کرده بودم ولی اینجا هم قرار میدم تا دوستانی که اون تاپیک رو ندیدن این مورد رو مد نظر داشته باشند :
 بحث Stored Procedure ها یکی از بحث های حرفه ای در بخش کار با دیتابیس  هست که 3 ویژگی برتر اون در مقایسه با کدنویسی مستقیم به قرار زیر هست :
1. Performance بالاتر : در کدنویسی مستقیم،در هر بار  و زمانیکه شما یک دستور sql (همون Tsql ) رو از سمت برنامه (مثلا #C) به  سمت دیتابیس می فرستید (یک درخواست مثل لیست همه کالاها). برای به سرانجام  رسیدن این درخواست بایستی مراحل زیر انجام بشه :
بعد از انتقال دستور شما (select ، update و ...) از سمت برنامه به سمت سرور (دیتابیس) کارهای زیر هر بار انجام میشه :
a) در سمت سرور ابتدا از لحاظ syntax چک میشه که آیا این دستور قابلیت اولیه برای اجرا شدن رو داره یا نه.
b) در صورت صحت مرحله قبل یک Execute Plan برای دستور شما توسط sql server اختصاص داده میشه.
c) در مرحله بعد دستور مورد نظر کامپایل میشه.
d) در نهایت دستور در سمت سرور، Run (اجرا) میشه.
e) بعد از اجرا، نتیجه کوئری به سمت برنامه کاربردی برگشت داده میشه و ما میتونیم نتیجه کار رو مشاهده کنیم.
اما در Stored Procedure ها مراحل a و b و c یکبار  در سمت سرور انجام میشه و این مراحل دیگه برای اون sp تکرار نمیشه. به  همین خاطر هست که سرعت Stored procedure ها بیشتر از کدنویسی مستقیم هست  (هر چقدر برنامه و کوئری ها پیچیده تر باشه این سرعت بیشتر نمایان میشه).
در کدنویسی مستقیم :

execute command.jpg

در Stored Procedure ها :

sp execute.jpg

2. برنامه نویسی modular (ماژولار) : یک SP یکبار نوشته میشه ولی میتونید  اون رو بارها در قسمت های مختلف برنامه (با توجه به نیازتون) صدا بزنید  بدون اینکه نیازی به نوشتن چندین باره کدها باشه. خوانایی بالاتری رو هم  شاهد خواهیم بود.
3. امنیت بالاتر : شما میتونید کدهای درون یک sp رو رمزنگاری کنید تا کدهای  داخل اون قابل مشاهده توسط کاربران نباشه. در این حالت یک کاربر فقط  میتونه از اون sp استفاده کنه بدون اینکه دغدغه اینو داشته باشید که به  کدهای Tsql شما دسترسی داشته باشه.
همچنین میشه واسه sp ها سطح دسترسی (مجوز) تعریف کرد که فقط افرادی که ما  مشخص می کنیم بتونن به اون sp و کدهای درون اون دسترسی داشته باشند.

----------


## shahin60

ممنون از توضیح کامل تون
با استفاده از sp و dataset  چطوری به این پارامتر دسترسی پیدا کنم
این خطا میگیره:

  int  result = 0;
                
                DataSet1TableAdapters.UserTableAdapter da = new DataSet1TableAdapters.UserTableAdapter();
                DataSet1.UserDataTable dt = new DataSet1.UserDataTable();
                da.Insert(txtName.Text, txtUser.Text, txtPass.Text, 1,result);


متن خطا:
can not convert ref int to int

----------


## esafb52

با سلام وتشکر از زحماتت جناب ونیز2008 
قسمت Stored Procedure رو من تو اون تایپیک هم خوندم و خیلی هم خوب توضیح دادین ولی یک نکته برام کمی ابهام داشت اونم



> اما در Stored Procedure ها مراحل a و b و c یکبار  در سمت سرور انجام میشه و این مراحل دیگه برای اون sp تکرار نمیشه.


یعنی در حین اجرای برنامه و تا بستنش!!
 یا نه یکبار بروی یک سرور sql  و دیگه n  بار اجرا؟؟

----------


## veniz2008

> ممنون از توضیح کامل تون
> با استفاده از sp و dataset  چطوری به این پارامتر دسترسی پیدا کنم
> این خطا میگیره:
> 
>   int  result = 0;
>                 
>                 DataSet1TableAdapters.UserTableAdapter da = new DataSet1TableAdapters.UserTableAdapter();
>                 DataSet1.UserDataTable dt = new DataSet1.UserDataTable();
>                 da.Insert(txtName.Text, txtUser.Text, txtPass.Text, 1,result);
> ...


روشی رو که شما استفاده می کنید متفاوت هست با اون چیزی که من در این آموزش ها توضیح میدم و سوال شما در چارچوب تاپیک ما نیست.
شما از TableAdapter ها استفاده می کنید و قصد ارتباط دادن اون با sp ها رو دارید ولی در این آموزش ها ما از این روش استفاده نمی کنیم.
لطفا سوالتون رو در یک تاپیک مجزا بپرسید تا دوستان شما رو راهنمایی کنن.
موفق باشید.

----------


## veniz2008

> با سلام وتشکر از زحماتت جناب ونیز2008 
> قسمت Stored Procedure رو من تو اون تایپیک هم خوندم و خیلی هم خوب توضیح دادین ولی یک نکته برام کمی ابهام داشت اونم
> 
> یعنی در حین اجرای برنامه و تا بستنش!!
>  یا نه یکبار بروی یک سرور sql  و دیگه n  بار اجرا؟؟


 زمانیکه برای بار اول درون برنامه یک sp صدا زده میشه، sql server بعد از syntax check یک plan  برای اون sp در Ram (حافظه) ایجاد میکنه و دستور compile میشه. حالا تا زمانیکه این plan در ram  باقی باشه دیگه این مراحل چک نمیشه. یعنی اگر 100 بار هم اون sp صدا زده  بشه به اون plan موجود در حافظه رجوع میشه و دیگه مراحلی رو که ذکر کردم  تکرار نمیشه.
اساسا" یکی از مواردی که استفاده از sp ها رو توجیه میکنه همین تکرار (فراخوانی)یک دستور sql هست.
مثلا در پروژه ما، زمانیکه فرم سوالات باز میشه، کاربر به احتمال زیاد چندین بار پشت سر هم قصد داره که سوالاتی رو ذخیره کنه.
اولین  سوال رو که میخواد ثبت کنه (یعنی sp مورد نظر که AddQuestion هست)  فراخوانی میشه. چون بار اول هست، برای اون sp یک plan در رم ایجاد میشه و  سوال ثبت میشه. حالا زمانیکه میخواد سوال دوم رو ثبت کنه دیگه اون مراحل چک  نمیشن چون یک طرح و نقشه (plan) براش وجود داره.
اما اگر کدنویسی مستقیم باشه برای سوال دوم ، دستور sql مورد نظر دوباره اون مراحل براش چک میشه.

----------


## aydingol

ممنون از بابت آموزشها
سوالی که داشتم در رابطه با این بود که من در طراحی فرم ادمین برای تکست باکس پسورد ، گزینه PasswordChar  را  * کردم و می خوام زمانی که برای ویرایش و حذف روی آن کلیک میشه به صورت عدد یا حروفی در تکست باکسها نشون داده بشه
از چه روشی باید استفاده کنم ؟؟؟؟

----------


## veniz2008

> ممنون از بابت آموزشها
> سوالی که داشتم در رابطه با این بود که من در طراحی فرم ادمین برای تکست باکس پسورد ، گزینه PasswordChar  را  * کردم و می خوام زمانی که برای ویرایش و حذف روی آن کلیک میشه به صورت عدد یا حروفی در تکست باکسها نشون داده بشه
> از چه روشی باید استفاده کنم ؟؟؟؟


 خیلی راحت میتونید از کدنویسی برای کنترل متن تکست باکس استفاده کنید. مثال زیر رو ببینید :
if (checkBox1.Checked)
            {
                textBox1.PasswordChar = '*';
                textBox1.Text = "salam";
            }
            else
            {
                textBox1.PasswordChar = '\0';
                textBox1.Text = "salam";
            }




> private void button1_Click(object sender, EventArgs e)
>         {
>             //declare variable
>             double dblArea;
> 
>             //calculate the area of circle with radius 100
>             dblArea = CalculateAreaFromRadius(100);
> 
>             //print the results
> ...


سلام.
سوال شما به بحث ما ارتباطی نداره فقط اینو بگم که کلاس مسیج باکس و متد show اون به 21 روش قابل مقداردهی هست که شما خارج از فرمت (قالب) این 21 روش مسیج باکس رو مقدار دهی کردید. (حالتی وجود نداره که مورد اول double باشه و مورد دوم string قبول کنه).
دوستان لطفا سوالاتی رو که به آموزش ما مرتبط نمیشه در تاپیک های جداگانه مطرح بفرمایید.
تشکر از همکاری دوستان.

----------


## esafb52

با سلام 
اگر ویرایش رو هم به این صورت که یک باکلیک بر روی یک سطر و زدن  دکمه ویرایش یک  فرم جدید رو نمایش میدادین و بعد با DialogResult نتایج رو برمیگردوندین پیاده سازی میشدقشنگتر بود 
همچنین برای سطح دسترسی اگر در جداول فیلدهایی از نوع bit میگرفتین و برای تعریف سطح دسترسی ازش استفاده میکردین جالبتر و کارامدتر نبود؟؟مثلا اگر ادمین بخواهد به کسی یه اجازه دسترسی بیشتری بده الان بااین روش در زمان اجرا نمیتونه کاری بکنه هرچند که اینجا در این برنامه فقط 2 سطح وجود داره 
موفق باشید

----------


## veniz2008

> با سلام 
> اگر ویرایش رو هم به این صورت که یک باکلیک بر روی یک سطر و زدن  دکمه ویرایش یک  فرم جدید رو نمایش میدادین و بعد با DialogResult نتایج رو برمیگردوندین پیاده سازی میشدقشنگتر بود


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



> همچنین برای سطح دسترسی اگر در جداول فیلدهایی از نوع bit میگرفتین و برای تعریف سطح دسترسی ازش استفاده میکردین جالبتر و کارامدتر نبود؟؟مثلا اگر ادمین بخواهد به کسی یه اجازه دسترسی بیشتری بده الان بااین روش در زمان اجرا نمیتونه کاری بکنه هرچند که اینجا در این برنامه فقط 2 سطح وجود داره 
> موفق باشید


در این مورد در طول ویدئو کاملا توضیح دادم که با توجه به اینکه پروزه ما دو نوع سطح دسترسی ساده داره و اینکه ما منوهای زیادی رو نداریم از ساخت جدول برای این کار اجتناب شد. در پروژه هایی که چندین سطح دسترسی وجود داره و تعداد افرادی که با اون نرم افزار کار میکنن زیاد هستن حتما بایستی یه جدول جداگانه برای ذخیره سازی سطح دسترسی اشخاص (یا گروه ها) در نظر گرفت.
من قبلا در یک تاپیک اینو بصورت کامل توضیح دادم ولی بخاطر اینکه ممکنه افرادی باشند که اون تاپیک رو ندیدن، اون مطالب رو اینجا هم میارم تا افرادی که این تاپیک رو ملاحظه میکنن و از این بابت مشکل دارند بتونن این مورد رو هم یاد بگیرند.
*------------------------------------------------------------------------------------------------------*
 روند کار شما دو مرحله هست. 1: مشخص کردن سطح دسترسی برای هر کاربر  2: اعمال کردن این محدودیتها در هنگام لاگین هر شخص.
یکی از روش های پیاده سازی میتونه اینطوری باشه:
روش اول : یک جدول که سطح دسترسی   اشخاص رو مشخص میکنه نیاز دارید.ستون های این جدول نام کاربری و تعداد   منوها (یا در صورت نیاز زیر منوها) هست. یعنی اگر در برنامه شما 5 منو وجود   داره که هر منو هم 3 زیرمنو داره اگر میخواید برحسب منو کاربر رو کنترل   (اجازه یا عدم اجازه) کنید باید علاوه بر نام کاربری 5 تا ستون دیگه هم   ایجاد کنید و اگر میخواید بر حسب زیر منو کاربر رو کنترل کنید بایستی 5*3 =   15 فیلد ایجاد کنید. 
فیلدها رو از نوع bit در نظر بگیرید (اگر تیک نداشته باشه یعنی false و اجازه دسترسی به اون منو رو نداره).
روش دیگه میتونه بر حسب سمت شغلی باشه.
در اینجا دو جدول نیاز هست : جدول اول شبیه جدول بالاست فقط به جای نام   کاربری باید سمت شغلی مشخص بشه . و جدول دوم میشه نام کاربری و سمت شغلی.   خوبی این روش اینه که یکبار برای هر سمت شغلی، محدودیت ها تعریف میشه و بعد   از اون فقط برای یک شخص سمت شغلیش رو مشخص میکنیم. (زمانیکه تعداد  کاربران  و تعداد منوها(یا زیرمنوها) زیاد باشن، این روش به مراتب به صرفه  تر هستش  چون فضای به مراتب کمتری گرفته میشه).
حالا هنگام لاگین ، اگر کاربر یوزر و پسورد رو درست وارد کرد، میرید از جدول سطح   دسترسی، رکوردش رو میخونید و بصورت زیر بر روی منوها (یا زیرمنوها) اعمال   می کنید(کد زیر برای زیر منو ها هست، در ادامه برای منوها هم کد رو   میزارم):
M00.Enabled = Convert.ToBoolean(DtAccessLevel.Rows[0]["M00"].ToString());
M01.Enabled = Convert.ToBoolean(DtAccessLevel.Rows[0]["M01"].ToString());
M10.Enabled = Convert.ToBoolean(DtAccessLevel.Rows[0]["M10"].ToString());
M11.Enabled = Convert.ToBoolean(DtAccessLevel.Rows[0]["M11"].ToString());
M12.Enabled = Convert.ToBoolean(DtAccessLevel.Rows[0]["M12"].ToString());


برای غیر فعال کردن منوها هم میتونید از کد زیر استفاده کنید(اگر در جدول برای تعیین سطح دسترسی به جای زیر منو از منو استفاده کردید. مثل همون چیزی که ما در پروژه انجام دادیم و منوها رو غیرفعال میکردیم):
menuStrip1.Items["M0"].Enabled = Convert.ToBoolean(DtAccessLevel.Rows[0]["M0"].ToString());
توجه : من برای راحتی کار خودم نام فیلدها و نام منوها در فرم رو یکسان در   نظر گرفتم. منظور از M00 یعنی اولین زیرمنو در اولین منو. منو اول من M0   هست و منوی بعدی M1 و ...
توضیحات بیشتر :
وقتی یک شخص یوزر و پسورد رو صحیح وارد میکنه، باید برید داخل جدولی که سطح دسترسی رو نگهداری میکنید. اونجا یک select میزنید:
select * from TblAccessLevel where UserID = @userid
منظور از userid@ همون نام کاربری صحیح هست که کاربر باهاش لاگین کرده.   نتیجه select بالا میشه یک رکورد که میگه وضعیت هر منو برای اون شخص چطوره   (True یا False ). 
اگر هم از روش دوم استفاده کردی یعنی دو جدول داری که یکی شامل (کد) سمت   شغلی و فیلدهایی به تعداد منوها(یا زیرمنوها) و جدول دوم هم میشه نام   کاربری و (کد) سمت شغلی. در این حالت select شما بصورت زیر میشه:
select * from tbl1 inner join tbl2 on tbl1.JobID = tbl2.JobID where UserID = @userid
موفق باشید.

----------


## esafb52

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

----------


## veniz2008

> با سلام و تشکر از پاسخ کامل تون بله قبول دارم که کاربر رو نباید به فرم  های مختلف پاس داد ولی این انتخاب ستون رو هدر  برای ویرایش خیلی جالب نیست  اصلا شما فکر کنید یه کاربری برای بار اول این گرید رو ببینه نمیدونه کجا  رو کلیک کنه من اکثرا یه ستون چک باکس میذارم و با اون کار میکنم یا نوع دو  ستون از نوع باتن به گرید اضافه میکنم که تو هر سطرهستند یکی حذف یکی  ویرایش


برای حل این مشکل دو راه در تمام نرم افزارها پیاده سازی میشه :
1. یک متن کوتاه در همون فرم قرار میدن که توضیح مختصری (چکیده ای) از نحوه کار رو نشون میده. مثلا :
"برای تصحیح یا حذف یک رکورد بر روی ابتدای آن سطر دابل کلیک کنید". اینطوری کاربر متوجه میشه که باید چطوری این کار رو انجام بده.
ما در پروژه چنین پیغامی رو نذاشتیم (چون من در حین ویدئو این مطلب رو توضیح دادم) ولی حتما باید در یک پروژه واقعی چنین پیغام های کوتاهی ذکر بشه تا کاربر سر درگم نشه.
2. فایل راهنمای نرم افزار.
در فایل راهنمایی که همراه نرم افزارها وجود داره بصورت کامل باید نحوه استفاده از قسمت های مختلف یک نرم افزار توضیح داده بشه (معمولا از تصاویر به همراه متن استفاده میشه) که در قسمت آخر این مجموعه آموزشی با استفاده از نرم افزار WinCHM ساخت چنین راهنماهایی هم بصورت کامل توضیح داده میشه.

----------


## redflight

سلام
من نمی دونم مشکلم چی بود که با firefox فیلم ها دانلود نمی شد اما الان که با گوگل کروم دانلود کردم خیلی خیلی خوشحالم
فیلم اول رو دیدم و فکر می کنم 4 تاشو امروز ببنم تا عقب نیفتم
اما یه سوالی دارم 
راجع به پایگاه داده
همون طور که گفتین توی فیلم اول پایگاه داده ای که توی خود ویژوال هست رو برای پروژه های کوچیک و دانشجویی مناسبه
برای پروژه های بزرگ ( خیلی خیلی خیلی بزرگ ) ما باید از خود اس کیو ال 2008 استفاده کنیم خب از چه نوعیش؟ بهترین نوعش اکسپرسه؟ 

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

----------


## veniz2008

> همون طور که گفتین توی فیلم اول پایگاه داده ای که توی خود ویژوال هست رو برای پروژه های کوچیک و دانشجویی مناسبه
> برای پروژه های بزرگ ( خیلی خیلی خیلی بزرگ ) ما باید از خود اس کیو ال 2008 استفاده کنیم خب از چه نوعیش؟ بهترین نوعش اکسپرسه؟


سلام دوست عزیز.
ببینید ما چندین نوع Sql server داریم که در واقع Engin های sql هستند که هر کدوم از اینها برای موارد خاص خودشون استفاده میشن.
SQL Server Express Edition 
SQL Server Standard Ediotion
SQL Server Developer Edition
SQL Server EnterPrise Edition 
 نسخه express رابط گرافیکی (management studio) رو نداره و از لحاظ یکسری امکانات هم محدودیت هایی داره، بسیار کم حجم تر از بقیه نسخه ها هست و البته  رایگان هست (مطمئنا چون در ایران زندگی میکنیم کلمه "رایگان" کاملا بی مفهوم هست برای ما).
یک مدل از sql express هست که رابط گرافیکی هم داره که اصطلاحا" بهش SQL Server Express with Advanced Services گفته میشه. این هم رایگان هست ولی رابط گرافیکی رو هم داره.
درباره محدودیت های sql express اینو از msdn براتون درآوردم :
Limitations of SQL Server Express Edition
1. Number of CPUs supported
SQL  Server Express uses only one CPU at a time. It can be installed on a   server with multiple CPUs, but it will use only one CPU at a time.
2. Maximum memory used
SQL  Server Express uses a maximum of 1 GB memory for it's data buffer.  So,  if your server has severaql GB memeory, SQL Server Express cannot  take  advantage of it.
3. Database size limit
Maximum database size is limited to 4 GB (log file size is not counted)
4. Profiler in SQL Server Express
Profiler tool is not included with SQL Server Express editions.
5. Job Scheduler
Job Scheduling service is not available with SQL Server Express.
6. Import/Export 
Data import and export feature is not available with SQL Server Express.( But can be downloaded as Russell has mentioned)

از این توضیحات که بگذریم درباره سوالتون برای برنامه نویسان بهترین نسخه، همون SQL Server Developer Edition هست که البته شما می تونید نسخه Standard رو هم نصب کنید.




> ببخشید یه سوال دیگه هم دارم فیلم ها رو چند روز یک بار می زارید ؟


اگر مشکل خاصی پیش نیاد فیلم ها معمولا هر 3 روز یکبار قرار میگیرن.



> می شه این کارتون رو ادامه بدید؟ آخه واقعا فیلماتون خوبه من با این که یکیشو دیدم اما بی نهایت راضی ام من هزینه فوق العاده زیادی برای سی دی های اموزشی سی شارپ داده بودم و... ولی اینجوری نبودن
> می شه بعد از این دوره هم دوره های دیگه رو ادامه بدید؟ 
> ممنون


 نظر لطف شماست بابت آموزش ها ولی باور بفرمایید تهیه فیلم آموزشی بسیار وقت گیر و زمانبر هست.
اینطور نیست که یک camtasia نصب کنم و شروع به ضبط کردن کنم. من حساسیت زیادی رو نسبت به مطالبی که میگم دارم. قبلش ساعت ها مطالعه کردم و از جاهای مختلف و منابع مختلف مطالعه کردم تا مطلبی رو که ارائه میکنم مفید باشه (هر چند اعتقاد دارم که هر کاری باز هم عاری از خطا و اشتباه نیست و ممکنه ایراداتی هم وجود داشته باشه). 
بحث بعدی زمانی هست که بایستی برای تدوین این آموزش ها گذاشت. هر چند که من هیچگونه کار تزئینی برای این مورد انجام ندادم ولی با این وجود باز هم واقعا زمانبر هست ویرایش کردن آموزش هایی که ضبط شده.
غول بعدی در راه آموزش ها، بحث آپلود کردن ویدئوها هست. اکثر مواقع تا 3 ساعت پای سیستم میمونم تا یک فایل 60 مگی آپلود بشه. همونطور که خودتون هم میدونید آپلود کردن بسیار زمانبرتر از دانلود کردن هست.
تمام این کارها وقت و انرژی زیادی رو می طلبه که باعث میشه آدم از خیلی از کارها بیفته.
به این دلایلی که در بالا عرض کردم امکان تهیه آموزش جدید فعلا مقدور نیست و طرح و اندیشه ای هم برای این کار ندارم.
موفق باشید.

----------


## redflight

سلام 
خیلی ممنون برای پاسخ جامع
ببخشید من از کجا بفهمم کدوم sql رو نصب کردم؟

مثلا اگر برای همین آزمون ساز 4000 تا سوال داشته باشم نسخه استاندارد جواب می ده ؟ ( مثال زدم :دی )  کلا یه جدول اگه 50000 تا مثلا سطر داشته باشه هیچ اتفاق خطرناکی براش نمی افته؟؟

بدون اغراق می گم فیلم های آموزشی ای که تهیه کردید خیلی جامع است من اگه سی دی های آموزشی ای که خریدم و به اصطلاح بهترین ها بودن ( مقدماتی - متوسط - پیشرفته - سطح حرفه ای یک ، دو ، سه ، چهار ، پینج) البته تا حرفه ای 1 که دیدم پایگاه داده اش اکسس هست هنوز!!  رو اگه بشه اینجا بزارم همه دوستان متوجه می شن که من چی میگم
برای همین خیلی مصر ( moser نمی دونم املاش رو درست نوشتم یا نه) هستم آموزش های  شما ادامه داشته باشه حتی اگه مجبور بشین برای وقتی که می زارید آموزش های تجاری ( تولید سی دی های آموزشی) رو راه بندازید من و دوستانم با کمال میل سی دی ها رو تهیه می کنیم فقط خواهش می کنم این آموزش ها رو متوقف نکنین من آموزش دیگه ای نمی تونم پیدا کنم :(

----------


## veniz2008

> ببخشید من از کجا بفهمم کدوم sql رو نصب کردم؟


خیلی راحت هست. یک new query در محیط sql باز کنید و کد زی رو در اون اجرا کنید :
print @@version

version sql.JPG




> مثلا اگر برای همین آزمون ساز 4000 تا سوال داشته باشم نسخه  استاندارد جواب می ده ؟ ( مثال زدم :دی )  کلا یه جدول اگه 50000 تا مثلا  سطر داشته باشه هیچ اتفاق خطرناکی براش نمی افته؟؟


با sql شوخی نکنید بدش میاد!.
الان بحث بر سر میلیون ها رکورد و چند ترابایت اطلاعات هست. SQL بسیار بسیار قدرتمندتر از اون چیزی هست که فکر می کنید.
این چیزی که گفتید برای نسخه express هم مثل آب خوردن هست چه برسه به نسخه های Standard و Developer .
اون توضیحاتی که بهتون درباره محدودیت های express دادم رو دوباره بخونید.




> بدون اغراق می گم فیلم های آموزشی ای که تهیه کردید خیلی جامع است  من اگه سی دی های آموزشی ای که خریدم و به اصطلاح بهترین ها بودن ( مقدماتی  - متوسط - پیشرفته - سطح حرفه ای یک ، دو ، سه ، چهار ، پینج) البته تا  حرفه ای 1 که دیدم پایگاه داده اش اکسس هست هنوز!!  رو اگه بشه اینجا بزارم  همه دوستان متوجه می شن که من چی میگم


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



> برای همین خیلی مصر ( moser نمی دونم املاش رو درست نوشتم یا نه)  هستم آموزش های  شما ادامه داشته باشه حتی اگه مجبور بشین برای وقتی که می  زارید آموزش های تجاری ( تولید سی دی های آموزشی) رو راه بندازید من و  دوستانم با کمال میل سی دی ها رو تهیه می کنیم فقط خواهش می کنم این آموزش  ها رو متوقف نکنین من آموزش دیگه ای نمی تونم پیدا کنم :(


املاش درست بود دوست من (مصر به معنای اصرار کننده هست!)
پول!!!!!!!!!!!  :لبخند گشاده!: 
پول، شهوت و قدرت 3 چیزی هستن که همیشه وسوسه کننده بودن.
من هیچگونه نیت مالی و انگیزه اقتصادی از این آموزش ها  ندارم و هدفم هم این نیست که با گذاشتن این آموزش ها عده ای رو وسوسه کنم  که مثلا برای آموزش های بعدی (در صورت وجود) پول پرداخت کنن.
گرچه  اگر شخصی بابت آموزش هاش پول هم دریافت کنه اساسا" هیچ ایرادی نداره.  چراکه بابت تلاش و زحمتش مزد دریافت کرده. مهم اینه آدم به اندازه دانشش  پول طلب کنه. به قول شما سی دی بی محتوا نده بیرون و کلی پول هم بگیره.
این آموزش ها یک شروع هست دوست من.
هنر  شما باید این باشه که روی موضوعات جدید فکر کنید. مطالب جدید رو مطالعه  کنید و ایده های جدید داشته باشید. هیچوقت به این چیزهایی که من میگم اکتفا  نکنید. بهترین دوست شما کتاب خواهد بود. ویدئو هم مزایای خودش رو داره ولی کتاب یه چیز دیگست.



> سلام اقا من کلا در ارتباط بین جداول مشکل دارم
> میشه بگین کی باید از کلید خارجی استفاده کنیم  کلید خارجی میتونه کلید  اصلی هم باشه و... کاش یه فیلم هم درباره این مورد میزاشتین.


اول یه توضیح کتابی میدم بعد با چند مثال توضیح میدم مطلب رو.
وظیفه کلید خارجی، ارتباط دادن دو جدول با هم هست.
مثال 1 : سیستم دانشگاه
جدول دانشجو رو فرض کنید که کلید اصلی اون شماره دانشجویی هست.
حالا مثلا جدول نمرات رو در نظر بگیر. یا جدول دروس اخذ شده یا جدول "وام های دریافتی" و ...
ببینید در تمام این جداول باید مشخص بشه که نمره دانشجو چند هست، یا اینکه دانشجو چه درسی رو اخذ کرده و یا دانشجو چه وامی رو گرفته.
همونطور که می بینید هر 3 تای این جداول به جدول "دانشجو" وابسته هستن. اگر دانشجویی وجود نداشته باشه این جداول بی معنی هستن.
بنابراین  شماره دانشجویی که در این 3 جدول میاد وابسته به همون کلید اصلی جدول  دانشجو هست. این همون کلید خارجی هست. ما نمیتونیم (حق نداریم) که شماره  دانشجویی رو وارد جدول نمرات(یا جدول وام ها) کنیم که وجود خارجی نداره. در  غیر اینصورت صحت و امنیت داده ها زیر سوال میره. پس ارتباط بین جداول از  طریق کلید خارجی باعث تضمین ورود مقدار صحیح در جداول وابسته (جدول نمره،  جدول وام، جدول دروس اخذ شده) میشه.
مثال بعدی رو یه فروشگاه ساده در نظر بگیرید.
یه جدول داریم به نام مشتری ها (customer).
حالا جدول سفارشات (orders) یا جدول خرید (buy) رو در نظر بگیر.
در هر دوی این جداول بایستی مشخص بشه که چه مشتری کالا سفارش داده و کدوم مشتری کالا رو خریداری کرده.
بنابراین  شماره مشتری که در این دو جدول میاد وابسته به همون شماره مشتری در جدول  مشتری هستن. این فیلد که وظیفه ارتباط بین این دو جدول با جدول مشتری رو  داره همون کلید خارجی هست (یادتون نره ما نمیتونیم (و حق نداریم) شماره  مشتری رو وارد جدول سفارشات یا جدول خرید کنیم که وجود خارجی نداره).
یا مثلا در همین مثال فروشگاه ما یک جدول کالا داریم که کلید اصلی اون کد کالا خواهد بود.
در  جدول سفارشات علاوه بر اینکه باید بدونیم چه مشتری سفارش داده باید بدونیم  چه کالایی هم سفارش داده. بنابراین نیاز هست که کد کالای مورد نظر هم ثبت  بشه. به همین خاطر باید کد کالایی در جدول سفارشات بیاد که در جدول کالا  وجود داشته باشه. پس اینجا ما دو کلید خارجی داریم. یکی کد مشتری و دیگری  کد کالا (که وابسته به جدول کالا هست).
در مورد سوالتون که گفتید آیا کلید خارجی میتونه کلید اصلی باشه یا نه.
بله میتونه ولی به شرایط جدول و پروژه بستگی داره.
باید انواع رابطه ها بین جداول رو بدونیم.
1.رابطه یک به یک (مثلا هر کشوری فقط یک پایتخت  داره و هر پایتختی هم فقط مال یک کشور هست. یا سیستم ازدواج در همه (یا  اکثر) کشورهای دنیا (به جز ایران) : هر مرد فقط میتونه یک زن داشته باشه و  هر زنی هم فقط میتونه یک مرد داشته باشه)
2. رابطه یک به چند (مثلا هر  دانشجویی فقط میتونه یک استاد راهنما داشته باشه ولی همون استاد میتونه  واسه چندین دانشجو استاد راهنما باشه. یا مثال ازدواج تو ایران : هر زنی  فقط میتونه یک شوهر داشته باشه ولی همون شوهر میتونه چندین زن داشته باشه)
3.  رابطه چند به چند (رابطه اخذ درس اینطوری هست. هر دانشجویی میتونه چندین  درس اخذ کنه و هر درسی هم میتونه توسط چندین دانشجو اخذ بشه).
با این توضیحات باید دید که آیا کلید خارجی که در یک جدول میاد چه رابطه ای داره. زمانی میتونید کلید خارجی رو کلید اصلی هم در نظر بگیرید که رابطه یک به یک داشته باشید.
مثلا در سیستم دانشگاه.
در جدول نمرات آیا برای هر دانشجویی فقط یک نمره ثبت میشه؟
جواب  نه هست. در جدول نمرات هر دانشجو براش چندین نمره ثبت میشه. پس کلید خارجی  نمیتونه کلید اصلی باشه (شماره دانشجویی یک شخص چندین بار تکرار میشه که  نقض کننده مفهوم کلید اصلی هست).
یا در جدول وام ها : آیا برای هر دانشجویی فقط یک وام ثبت میشه؟
جواب  نه هست. یک دانشجو میتونه چندین وام بگیره. بنابراین چون شماره دانشجویی  یک شخص در جدول وام (کلید خارجی) چندین بار میتونه تکرار بشه بنابراین  اینجا باز هم کلید خارجی نمیتونه کلید اصلی باشه.
فرض بگیرید (روی صحت جداول خیلی تمرکز نکنید) دو جدول تولد و مرگ داریم.
قطعا جدول مرگ وابسته به تولد هست چراکه باید چیزی باشه تا نابودی هم برای اون متصور شد.
اگر در جدول تولد کد اشخاص رو کلید اصلی در نظر بگیریم در جدول مرگ هم هر شخص فقط یکبار میتونه بمیره.
این  یعنی اینکه کد شخصی که در جدول مرگ میاد (کلید خارجی) برای هر شخص فقط  یکبار تکرار میشه که در چنین حالتی میشه کلید خارجی رو همون کلید اصلی در  نظر گرفت.
در کل چنین حالتی خیلی کم بوجود میاد چراکه اکثر رابطه ها یک به چند هست.
در این زمینه حتما کتاب مطالعه کنید. این بحث ها نکات بسیار زیادی دارند که نمیشه در یک تاپیک یا در یک یا چند ویدئو به اون پرداخت.

----------


## veniz2008

> ببخشید این پروژه ای که می نویسیم رو آخرش چه جوری باید روی سیستم دیگران منتقل کنیم ؟ 
> بعد ما sql سیستم خودمون رو توی کد ها نوشتیم server=....   توی سیستم دیگران کانکشن رو وقتی اینجوری بنویسیم مشکلی پیش نمیاد؟!


در مورد کانکشن بارها و بارها در سایت بحث شده. کاش اول جستجو میکردی دوست عزیز.
بیاید با کانکشن و server ( سرویس دهنده) منطقی برخورد کنیم. به نظرتون آیا روی یک سیستم دیگه سرویس دهنده ای به نام md2008 وجود داره؟ قطعا نه!.
باید نامی رو به عنوان instance در جلوی server بنویسیم که وجود خارجی داشته باشه.
چندین راه وجود داره :
یکی اینکه روی سیستم مشتری یک sqlexpress که ورژنش حداقل مساوی با ورژنی باشه که باهاش دیتابیس رو روی سیستم خودتون ساختید.
راه دوم اینه که برای  sql server ای که روی سیستم مشتری نصب میکنید یک instance خاص در نظر بگیرید. (مثل همون چیزی که روی سیستم خودتون دارید. مثلا من میتونم روی سیستم مقصد sql ای نصب کنم که نام instance اون md2008 باشه.در اینصورت برنامه بدرستی کار خواهد کرد که البته بسیار بدیهی هم هست).
راه بعدی اینه که همه instance های موجود بر روی سیستم مشتری رو با کدنویسی بدست بیارید و اونها رو یکی یکی تست کنید که کدوم instance جوابگو هست. این برای حالتی کاربرد داره که معمولا چند نسخه از sql server روی سیستم مقصد نصب هست و میخوایم ببینیم دیتابیس ما با کدوم instance کار میکنه.
نکته ای که در تمام این روش ها وجود داره اینه که ببینید دیتابیس شما روی کدوم instance نصب شده (Attach شده).
ساده ترین راه همون راه اول و استفاده از یک sqlexpress هست که در اینصورت کانکشن استرینگ رو میتونید بصورت زیر بنویسید:
server=.\\SQLEXPRESS;Database=univ;Integrated Security=True
یادتون نره کد بالا زمانی کار میکنه که دیتابیس روی سیستم مشتری Attach شده باشه. برای اتچ کردن دیتابیس هم روش های زیادی وجود داره. میتونی از اتچ خودکار استفاده کنی یا با دستورات sql دیتابیس رو اتچ کنید.
یک نمونه از اتچ خودکار و کانکشن استرینگ مربوطه بصورت زیر هست (باید دیتابیس رو در کنار فایل اجرایی برنامه در پوشه bin\debuge قرار بدید):
Data Source=(local)\\SQLEXPRESS;AttachDbFilename=|DataD  irectory|\MyDatabaseName.mdf;Integrated Security=True
در این باره خیلی بحث شده که با جستجو به نتیجه خواهید رسید.
موفق باشید.

----------


## veniz2008

> سلام 
> من ویدئوی شماره 1 رو دیدم خیلی خوب بود
> یک سوال دارم
> چرا بین جدول ها توی اس کیو ال سرور relatinship ایجاد نکردین ؟


سلام.
خوشحالم که ویدئو برای شما مفید بوده.
همونطور که در انتهای پست اول هم عرض کردم، در بعضی جاها ممکنه مطلبی در اون ویدئو (یا اون لحظه) فراموش بشه که یا در انتهای همون ویدئو یا در ابتدای ویدئوی بعدی اون مطلب گفته میشه.
حرف شما درباره برقراری ارتباط بین جداول صحیح هست. این کار در ابتدای ویدئوی دوم کامل توضیح داده میشه و ارتباط بین جداول رو در محیط sql برقرار می کنیم.
از توجه و نکته سنجی شما تشکر میکنم.
موفق باشید.

----------


## redflight

> در مورد کانکشن بارها و بارها در سایت بحث شده. کاش اول جستجو میکردی دوست عزیز.
> بیاید با کانکشن و server ( سرویس دهنده) منطقی برخورد کنیم. به نظرتون آیا روی یک سیستم دیگه سرویس دهنده ای به نام md2008 وجود داره؟ قطعا نه!.
> باید نامی رو به عنوان instance در جلوی server بنویسیم که وجود خارجی داشته باشه.
> چندین راه وجود داره :
> یکی اینکه روی سیستم مشتری یک sqlexpress که ورژنش حداقل مساوی با ورژنی باشه که باهاش دیتابیس رو روی سیستم خودتون ساختید.
> راه دوم اینه که برای  sql server ای که روی سیستم مشتری نصب میکنید یک instance خاص در نظر بگیرید. (مثل همون چیزی که روی سیستم خودتون دارید. مثلا من میتونم روی سیستم مقصد sql ای نصب کنم که نام instance اون md2008 باشه.در اینصورت برنامه بدرستی کار خواهد کرد که البته بسیار بدیهی هم هست).
> راه بعدی اینه که همه instance های موجود بر روی سیستم مشتری رو با کدنویسی بدست بیارید و اونها رو یکی یکی تست کنید که کدوم instance جوابگو هست. این برای حالتی کاربرد داره که معمولا چند نسخه از sql server روی سیستم مقصد نصب هست و میخوایم ببینیم دیتابیس ما با کدوم instance کار میکنه.
> نکته ای که در تمام این روش ها وجود داره اینه که ببینید دیتابیس شما روی کدوم instance نصب شده (Attach شده).
> ساده ترین راه همون راه اول و استفاده از یک sqlexpress هست که در اینصورت کانکشن استرینگ رو میتونید بصورت زیر بنویسید:
> ...


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

----------


## redflight

سلام
من یه نسخه از سی دی های آموزشی sql گرفتم توی اون گفته که نسخه   SQL Server EnterPrise Edition  این فقط روی ویندوز های سرور نصب می شه
ویندوز من سرور نیست پس چرا روی سیستم من نصب شده؟

----------


## veniz2008

> مرسی
> سوال من  این بود که اگه من برنامه رو بخوام به کسی بدم و ایشون DB نداشته باشه چی ؟  منظور من این بود


باید sql رو به هر طریقی که میتونید نصب کنید.
برای sql روی سیستم مشتری هم میتونید از sql express استفاده کنید و یا اینکه نسخه کامل رو نصب کنید (نسخه کامل برای یک سیستم تک کاربره معمولا نیاز نیست و همون express کفایت میکنه).
اینکه چطور sql رو نصب کنید روش های مختلفی داره. مثل ساخت فایل setup . یا نصب از راه دور یا اینکه شخصا در محل حاضر و اقدام به نصب کنید.




> سلام
> من یه نسخه از سی دی های آموزشی sql گرفتم توی اون گفته که نسخه   SQL Server EnterPrise Edition  این فقط روی ویندوز های سرور نصب می شه
> ویندوز من سرور نیست پس چرا روی سیستم من نصب شده؟


اینها رو ببینید :
https://barnamenevis.org/showthread.p...ght=Enterprise
و
http://stackoverflow.com/questions/1...006823#1006823

----------


## esafb52

به سلام به دوست و استاد عزیزم ونیز 2008
من قسمت نه رو تازه دیدم به نظرم اومد این قد اون حلقه های فور و وایل و اون ایف و الس ها و...زیادی شلوغ شده بود و فکر کنم مقداری بر پرفرمنس و کارایی برنامه زیاد جالب نباشه من خودم این قسمت رو با این صورت پیاده کردم 
ما یه دیتا تیبل داریم که سطرهایی رو برگشت داده که در یک گروپ ادی هستن حالا ما به ترتیب اون سطرها هم کاری نداریم که مثلا یکی ایدیش 2 باشه یا صد
مثلا ده سوال میخوایم به صورت تصادفی انتخاب کنیم یه متد رندوم مینویسیم و چون همیشه دیتا تیبل از سطر صفرم شروع میشه ورودی متد رندوممون رو پارامترش اولش رو صفر و پارامتر دوم تعداد سوال درخواستی منهای یک) تمام بعد چند تا تکس باکس و یک آرایه از جنس اینت تعریف میکنیم و مقادیر تصادفی رو که به سطرهای دیتا تیبل اشاره میکنن از اون میخونیم (سطر دلخواه رو از آرایه میخونیم که مقادیر تصادفی درش ذخیره شده)اگه خواستین در کد منظورم رو نشون میدم کدهام خیلی ساده تر میشه دلیل استفاده ازدستور سلکت با این رو هم متوجه نشدم؟؟؟

----------


## veniz2008

> به سلام به دوست و استاد عزیزم ونیز 2008
> من قسمت نه رو تازه دیدم به نظرم اومد این قد اون حلقه های فور و وایل و اون ایف و الس ها و...زیادی شلوغ شده بود و فکر کنم مقداری بر پرفرمنس و کارایی برنامه زیاد جالب نباشه من خودم این قسمت رو با این صورت پیاده کردم 
> ما یه دیتا تیبل داریم که سطرهایی رو برگشت داده که در یک گروپ ادی هستن حالا ما به ترتیب اون سطرها هم کاری نداریم که مثلا یکی ایدیش 2 باشه یا صد
> مثلا ده سوال میخوایم به صورت تصادفی انتخاب کنیم یه متد رندوم مینویسیم و چون همیشه دیتا تیبل از سطر صفرم شروع میشه ورودی متد رندوممون رو پارامترش اولش رو صفر و پارامتر دوم تعداد سوال درخواستی منهای یک) تمام بعد چند تا تکس باکس و یک آرایه از جنس اینت تعریف میکنیم و مقادیر تصادفی رو که به سطرهای دیتا تیبل اشاره میکنن از اون میخونیم (سطر دلخواه رو از آرایه میخونیم که مقادیر تصادفی درش ذخیره شده)اگه خواستین در کد منظورم رو نشون میدم کدهام خیلی ساده تر میشه دلیل استفاده ازدستور سلکت با این رو هم متوجه نشدم؟؟؟


سلام دوست من.
اختیار دارید ما هنوز شاگردیم و داریم یاد می گیریم.
قصد داشتم تا گذاشتن ویدئوی دهم سکوت کنم و چیزی نگم (محتوای پروژه لو نره  :لبخند گشاده!:  ) به همین خاطر اونجا که ویدئو نهم رو گذاشتم گفتم توجه مهم.
حرف شما کاملا درسته که این روش روش بهینه ای نیست مخصوصا زمانیکه تعداد سوالات زیاد میشه.به همین خاطر هست که در ویدئوی دهم یک روش فوق العاده سریع و بهینه رو معرفی میکنم و هدفم این هست که دوستان فرق بین یک راه غیر بهینه و یک راه بهینه و کارآمد رو کاملا لمس کنن. چراکه تا چیزی به عینه مشاهده نشه آدم نمیتونه کاملا اونو لمس و درک کنه.
اما در مورد روش شما :
مقادیر تصادفی که در آرایه ذخیره میشه مهم هست. مشکلی که این روش داره و دلیل اصلی کند شدن هم هست فقط یه چیز هست : تابع رندوم در هر مرحله عددی رو تولید میکنه که ممکنه در مرحله قبلی اون عدد تولید شده باشه. زمانیکه تعداد سوالات زیاد میشه احتمال و درصد تولید این عدد تکراری زیاد میشه که باعث کاهش performance میشه.
در مورد select IN که پرسیدید بخاطر این هست که id هایی که از حلقه بدست اومده رو از جدول بکشه بیرون. البته راه ساده تری هم وجود داشت و اون هم فیلتر کردن همون دیتاتیبلی هست که کل سوالات داخلش وجود داره ولی قصدم این بود که دوستان با دستور IN هم آشنا بشن.
خوشحال میشم کدها و روشتون رو بصورت کامل بگید تا بهتر بشه دربارش بحث کنیم.

----------


## esafb52

من ابتدا از این کلاس رندوم استفاده کردم
 public static class RndomNumber
    {
        //کلاس اعداد رندوم
        public static int[] GetRandomIndex(int MinValue, int MaxValue)
        {
            List<int> RtnList = new List<int>();
            Random R = new Random();
            int Cnt = 0;
            while (Cnt < MaxValue - MinValue + 1)
            {
                int r = R.Next(MinValue - 1, MaxValue + 1);
                if (BetWeen(r, MinValue, MaxValue) && !RtnList.Contains(r))
                {
                    RtnList.Add(r);
                    Cnt++;
                }
            }
            return RtnList.ToArray();
        }
        public static bool BetWeen(object MainValue, object Value1, object Value2)
        {
            decimal TmpMainValue = Convert.ToDecimal(MainValue);
            decimal TmpValue1 = Convert.ToDecimal(Value1);
            decimal TmpValue2 = Convert.ToDecimal(Value2);
            return (TmpValue1 <= TmpMainValue && TmpMainValue <= TmpValue2);
        }



    }
و بعد این طوری ازش استفاده کردم
 //برای دریافت تعداد سوالات و شروع آزمون 
        private void btnShowQestions_Click(object sender, EventArgs e)
        {
            if (string.IsNullOrEmpty(textBox1.Text))
            {
                errorProvider1.SetError(textBox1, "لطفا تعداد سوالات رو وارد نمایید");
                return;
            }
            errorProvider1.Clear();
            int a = Convert.ToInt32(comboBox1.SelectedValue.ToString()  );
            Qcount = Convert.ToInt32(textBox1.Text);
            if (db.QuestionCount(a, Qcount, out dt))
            {
                randomQuestion = RndomNumber.GetRandomIndex(0, Qcount - 1);
                timer1.Enabled = true;
                textBox2.Text = dt.Rows[randomQuestion[0]][1].ToString();
                textBox3.Text = dt.Rows[randomQuestion[0]][2].ToString();
                textBox4.Text = dt.Rows[randomQuestion[0]][3].ToString();
                textBox5.Text = dt.Rows[randomQuestion[0]][4].ToString();
                textBox6.Text = dt.Rows[randomQuestion[0]][5].ToString();
                btnShowQestions.Enabled = false;
            }
            else
            {
                MessageBox.Show("این تعداد سوال وجود در این گروه موجود نمی باشد!!");
            }
        }

و برای رفتن به سوالات بعدی هم
 //...برای رفتن به سوال بعدی که البته هنوز به طور کامل پیاده سازیش نکردم مثلا جواب رو نگرفتم و....
        private void btnnextQuestion_Click(object sender, EventArgs e)
        {
            textBox2.Text = dt.Rows[randomQuestion[randomQuestionindex]][1].ToString();
            textBox3.Text = dt.Rows[randomQuestion[randomQuestionindex]][2].ToString();
            textBox4.Text = dt.Rows[randomQuestion[randomQuestionindex]][3].ToString();
            textBox5.Text = dt.Rows[randomQuestion[randomQuestionindex]][4].ToString();
            textBox6.Text = dt.Rows[randomQuestion[randomQuestionindex]][5].ToString();
            //به علت اینکه محتوای آرایهrandomQuestion به صورت رندم هست کافیست تا فقط بین عناصر اون حرکت کنیم 
            randomQuestionindex++;
            if (randomQuestionindex > Qcount)
            {
                MessageBox.Show("اتمام آزمون");
                //نمایش نتایج و انام کارهای دلخواه
            }
        }
یعنی کد فرمم این طوری هست
using System;
using System.Data;
using System.Windows.Forms;

namespace MYAZMOON
{
    public partial class FrmRunExam : Form
    {
        private readonly bal db = new bal();
        private int Qcount;
        private DataTable dt = new DataTable();
        private int m;
        private int[] randomQuestion;
        private int randomQuestionindex = 1;
        private int s;

        public FrmRunExam()
        {
            InitializeComponent();
        }

        private void FrmRunExam_Load(object sender, EventArgs e)
        {
            DataTable dataTable = db.loadqusetiongroup();
            comboBox1.DataSource = dataTable;
            comboBox1.DisplayMember = "GROUPNAME";
            comboBox1.ValueMember = "GROUPID";
        }

        //برای دریافت تعداد سوالات و شروع آزمون 
        private void btnShowQestions_Click(object sender, EventArgs e)
        {
            if (string.IsNullOrEmpty(textBox1.Text))
            {
                errorProvider1.SetError(textBox1, "لطفا تعداد سوالات رو وارد نمایید");
                return;
            }
            errorProvider1.Clear();
            int a = Convert.ToInt32(comboBox1.SelectedValue.ToString()  );
            Qcount = Convert.ToInt32(textBox1.Text) ;
            if (db.QuestionCount(a, Qcount- 1, out dt))
            {
                //منظور از صفر در اینجا سطر اول دیتا تیبل هست که با صفرشروع میشه
                randomQuestion = RndomNumber.GetRandomIndex(0, Qcount);
                timer1.Enabled = true;
                textBox2.Text = dt.Rows[randomQuestion[0]][1].ToString();
                textBox3.Text = dt.Rows[randomQuestion[0]][2].ToString();
                textBox4.Text = dt.Rows[randomQuestion[0]][3].ToString();
                textBox5.Text = dt.Rows[randomQuestion[0]][4].ToString();
                textBox6.Text = dt.Rows[randomQuestion[0]][5].ToString();
                btnShowQestions.Enabled = false;
            }
            else
            {
                MessageBox.Show("این تعداد سوال وجود در این گروه موجود نمی باشد!!");
            }
        }

        //برای گرفتن نتیجه آزمون
        public int chekresult()
        {
            int result = 0;
            if (radioButton1.Checked)
            {
                result = 1;
            }
            else if (radioButton2.Checked)
            {
                result = 2;
            }
            else if (radioButton3.Checked)
            {
                result = 3;
            }
            else if (radioButton4.Checked)
            {
                result = 4;
            }
            else
            {
                result = 0;
            }
            return result;
        }

        //...برای رفتن به سوال بعدی که البته هنوز به طور کامل پیاده سازیش نکردم مثلا جواب رو نگرفتم و....
        private void btnnextQuestion_Click(object sender, EventArgs e)
        {
            textBox2.Text = dt.Rows[randomQuestion[randomQuestionindex]][1].ToString();
            textBox3.Text = dt.Rows[randomQuestion[randomQuestionindex]][2].ToString();
            textBox4.Text = dt.Rows[randomQuestion[randomQuestionindex]][3].ToString();
            textBox5.Text = dt.Rows[randomQuestion[randomQuestionindex]][4].ToString();
            textBox6.Text = dt.Rows[randomQuestion[randomQuestionindex]][5].ToString();
            //به علت اینکه محتوای آرایهrandomQuestion به صورت رندم هست کافیست تا فقط بین عناصر اون حرکت کنیم 
            randomQuestionindex++;
            if (randomQuestionindex > Qcount)
            {
                MessageBox.Show("اتمام آزمون");
                //نمایش نتایج و انام کارهای دلخواه
            }
        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            //برای زمان ده دقیقه ای آزمون
            s = Convert.ToInt32(label4.Text);
            m = Convert.ToInt32(label5.Text);
            if (m != 10)
            {
                s++;
                if (s == 60)
                {
                    s = 0;
                    m++;
                    label5.Text = m.ToString("00");
                }
                label4.Text = s.ToString("00");
            }
            else
            {
                timer1.Stop();
                MessageBox.Show("time end");
                MessageBox.Show("اتمام آزمون");
            }
        }
    }
}

----------


## veniz2008

فعلا فقط متدی که باهاش اعداد تصادفی تولید میکردید رو دیدم.
روش جالب و خوبی بود ولی بازم 100 درضد بهینه نیست چون متد رندوم در هر مرحله اعدادی رو تولید میکنه که احتمال داره قبلا تولید شده باشه به همین خاطر هست که با RtnList مقایسه میشه که آیا قبلا در لیست وارد شده یا نه. ولی میشد کوتاه ترش هم کرد و شرط هاش رو کمتر کرد و همچنین نیازی به متد Between هم نیست چون عدد تولید شده در متد رندوم خارج از محدوده ای که بهش میدیم نیست.
در متد next متوجه نشدم چرا minvalue رو منهای 1 کرده بودی.
public static int[] GetRandomIndex(int MinValue, int MaxValue)
        {
            List<int> RtnList = new List<int>();
            Random R = new Random();
            int Cnt = 0;
            while (Cnt < MaxValue - MinValue + 1)
            {
                int r = R.Next(MinValue , MaxValue + 1);
                if (!RtnList.Contains(r))
                {
                    RtnList.Add(r);
                    Cnt++;
                }
            }
            return RtnList.ToArray();
        }

----------


## veniz2008

> باسلام
> اگر محتویات یک جدول از یه بانک مثلا 5000 رکورد باشه ایا هنگام بازکردن یه فرم که با یه گرید نشون داده خواهد شد تاخیر زمانی زیادی خواهد داشت ؟


سلام.
در مورد تاخیر (یا کند شدن برنامه) بستگی به میزان رم سیستم و حجم داده های لود شده داره. ممکنه هر رکورد شامل 4 یا 5 فیلد ساده باشه یا نه ممکنه شامل فیلدهای با حجم بالا مثل عکس های با کیفیت بالا باشه (خود عکس ذخیره شده باشه نه آدرسش).
اما نکته ای که وجود داره اینه که لود کردن یکباره 5000 رکورد و نمایش اون در گرید عملا برای مخاطب فایده و کاربردی نداره. بهترین راه اینه که برای جلوگیری از کند شدن برنامه در چنین حالاتی از صفحه بندی کردن گرید (paging) استفاده کنید و در هر بار مثلا 30 تا رکورد رو به مخاطب نمایش بدید و با زدن دکمه "بعدی" 30 رکورد بعدی رو بهش نمایش بدید. قبلا در سایت در این باره خیلی بحث شده و نمونه برنامه هایی هم قرار داده شده که با جستجو می تونید اونها رو پیدا کنید.
موفق باشید.

----------


## veniz2008

> سلام دوست عزیز
> با تشکر از آموزش خوبتون
> ممنون می شم پشنیبانگیری وبازیابی را تو پروژه بزارید 
> تحت شبکه توضیح بدید ممنون می شم.


سلام دوست عزیز.
بهتر بود درخواست تون رو بصورت پیغام خصوصی مطرح می کردید.
عملیات های Backup و Restore در ویدئوهای بعدی بصورت کامل قرار می گیرن.
در مورد شبکه کردن نرم افزار (یا به بیان بهتر شبکه کردن دیتابیس) هم در انتهای مجموعه آموزشی بصورت کامل توضیح داده خواهد شد.
موفق باشید.

----------


## veniz2008

> با سلام مجدد به  دوست و استاد عزیز veniz 2008 و تشکر از آموزش های خوبشون
> من چندی وقتی درگیر بودم و کمتر سر میزدم ولی امروز قسمت دهم و یازدهم ویدیو رو به دقت تماشا کردم خصوصا قسمت مربوط به دستور newid() خیلی برام جالب بود و همون طور که تو فیلم هم گفتین ماباید sql و دستوراتش رو جدی تر بگیریم راستش من قبلا تصور این بود که فقط همون چهارتا دستور اصلی sql + بکاپ و ریستور رو یادبرگیریم کافیه حالا بقول خیام میبینم که ما هنوز اندر خم یک کوچه ایم ممنون ام 
> 
> موفق باشید


سلام دوست من.
من قبلا (حدود 14 ماه پیش) یک فایل حاوی دستورات SQL رو در اختیار دوستان قرار داده بودم. این فایل pdf از نظر روانی متن و شیوایی واقعا عالی ترجمه شده. احتمال خیلی زیاد بسیاری از دوستان از وجود چنین فایل آموزشی بی خبر باشند!. 
این فایل pdf بسیاری از دستورات مربوط به محیط SQL رو به زبان خیلی ساده و روان و همراه با ذکر مثال های فراوان ذکر کرده.
خوبی این فایل اینه که بسیاری از دستورات SQL رو در یک فایل با ذکر مثال های متعدد در اختیار خواهید داشت.
به همه دوستان توصیه میکنم حتما این فایل آموزشی رو نگاه کنن.
https://barnamenevis.org/showthread.p...B%8C%D8%AF-%29

----------


## veniz2008

> یک چیز رو یادم رفت بگم به نظر من پر کردن لیست باکس با اون صفر در اون حلقه فور  لازم نیس ما حین رفتن به هر سوال میتونیم جواب رو در لیست باکس درج و در انتها مقایسه انجام بدیم !!اگر دلایل بیشتری وجود داره ممنون میشم بگین


وجود اون حلقه لازم هست.
فرض بگیرید کاربر 2 سوال رو با محدودیت زمانی انتخاب میکنه ولی بعد از نمایش سوالات به هیچ سوالی پاسخ نمیده تا زمانش به اتمام برسه. در این حالت موقع چک کردن جواب سوالات از خط زیر خطا میگیره که چنین آیتمی درون لیست باکس وجود نداره (چنین ایندکسی وجود نداره).
if (Convert.ToInt32(mylistanswer.Items[i]) == Convert.ToInt32(dt.Rows[i]["Answer"].ToString()))
                    {
                        sahih++;
                    }

عکس خطا :

error azmoon.JPG

----------


## veniz2008

> خب با روشی که مد نظرم هست یه متد مینویسم و اگر جواب نداد 0درج میکنیم در انتها هم با یه ifچک میکنیم و بعد تبدیل میکنیم راستی چرا از لیست ها استفاده نکردین منظورم جنریک هاست یا حتی یه ارایه ؟ بجای لیست باکس


 من روش شما رو نمیدونم چی هست.
من طبق  کدهای پروژه خودمون مطلب رو توضیح دادم.
برای این کار ضرورتی به استفاده از آرایه و ... ندیدم.
موفق باشید.

----------


## esafb52

با سلام و تشکر از آموزش های خوبتون راستش من قسمت بکاپ رو دیدم والبته  این روش رو برای اولین بار هم میدیدم

  cmd.BeginExecuteNonQuery()
  cmd.EndExecuteNonQuery()

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

 this.BeginInvoke((MethodInvoker) delegate()
            {
                progressBar1.Value = 0;

            });
            cmd.Dispose();

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

----------


## veniz2008

> با سلام و تشکر از آموزش های خوبتون راستش من قسمت بکاپ رو دیدم والبته  این روش رو برای اولین بار هم میدیدم
> 
>   cmd.BeginExecuteNonQuery()
>   cmd.EndExecuteNonQuery()
> 
>   ولی نمیدونم چرا از sp  ها در اکسپرس نمیتونم حین بکاپ استفاده کنم وخطا میده (مثلا این دستور وجود نداره و...)ولی از دستوراتی کامندتکس معمولی راحت استفاده میکنم در ضمن این متد هم جالب بود
> 
>  this.BeginInvoke((MethodInvoker) delegate()
>             {
> ...


 قبل از اینکه به سوال شما بپردازم قصد دارم یه کم درد دل کنم.
ببیند من الان حدود 36 ساعت هست که ویدئوی دوازدهم رو آپلود کردم ولی متاسفانه هنوز تاپیک باز نشده که پستم رو بذارم. روی سخن من و انتقاد من به مدیران بخش نیست اتفاقا جا داره از زحمات بسیار زیاد دوست عزیزم جناب صفا بسیار تشکر کنم که انصافا همکاری بسیار خوبی رو با من داشتن.
روی سخن من با بعضی از کاربران سایت هست. اگر شعور و درک بعضی از این دوستان اونقدر پایین نبود که هر جایی بی جهت پست بذارن و بیهوده تاپیک رو منحرف کنن مطمئن باشید من هیچوقت تصمیم نمی گرفتم که تاپیک ویدئوها رو بعد از قرار دادن هر ویدئو قفل کنم. متاسفانه بعضی ها انگار نمیخوان بزرگ بشن و به مانند یک فرد فهمیده تو این جامعه زندگی کنن.
چه کسی ضرر میکنه؟ چند نفر بی توجهی و بی انضباطی میکنن ولی خیلی ها متضرر میشن.
ویدئویی که باید 36 ساعت قبل در اختیار دوستان قرار میگرفته به ناچار باید منتظر موند تا تاپیک باز بشه تا پست جدید قرار بگیره.
به نظرتون جای تاسف نداره؟
به خدا باید گریه کرد به وضعیت فهم و شعور بعضی از این مردم توی این مملکت.
دوست عزیزم جناب esafb52 :
کاش متن خطا (و چه بهتر که یک عکس از خطا) بذارید تا بهتر متوجه منظورتون بشم تا بهتر بشه بررسی رو انجام داد.
آیا خطایی که گفتید فقط در مورد sp مربوط به backup هست؟ یا برای همه sp ها؟
در مورد progressbar هم بله میتونه امکان خوبی باشه. خیلی از موارد رو میشه به قسمت های مختلف اضافه کرد ولی چون وقت ویدئوها محدود هست در هر فرمی و برای هر عملیاتی معمولا چارچوب اصلی کار توضیح داده میشه و از کارهای جانبی و تزئینی معمولا اجتناب کردم که دوستان میتونن خودشون این موارد رو به پروژه هاشون اضافه کنن.

----------


## esafb52

با سلام مثلا این کد جواب میده 
 SqlCommand cmd = new SqlCommand();
            string connection = @"Data Source=.\SQLEXPRESS;AttachDbFilename=" + Application.StartupPath +
                                "\\DBAZMOON.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True";
            cmd.Connection = new SqlConnection(connection);
            cmd.Connection.Open();
            string dbname = cmd.Connection.Database;
            cmd.Connection.Close();
            SqlConnection.ClearAllPools();
            string query = "BACKUP DATABASE [" + dbname + "] TO DISK ='" + saveFileDialog.FileName + "'";
            cmd.Connection = new SqlConnection(
                "Data Source=.\\sqlexpress;Integrated Security=True;Connect Timeout=30;User Instance=True");
            cmd.Connection.Open();
            cmd.CommandText = query;
            cmd.ExecuteNonQuery();
            cmd.Connection.Close();
ولی برای sp کد بعدی خطا عدم وجود این sp رو میده
 string connection = @"Data Source=.\SQLEXPRESS;AttachDbFilename=" + Application.StartupPath +
                            "\\DBAZMOON.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True";
                SqlConnection con = new SqlConnection(connection);
                SqlCommand cmd = new SqlCommand();
                cmd.Connection = con;
                cmd.Connection.Open();
                string db = cmd.Connection.Database;
cmd.Connection.Close();
                SqlConnection.ClearAllPools();
                cmd.Connection = new SqlConnection(
                   "Data Source=.\\sqlexpress;Integrated Security=True;Connect Timeout=30;User Instance=True");
                cmd.CommandText = "myBACKUP";
                cmd.CommandType = CommandType.StoredProcedure;
                cmd.Parameters.AddWithValue("@path", txtpath.Text + ".bak");
                cmd.Connection.Open();
                cmd.ExecuteNonQuery();
                cmd.Connection.Close();
                MessageBox.Show("نسخه پشتيبان به طور كامل ايجاد شد ", "پيام", MessageBoxButtons.OK,
                                MessageBoxIcon.Information);

----------


## veniz2008

> با سلام مثلا این کد جواب میده 
>  SqlCommand cmd = new SqlCommand();
>             string connection = @"Data Source=.\SQLEXPRESS;AttachDbFilename=" + Application.StartupPath +
>                                 "\\DBAZMOON.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True";
>             cmd.Connection = new SqlConnection(connection);
>             cmd.Connection.Open();
>             string dbname = cmd.Connection.Database;
>             cmd.Connection.Close();
>             SqlConnection.ClearAllPools();
> ...


 با بقیه sp ها هم همین مشکل رو داری؟ مثلا با sp مربوط به select یا insert هم همین مشکل رو داری؟
لطف کن یه عکس از خطا بگیر و بذار.
راستی کدنویسی رو خیلی سخت کردی!. راحت تر کد بزن دوست من.

----------


## esafb52

نه متاسفانه همین الان از دریا امدم و خسته هستم فردا سعی میکنم عکس هم بذارم ولی نه فقط برای همین بکاپ خطا میده ایا اصلا روند کلی درست هست کد بالا برای  اون حالت اول درست جواب میده ولی حالت دوم نه دیتابیس 2008اکسپرس هستش

----------


## veniz2008

خسته نباشی.
اول تست کن ببین واقعا چنین sp رو با sqlexpress بهش دسترسی داری یا نه. برای این منظور با sqlexpress این select رو بزن و نتیجه sp های برگشتی رو بررسی کن ببینم اصلا اون sp وجود داره یا نه :

select * from DBAzmoon.information_schema.routines 
 where routine_type = 'PROCEDURE'

----------


## esafb52

با سلام بله تمام استور پروسجورها رو برگشت داد ولی من اون رو از داخل منجمنت استدیو اجرا کردم این هم عکس خطا
33.jpg
11.jpg

----------


## veniz2008

> بله تمام استور پروسجورها رو برگشت داد ولی من اون رو از داخل منجمنت استدیو اجرا کردم


 ببینید وقتی به management studio ورود می کنید با چه server name ای ورود می کنید؟ (عکس رو بیین) :
mssql.JPG

در این عکس من دارم با sqlexpress ورود می کنم نه با server name اصلی برنامم.
طبیعی هست که اگر با server name اصلی ورود کنم لیست همه sp ها رو به من برگشت میده.
یا با express ورود کن و اون select رو اجرا کن یا کلا از کدنویسی استفاده کن :
sp :
create proc SelectAllStoredProcedure
AS
select * from DBAzmoon.information_schema.routines
where routine_type = 'PROCEDURE'
درون ویژوال :
SqlConnection con = new SqlConnection("server = .\\SQLEXPRESS;DataBase = DBAzmoon;Integrated Security = True");
SqlDataAdapter da = new SqlDataAdapter("SelectAllStoredProcedure", con);
da.SelectCommand.CommandType = CommandType.StoredProcedure;
dt = new DataTable();
da.Fill(dt);
GrdAllSp.DataSource = dt;
توجه داشته باش که این sp رو در express ایجاد کنی چراکه server شما در کانکشن استرینگ نسخه express هست که بایستی به این sp دسترسی داشته باشه تا بتونه اونو اجرا کنه.

----------


## esafb52

با سلام منم دقیقا مثلا شما اجرا کردم ولی خطا میداد چطور برای بقیه spها خطا نداد بهم فقط برای همین خطا میده!!!!!!!
این هم عکس اگر امکانش هست شما نحوه پیاده سازی کد بکاپ رو سمت سی شارپ یه مثال ساده بزنین با فرض دیتابیس اکسپرس
222222222.jpg

----------


## veniz2008

> با سلام منم دقیقا مثلا شما اجرا کردم ولی خطا میداد چطور برای بقیه spها خطا نداد بهم فقط برای همین خطا میده!!!!!!!
> این هم عکس اگر امکانش هست شما نحوه پیاده سازی کد بکاپ رو سمت سی شارپ یه مثال ساده بزنین با فرض دیتابیس اکسپرس
> 222222222.jpg


ببینید فرقی نداره.
اکسپرس هم مثل نسخه کامل یک موتور (engin) هست با یکسری محدودیت ها.
قرار نیست کار خاصی کنیم یا اینکه کد جدیدی بنویسیم. کدها همون ها هستن فقط سرویس دهنده ما (server) تبدیل به sqlexpress شده. همین.
کد رو که قرار دادم براتون.
شما گفتید که با express میتونید بقیه sp ها رو اجرا کنید. حالا با همین اکسپرس لیست همه sp ها رو بگیرید (فرض کنید دارید یک sp مربوط به select رو اجرا می کنید). نتیجه رو ببینید آیا اون sp وجود داره یا نه.
من احساس میکنم شما اون sp مربوط به بک اپ رو به جمع sp هایی که در اکسپرس هست اضافه نکردید یا نام sp رو در نوشتن دقت نکردید!
من تا حالا چنین موردی رو نداشتم که همه sp ها رو بشناسه ولی یک sp رو نشناسه.

----------


## esafb52

من کلا با بکاپ و ریستور با Sp  مشکل دارم 
متن خطا :
////////
---------------------------

---------------------------
User does not have permission to alter database 'DBAZMOON', the database does not exist, or the database is not in a state that allows access checks.

ALTER DATABASE statement failed.

The file 'D:\MY AZMOON\MYAZMOON\MYAZMOON\bin\Debug\DBAZMOON.mdf' cannot be overwritten.  It is being used by database 'D:\MY AZMOON\MYAZMOON\MYAZMOON\BIN\DEBUG\DBAZMOON.MDF'.

File 'DBAZMOON' cannot be restored to 'D:\MY AZMOON\MYAZMOON\MYAZMOON\bin\Debug\DBAZMOON.mdf'. Use WITH MOVE to identify a valid location for the file.

The file 'D:\MY AZMOON\MYAZMOON\MYAZMOON\bin\Debug\DBAZMOON_log.ld  f' cannot be overwritten.  It is being used by database 'D:\MY AZMOON\MYAZMOON\MYAZMOON\BIN\DEBUG\DBAZMOON.MDF'.

File 'DBAZMOON_log' cannot be restored to 'D:\MY AZMOON\MYAZMOON\MYAZMOON\bin\Debug\DBAZMOON_log.ld  f'. Use WITH MOVE to identify a valid location for the file.

Problems were identified while planning for the RESTORE statement. Previous messages provide details.

RESTORE DATABASE is terminating abnormally.

User does not have permission to alter database 'DBAZMOON', the database does not exist, or the database is not in a state that allows access checks.

ALTER DATABASE statement failed.
---------------------------
OK   
---------------------------

/////////

این کد sp ریستور 

ALTER PROC RESTOREDB
@PATH NVARCHAR(400)
AS
ALTER DATABASE DBAZMOON SET OFFLINE WITH ROLLBACK IMMEDIATE
RESTORE DATABASE DBAZMOON FROM DISK=@PATH WITH REPLACE    
ALTER DATABASE DBAZMOON SET ONLINE
RETURN

این هم کد سمت سی شارپ

 try
            {
                SqlConnection connection = new SqlConnection(@"Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirector  y|\DBAZMOON.mdf;Integrated Security=True;User Instance=True");
                SqlCommand cmd = new SqlCommand("RESTOREDB", connection);
                cmd.CommandType = CommandType.StoredProcedure;
                cmd.Parameters.AddWithValue("@PATH", path);
                connection.Open();
                cmd.ExecuteNonQuery();
                connection.Close();
                MessageBox.Show("restore Test ok");
            }
            catch (SqlException ex)
            {

                MessageBox.Show(ex.Message);
            }

و  دیتابیس رو هم ضمیمه کردم
اگه امکان داره یه نمونه ساده بذارین که منم کدهای شما رو تست کنم
ممنون

----------


## veniz2008

> User does not have permission to alter  database 'DBAZMOON', the database does not exist, or the database is not  in a state that allows access checks.


من 2 حالت مختلف رو برای این خطا در نظر می گیرم. ابتدا احتمال اول رو مطرح میکنم اگر این مورد رو رعایت کردید بگید تا در مورد احتمال دوم هم صحبت کنیم.
الف)  شما دیتابیس رو به SQL Express اضافه نکردید به همین خاطر هست که زمانیکه  کانکشن استرینگ و server رو بر روی sqlexpress تنظیم می کنید خطای وجود  نداشتن دیتابیس رو صادر میکنه.

t1.JPG

اضافه کردن یک دیتابیس به SQL Express و مشاهده جدول (ها) (همان دیتابیسی که قصد بک آپ و ری استور را از آن داریم)
t2.JPG

نمایی از پروسیجرهای Backup & Restore :

t4.JPG

پیغام موفقیت آمیز بودن عملیات بک آپ با استفاده از کانکشن استرینگی که server آن SQLExpress می باشد :
t5.JPG

آیا شما دیتابیس DBAzmoon رو به SQL Express وارد کردید؟

----------


## bitcob589

در زمان استفاده از کد زیر خطا نمایش داده می شود
((DataRowView)comgroup.SelectedItem)["id"]

خطای زیر نمایش داده می شود



> Unable to cast object of type 'myazmoon.TBLGROUP' to type 'System.Data.DataRowView'.


علت خطا چیست

----------


## veniz2008

> در زمان استفاده از کد زیر خطا نمایش داده می شود
> ((DataRowView)comgroup.SelectedItem)["id"]
> 
> خطای زیر نمایش داده می شود
> 
> 
> علت خطا چیست


چیزی که مشخص هست برنامه قادر به تبدیل کردن آیتم انتخاب شده به جنس datarowview نیست.
کدی که در اون خطا رخ میده رو بصورت کامل قرار بدید.
همچنین کدی رو که باهاش کمبو رو پر می کنید قرار بدید.

----------


## negar.rafie

میشه سورس پروژه را هم بزارید

----------


## esafb52

با سلام و تشکر از جناب ونیز 2088 بابت آموزش خوب و جواب های سریع و مناسبشون
امروز یکم وقت بیشتری داشتم و نشستم ببینم مشکل از کجاس 
چون تعجب میکردم که چطور تمام sp ها اجرا میشدن ولی این یکی نه !!!!!!!!
تازه متوجه یک نکته شدم  من کانکشن استرینگ از نوع اتچ خودکار بود یعنی اینطوری:
SqlCommand cmd = new SqlCommand();
           string connection = @"Data Source=.\SQLEXPRESS;AttachDbFilename=" + Application.StartupPath +
                               "\\DBAZMOON.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True";

با این حالت تمام sp  جز بکاپ و ریستور درست اجرا میشدن
وقتی کانکشن استرینگ اینو رو تبدیل به این کردم درست نمیشد
public SqlConnection con = new SqlConnection
            (@"Data Source=.\SQLEXPRESS;Initial Catalog=DBAZMOON;Integrated Security=True");
بعد دیتابیس رو هم در سرور sql اتچ کردم درست شد ولی یک نکته داشت دیتابیس باید به صورت بقیه دیتابیس ها لیست میشد یعنی آدرس محل قرار گرفتنش تو لیست نمایش داده نمیشد هر وقت نشون میداد مثلا درایو d و پوشه فلان /...... درست نمیشد ولی وقتی که فقط اسمش بود(مسیرش ذکر نمیشد) درست شد و sp بکاپ و ریستور هم به درستی اجرا شدن !!!!حالا یک سوال مطرح میشه اگه بخوام کانکشن استرینگ رو به صورت اولی ست کنم که خودش اتچش کنه باید در sp  چه تغییری بدم تا مثل بقیه اجرا بشه
ممنون

----------


## veniz2008

> میشه سورس پروژه را هم بزارید


 دلیل اینکه سورس رو نذاشتم این هست که برای دوستان مبتدی بسیار محتمل هست که به جای تایپ کدها دست به copy & paste بزنند. در این حالت محاله که شخصی بتونه مسلط بشه.
هدف این هست که دوستان بعد از مشاهده ویدئوها، با توجه به درکی که از کدها پیدا میکنن شخصا اقدام به تایپ کدها کنن چراکه زمانیکه یک دستور رو متوجه میشیم و بعد اونو در طول پروژه چندین بار تایپ می کنیم به اون کدها مسلط می شیم.



> تازه متوجه یک نکته شدم  من کانکشن استرینگ از نوع اتچ خودکار بود یعنی اینطوری:
> SqlCommand cmd = new SqlCommand();
>            string connection = @"Data Source=.\SQLEXPRESS;AttachDbFilename=" + Application.StartupPath +
>                                "\\DBAZMOON.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True";
> 
> با این حالت تمام sp  جز بکاپ و ریستور درست اجرا میشدن
> وقتی کانکشن استرینگ اینو رو تبدیل به این کردم درست نمیشد
> public SqlConnection con = new SqlConnection
>             (@"Data Source=.\SQLEXPRESS;Initial Catalog=DBAZMOON;Integrated Security=True");
> بعد دیتابیس رو هم در سرور sql اتچ کردم درست شد ولی یک نکته داشت دیتابیس باید به صورت بقیه دیتابیس ها لیست میشد یعنی آدرس محل قرار گرفتنش تو لیست نمایش داده نمیشد هر وقت نشون میداد مثلا درایو d و پوشه فلان /...... درست نمیشد ولی وقتی که فقط اسمش بود(مسیرش ذکر نمیشد) درست شد و sp بکاپ و ریستور هم به درستی اجرا شدن !!!!حالا یک سوال مطرح میشه اگه بخوام کانکشن استرینگ رو به صورت اولی ست کنم که خودش اتچش کنه باید در sp  چه تغییری بدم تا مثل بقیه اجرا بشه


یکی از مواردی که شخصا بدم از اتچ خودکار میاد همین تغییر نام دادن دیتابیس بعد از اتچ کردن هست که در مواردی مثل Backup و Restore و کلا هر کوئری که در اون نام دیتابیس رو ذکر می کنید به مشکل بر میخورید. دلیلش رو در ادامه بصورت کامل توضیح میدم.
زمانیکه قصد استفاده از یک دیتابیس رو داریم در حقیقت داریم اون دیتابیس رو Use می کنیم (این کار در حالت عادی بصورت اتومات انجام میشه و نیازی به نوشتن کدی توسط کاربر نیست).
در شکل زیر sp مربوط به Backup رو قبل از اتج خودکار مشاهده می کنید. به خط اول اون خوب دقت کنید . همونطور که مشاهده می فرمایید نام دیتابیسی که use (استفاده) شده بصورت ساده و بدون ذکر مسیر هست.

before attach.JPG

همونطور که خودتون هم میدونید زماینکه یک دیتابیس رو بصورت اتچ خودکار در میاریم، بعد از اتچ شدن، نام دیتابیس به همراه مسیر کامل اون دیتابیس رو خواهیم داشت. نکته کلیدی همین جاست. در این حالت اولا : دیتابیسی که use میشه دیگه نام ساده دیتابیس نیست بلکه مسیر کامل به همراه نام دیتابیس با پسوند mdf خواهد بود. این کار بصورت اتوماتیک توسط sql انجام میشه و شما نیاز به انجام هیچ کاری ندارید. 
ثانیا : هر جایی که در کوئری ها، قرار هست نام دیتابیس ذکر بشه دیگه نباید نام ساده دیتابیس رو ذکر کرد بلکه بایستی مسیر کامل + نام دیتابیس به همراه پسوند mdf رو درون *یک قلاب* ذکر کنید.  عکس زیر رو با عکس قبلی مقایسه کنید. همونطور که در عکس هم ملاحظه می کنید در دستور backup مسیر کامل به همراه نام دیتابیس و پسوند فایل (mdf) درون قلاب قرار گرفته.

spbackup.JPG

در نهایت در تصویر زیر می تونید نتیجه کار را مشاهده کنید :

spbackup2.JPG

حالا می تونیم براحتی درک کنیم چرا فقط در دستورات backup & restore این اتفاق می افته.(چون فقط درون این دو sp ما نام دیتابیس رو ذکر می کنیم که با توجه به توضیحاتی که عرض کردم نام دیتابیس بعد از اتچ خودکار تغییر میکنه).
برای حل این مشکل می تویند sp رو به گونه ای بنویسید که یک پارامتر دوم هم دریافت کنه که این پارامتر دوم همون مسیر کامل + نام دیتابیس به همراه پسوند خواهد بود.

----------


## esafb52

با سلام مجدد و تشکر از پاسخ های کاملا فنی و مفیدتون
بله منم به این  نکته رسیدم اصلا خود sql prompat این رو پیشنهاد میداد ولی باز یک سوال  برام پیش اومد من به دلیل که شما شیوه sp رو پیشنهاد دادین و روش کارتون بر  این مبنا بود دوست دارم تمام دستورات ام رو به ان صورت بنویسم ولی باز یک  مشکل 
 دیتابیس رو باید رو یک سیستم دیگه اتچ کنید برای اولین بار چطور  میتونم از sp اتچ استفاده کنم درحالیکه هنوز دیتابیسی در سرور ام اتچ نشده و  نیست که بخواهم دستورات من رو اجرا کنه و اصلا یک جورایی من به sp  خودم  هنوز دسترسی ندارم باز باید به شیو سابق کامند تکس سمت سی شارپ رو بیارم؟؟؟

----------


## veniz2008

> بله منم به این  نکته رسیدم اصلا خود sql prompat این رو پیشنهاد میداد ولی باز یک سوال  برام پیش اومد من به دلیل که شما شیوه sp رو پیشنهاد دادین و روش کارتون بر  این مبنا بود دوست دارم تمام دستورات ام رو به ان صورت بنویسم ولی باز یک  مشکل 
>  دیتابیس رو باید رو یک سیستم دیگه اتچ کنید برای اولین بار چطور  میتونم از sp اتچ استفاده کنم درحالیکه هنوز دیتابیسی در سرور ام اتچ نشده و  نیست که بخواهم دستورات من رو اجرا کنه و اصلا یک جورایی من به sp  خودم  هنوز دسترسی ندارم باز باید به شیو سابق کامند تکس سمت سی شارپ رو بیارم؟؟؟


 نه. نیازی به استفاده از commandtext نیست.
برای اولین بار میتونید یکی از sp های سبک پروژه تون رو در فرم لود اولین فرم اجرا کنید تا دیتابیس از طریق یکی از sp های پروژه خودتون اتچ بشه.
مثلا من یک sp به نام SelectAllRecord دارم. برای اولین بار با کد زیر و با استفاده از Stored Procedure ها ، دیتابیس رو اتچ میکنم.

SqlConnection con = new SqlConnection("server = .\\SQLEXPRESS; AttachDbFilename = |DataDirectory|\\DBTest33.mdf; Integrated Security = True");
            SqlDataAdapter da = new SqlDataAdapter("SelectAllRecord", con);
            da.SelectCommand.CommandType = CommandType.StoredProcedure;
            DataTable dt = new DataTable();
            da.Fill(dt);

----------


## ab1000

با سلام مجدد خدمت استاد عزیز و خسته نباشید ایا مبحث جستجو درون دیتاگرید توی ویدیوها پیاده شده؟ {اگه   فرم جستجو و تکست باکسها  و نتیجه رو با سلکت رکورد موردنظر توی دیتاگرید (جهت نمایش یا ویرایش) و همچنین پرش به رکورد خاص اموزش بدین ممنون میشویم!!   ( بدلیل مشغله زیاد نتونستم تمام ویدئوها رو ببینم. شرمنده)

----------


## veniz2008

> با سلام مجدد خدمت استاد عزیز و خسته نباشید ایا مبحث جستجو درون دیتاگرید توی ویدیوها پیاده شده؟ {اگه   فرم جستجو و تکست باکسها  و نتیجه رو با سلکت رکورد موردنظر توی دیتاگرید (جهت نمایش یا ویرایش) و همچنین پرش به رکورد خاص اموزش بدین ممنون میشویم!!   ( بدلیل مشغله زیاد نتونستم تمام ویدئوها رو ببینم. شرمنده)


 سلام.
این موارد درون آموزش ها قرار نگرفته.
ویدئوها بصورت کامل تهیه شدن و امکان اضافه کردن مطلب جدید به اونها وجود نداره.
موفق باشید.

----------


## esafb52

با سلام و تشکر مجدد از آموزش های خوبتون در قسمت چهارهم sp که برای جوین جداول نوشتین رو اگر دقت کرده باشین سوالات رو به صورت نامرتب جوین میکرد و بهتر بود ORDER BY TBLGROUP.GROUPID رو بهش اضافه میکردین البته این نکته در ویدیو ها قبل گفته شده بود ولی خب بهتر بود در اینجا هم استفاده میشد
USE [DBAZMOON]
GO
/****** Object:  StoredProcedure [dbo].[loaddgroupandQtxt]    Script Date: 10/15/2013 00:00:38 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROC [dbo].[loaddgroupandQtxt]
AS
SELECT GROUPNAME,TBLQUSETION.GROUPID ,QUSETIONTEXT,ANSWER,CASE1,CASE2,CASE3,CASE4 FROM TBLQUSETION
INNER JOIN TBLGROUP ON dbo.TBLQUSETION.GROUPID = TBLGROUP.GROUPID
ORDER BY dbo.TBLGROUP.GROUPID
RETURN
تا نتایج مرتبی رو داشته باشیم
یک سوال :
من سعی کردم که بانک رو 2005 sql تبدیل کنم ولی نتونستم هم اسکریپت گرفتم و از اکسپورت استفاده کردم ولی نتیجه جالب نشد sp ها به مقصد انتقال پیدا نمیکرد و روابط و کلید ها هم لحاظ نمیشد؟!!!
موفق باشین

----------


## veniz2008

> با سلام و تشکر مجدد از آموزش های خوبتون در قسمت چهارهم sp که برای جوین جداول نوشتین رو اگر دقت کرده باشین سوالات رو به صورت نامرتب جوین میکرد و بهتر بود ORDER BY TBLGROUP.GROUPID رو بهش اضافه میکردین البته این نکته در ویدیو ها قبل گفته شده بود ولی خب بهتر بود در اینجا هم استفاده میشد
> USE [DBAZMOON]
> GO
> /****** Object:  StoredProcedure [dbo].[loaddgroupandQtxt]    Script Date: 10/15/2013 00:00:38 ******/
> SET ANSI_NULLS ON
> GO
> SET QUOTED_IDENTIFIER ON
> GO
> ALTER PROC [dbo].[loaddgroupandQtxt]
> ...


سلام دوست من.
ابتدا جا داره یه تشکر از شما داشته باشم. قطعا اگه شما نبودید این تاپیک خاک میخورد.
وجود شما و سوالاتی که مطرح کردید و جواب هایی که داده شد باعث شد که این تاپیک قدری بتونه مفید باشه. شایدفردا  ما نباشیم، باشد که در آینده کسانیکه این تاپیک رو می بینن مطلب مفیدی گیرشون بیاد.
حرفتون صحیح هست.
تاکید اصلی بر روی کلیت کار هست و معمولا کمتر به حواشی پرداختم وگرنه خیلی می شد مانور داد. همونطور که خودتون هم دیدید هر مطلبی رو که دست گذاشتم روش حداقل 30 تا 45 دقیقه وقت گرفت!.
بله با order by گرفتن از GroupID یا GroupName میشد کوئری ها رو مرتب کرد و نتیجه هم زیباتر خواهد شد.




> یک سوال :
> من سعی کردم که بانک رو 2005 sql تبدیل کنم ولی نتونستم هم اسکریپت گرفتم و از اکسپورت استفاده کردم ولی نتیجه جالب نشد sp ها به مقصد انتقال پیدا نمیکرد و روابط و کلید ها هم لحاظ نمیشد؟!!!
> موفق باشین


 مراحل رو به همراه شکل ها توضیح میدم تا مشکلی پیش نیاد :
در محیط management studio روی دیتابیس مورد نظر کلیک راست کنید و از گزینه Task، گزینه Generate Scripts رو انتخاب کنید :

convert1.JPG

اگر پنجره ای ظاهر شد کلید Next رو بزنید تا به پنجره زیر برسید. در این پنجره، کلیه گزینه ها رو تیک بزنید تا جداول و Stored Procedure های شما به اسکریپت اضافه بشن.

convert2.JPG

در گام بعدی، ابتدا دکمه Advanced رو کلیک کنید.

convert3.JPG

حال در پنجره باز شده، گزینه های کلیدی زیر رو لحاظ کنید :
الف) Script for Server Version : در اینجا بایستی ورژن SQL Server سیستم مقصد رو انتخاب کنید. من اسکریپت رو از SQL Server 2012 تهیه و نسخه مقصد من SQL Server 2008 R2 هست.
ب) Types of data to scrip : اگر مایلید داده های جداول شما هم به سیستم مقصد منتقل بشه این گزینه رو بر روی Schema and data تنطیم کنید.
توجه : گزینه های Script Foreign Keys و Script Primary Keys بصورت پیش فرض True هستن. اگر نبودن اونها رو بر روی True قرار بدید.

convert4.JPG

بر روی Next کلیک و در انتها دکمه Finish رو کلیک کنید تا Script شما تهیه بشه.
convert5.JPG

در سیتم مقصد یک دیتابیس خالی همنام با دیتابیسی که از اون script تهیه کردید رو ایجاد کنید.
در محیط Management Studio (یا با کدنویسی) از مسیر File \ Open \ File فایل اسکریپتی که ساختید رو بهش بدید و اونو اجرا کنید.
سعی کردم مراحل رو خیلی ساده توضیح بدم که دوستانی که آشنایی چندانی با مطالب ندارند هم بتونن استفاده کنن.
موفق باشید.

----------


## esafb52

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


با سلام مجدد خدمت دوست و استاد عزیز آقای ونیز2008
  شما اگر آمار بازدید از این تایپک رو ببینید قطعا با من موافق خواهید بود که این تایپیک موفق بوده(2388 تا این لحظه) !!شما اگر به سوالاتی که در انجمن مطرح میشود دقت کنین میبینین که این دوره آموزشی چقدر میتونست برای افراد مبتدی و حتی متوسط مفید باشه ولی مشکل اساسی جایی دیگه هست ما در این فرم بارها با درخواست هایی مواجه بودیم که طرف عنوان میکنه من وقت دیدن فیلم رو نداشتم لطفا این رو جواب بدین و ده دقیقه بعد باز یک سوال و یا استادمون گفته و اخیرا لطفا این رو برامو انجام بدین و یا برام میل کنین وect .........باور کنین بعضی از دوستان قدری حاضر نیستین خودشون رو به زحمت بندازن اونم برای چیزی که بهش نیاز دارن!!!برای من که سعادتی بود که با شما گام به گام در این پروژه پیش برم و از دانش شما استفاده کنم  امیدوارم هرجا هستین موفق باشین

----------


## esmaeilbf

موقع ثبت گروه ارور میده  نمیتونه به sql وصل بشه
باید چیکار کنم؟

----------


## FastCode

نمیدونم شنیدید یا نه؟"الحمد لله رو یکم زود گفتم"در نماز جمعه پس از فوت امام خمینی(Quote:"الحمد لله که امام مرد و نه این شد نه آن";یعنی نه روسها آمدند و نه غربی ها)
شما هم "فقظ" رو یک مقدار دیر گفتید.
نسخه enterprise فقط روی ویندوز سرور نصب میشه.
فقط نسخه enterprise روی ویندوزسرور نصب میشه.

----------


## veniz2008

> موقع ثبت گروه ارور میده  نمیتونه به sql وصل بشه
> باید چیکار کنم؟


سلام.
نام سرور رو اشتباه وارد کردید به همین خاطر برنامه قادر به ارتباط برقرار کردن با دیتابیس نیست.
برای اینکه نام سرور(ها) رو بیرون بکشید یه لیست باکس روی فرم بذارید و کد زیر رو در فرم لود قرار بدید :
List<string> listOfInstances = (Microsoft.Win32.Registry.LocalMachine.OpenSubKey(
            @"SOFTWARE\Microsoft\Microsoft SQL Server").GetValue("InstalledInstances", "SQLSERVER IS NOT INSTALLED") as string[]).ToList();
            listBox1.Items.AddRange(listOfInstances.ToArray())  ;
دقت کنید که پروژه رو در حالت AnyCpu اجرا کنید. برای این کار در پنجره Solution Explorer بر روی روت پروژه کلیک راست و گزینه properties رو بزنید. بقیش هم که در شکل مشخص هست.

----------


## esmaeilbf

> سلام.
> نام سرور رو اشتباه وارد کردید به همین خاطر برنامه قادر به ارتباط برقرار کردن با دیتابیس نیست.
> برای اینکه نام سرور(ها) رو بیرون بکشید یه لیست باکس روی فرم بذارید و کد زیر رو در فرم لود قرار بدید :
> List<string> listOfInstances = (Microsoft.Win32.Registry.LocalMachine.OpenSubKey(
>             @"SOFTWARE\Microsoft\Microsoft SQL Server").GetValue("InstalledInstances", "SQLSERVER IS NOT INSTALLED") as string[]).ToList();
>             listBox1.Items.AddRange(listOfInstances.ToArray())  ;
> دقت کنید که پروژه رو در حالت AnyCpu اجرا کنید. برای این کار در پنجره Solution Explorer بر روی روت پروژه کلیک راست و گزینه properties رو بزنید. بقیش هم که در شکل مشخص هست.


تمام این کارا رو کردم اما هیچی نشون نداد؟!!! 
همونطور که توی فیلم قسمت 1 توضیح دادین نام سرور رو وارد کردم !

----------


## veniz2008

این سرور رو خودتون تایپ می کنید؟ یا موقع بالا اومدن sql خودش وجود داره؟!!
به نظر میرسه جایی رو دارید اشتباه می کنید.
در کانکشن استرینگ از (local) و یا نقطه .    استفاده کنید، ببینید مشکلتون حل میشه :
server = (local); ..........
یا
server = . ; ..........

----------


## esmaeilbf

> این سرور رو خودتون تایپ می کنید؟ یا موقع بالا اومدن sql خودش وجود داره؟!!
> به نظر میرسه جایی رو دارید اشتباه می کنید.
> در کانکشن استرینگ از (local) و یا نقطه .    استفاده کنید، ببینید مشکلتون حل میشه :
> server = (local); ..........
> یا
> server = . ; ..........


خودش وجود داره!
server = (local); ..........
این روش جواب داد خیلی ممنون
فقط یه توضیح کوچیکی بدین که دقیقا چه اتفاقی افتاد و فرقش با روش "." چیه؟

----------


## veniz2008

> خودش وجود داره!
> server = (local); ..........
> این روش جواب داد خیلی ممنون
> فقط یه توضیح کوچیکی بدین که دقیقا چه اتفاقی افتاد و فرقش با روش "." چیه؟


 زمانیکه شما در زمان نصب sql یک Instance دلخواه وارد می کنید و بعد با همون instance اقدام به ساخت دیتابیس می کنید بایستی از همون instance  استفاده کنید. واسه همین در آموزش ها چنین کانکشن استرینگی رو می بینید :
SqlConnection con = new SqlConnection("server = .\\md2008;DataBase = DBAzmoon;Integrated Security = True");
منظور از دات (نقطه . ) یعنی همین کامپیوتر جاری. یعنی من به جای اینکه نام کامپیوتر خودم (veniz-pc) رو وارد کنم به جای اون از نقطه استفاده کردم. پس در سیستم خودم چه کانکشن بالا رو بنویسم چه کانکشن زیر رو بنویسم جفتشون یک معنا و مفهوم رو دارند و به درستی کار می کنند :
SqlConnection con = new SqlConnection("server = veniz-pc\\md2012 ;DataBase = DBTest1;Integrated Security = True");
در کانکشن های بالا بخش مربوط به server مربوط به کانکشن های شبکه هست که در واقع شامل دو بخش (ابتدا نام کامپیوتر یا IP سیستم جاری هست و بعد از بک اسلش هم باید نام اینستنس (InstanceName) رو وارد کنید).
در مورد چنین کانکشن استرینگ هایی در ویدئوی 16  (آخرین ویدئو) کامل صحبت میشه.
اما زمانیکه برای sql خودتون یک instance تعیین نمی کنید و می زارید بصورت پیش فرض باشه و SQL شما بر روی همین سیستم جاری وجود داره می تونید از (local) که اشاره به سیستم جاری داره استفاده کنید :
SqlConnection con = new SqlConnection("server = (local) ;DataBase = DBTest1;Integrated Security = True");
 در کانکشن قبلی که مربوط به کانکشن های شبکه هست این احتمال وجود داره که server بر روی سیستم دیگه ای باشه به همین خاطر برای شناسایی اون از نام کامپیوتر (یا IP) و InstanceName استفاده میشه.

----------


## FastCode

من قبلا نسخه enterprise ه 2000 رو روی xp داشتم.عجب چیز زشتی هم بود الان که فکرش رو میکنم.

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

----------


## veniz2008

> من قبلا نسخه enterprise ه 2000 رو روی xp داشتم.عجب چیز زشتی هم بود الان که فکرش رو میکنم.


فکر میکنم حرفت درست باشه! ولی اینها رو ببین. به نظرت کی درست میگه؟ :
https://barnamenevis.org/showthread.p...ght=Enterprise
حالا اینو ببین :
http://stackoverflow.com/questions/1...006823#1006823



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


ممنونم.
تشکر از زحمتی که میکشی.

----------


## behnam-soft

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


با سلام خدمت آقای ونیز عزیز که انصافا با این ویدئوها، کمک بزرگی به خیلی از افرادی که تشنه یادگیری هستن- من جمله خودم- کردین.در مورد این حرفتون،من فکر می کنم که اتفاقا این یه نکته مثبته !!! چرا ؟ به این دلیل که شما اینقدر خوب و روان توضیح دادین که به نظر من افرادی که تازه شروع کردن، خیلی سوال خاصی براشون پیش نمیاد چون شما جواب ها رو هم در ویدئو ها دادین. من 2  3 قسمت رو بیشتر نتونستم ببینم ولی واقعا باید بهت خسته نباشید بگم، مطمئن باشین اون تاثیر و هدفی که مد نظر شما بوده، هر روز داره بیشتر تحقق پیدا می کنه... ضمنا این نکته رو هم بگم که چون شما ویدئوهارو برای قشر تازه کار در نظر گرفتین، خب خیلی جای تعجب نداره که اگر هم کسی به مشکلی بر بخوره، خیلی زود می تونه با یه جستجوی کوچیک، مشکلش رو برطرف کنه.
مخلص کلام اینکه،ارزش کاری که انجام دادین و وقتی که گذاشتین، چه برای ضبط ویدئو ها ، چه برای آپلود کردنشون، بسیار بالاست، و حیفه که بخواد با تعداد سوال های پرسیده شده  و... سنجیده بشه.
به هر حال، امیدوارم در آینده بتونیم ویدئو های بیشتر و تخصصی تری از شما ببینیم، در اینصورت مطمئن باشین که یکی از افرادی که هر روز و هر ساعت سوال خواهد کرد، خود من هستم!!!
با تشکر، موفق باشید.

----------


## FastCode

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

----------


## veniz2008

> با سلام خدمت آقای ونیز عزیز که انصافا با این ویدئوها، کمک بزرگی به خیلی از افرادی که تشنه یادگیری هستن- من جمله خودم- کردین.در مورد این حرفتون،من فکر می کنم که اتفاقا این یه نکته مثبته !!! چرا ؟ به این دلیل که شما اینقدر خوب و روان توضیح دادین که به نظر من افرادی که تازه شروع کردن، خیلی سوال خاصی براشون پیش نمیاد چون شما جواب ها رو هم در ویدئو ها دادین. من 2  3 قسمت رو بیشتر نتونستم ببینم ولی واقعا باید بهت خسته نباشید بگم، مطمئن باشین اون تاثیر و هدفی که مد نظر شما بوده، هر روز داره بیشتر تحقق پیدا می کنه... ضمنا این نکته رو هم بگم که چون شما ویدئوهارو برای قشر تازه کار در نظر گرفتین، خب خیلی جای تعجب نداره که اگر هم کسی به مشکلی بر بخوره، خیلی زود می تونه با یه جستجوی کوچیک، مشکلش رو برطرف کنه.
> مخلص کلام اینکه،ارزش کاری که انجام دادین و وقتی که گذاشتین، چه برای ضبط ویدئو ها ، چه برای آپلود کردنشون، بسیار بالاست، و حیفه که بخواد با تعداد سوال های پرسیده شده  و... سنجیده بشه.
> به هر حال، امیدوارم در آینده بتونیم ویدئو های بیشتر و تخصصی تری از شما ببینیم، در اینصورت مطمئن باشین که یکی از افرادی که هر روز و هر ساعت سوال خواهد کرد، خود من هستم!!!
> با تشکر، موفق باشید.


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



> خیلی وقت هست که کانکشن استرینگ ننوشتم ولی زمان ما قبل و بعد از مساوی فاصله نمیزاشتن.شاید تغییر کرده یا من یادم نیست.فکر میکنم ارزش امتحان کردن داره.


 قبلا کانکشن رو به شکل های مختلف تست کرده بودم (از نظر فاصله قبل و بعد از مساوی، حروف کوچیک و بزرگ، استفاده از DataSource یا Server ، یا مثلا DataBase یا Initial Catalog و ...).
از لحاظ فاصله قبل و بعد مساوی خللی در کار ایجاد نمیکنه،یعنی جفت این کانکشن ها به درستی کار می کنند :
SqlConnection con = new SqlConnection("server=.\\md2012;DataBase=DBTest1;I  ntegrated Security=True");
یا
SqlConnection con = new SqlConnection("server = .\\md2012;DataBase = DBTest1;Integrated Security = True");
اگر منظورتون چیز دیگه ای هست،لطفا ذکر کنید.
بین حروف کوچیک و بزرگ تفاوتی وجود نداره و اینکه شخصا ترجیح میدم که به جای استفاده از کلمات Data Source و Initial Catalog از کلمات Server و DataBase استفاده کنم چراکه مفهوم کانکشن رو بهتر میشه با این کلمات برای افراد مبتدی توضیح داد و فهم اون به نظرم راحت تر هست.

----------


## bitcob589

با سلام و تشکر از فیلم آموزشی  :تشویق:  :تشویق:  :تشویق:  :تشویق:  :تشویق:  :تشویق:  :تشویق: 
در فیلم قسمت 4 در گرید ویو یک فیلد visble را true گذاشتیم و در زمانی که رکود انتخاب می شد سوال و جوابهای آن رکورد در تکس باکسها نمایش داده می شد.

در گرید ویوی که گذاشته ام  visble دو تا فیلدها را true  گذاشته ام چگونه می شود با کلیک بر روی هر خانه فیلد دیگر فیلدهای آن را در تکس باکس  نمایش دهیم (در ویدئو رکورد انتخاب می کردیم تا اطلاعات آن فیلد به ما نمایش دهد )

----------


## veniz2008

> در فیلم قسمت 4 در گرید ویو یک فیلد visble را true گذاشتیم و در زمانی که رکود انتخاب می شد سوال و جوابهای آن رکورد در تکس باکسها نمایش داده می شد.
> 
> در گرید ویوی که گذاشته ام  visble دو تا فیلدها را true  گذاشته ام چگونه می شود با کلیک بر روی هر خانه فیلد دیگر فیلدهای آن را در تکس باکس  نمایش دهیم (در ویدئو رکورد انتخاب می کردیم تا اطلاعات آن فیلد به ما نمایش دهد )


سلام دوست عزیز.
احتمالا منظورتون اینه که visible یکسری از ستون ها رو false کردیم تا نمایش داده نشن!.
برای اینکه روی یک سلول (خانه) از گرید کلیک کنید و اطلاعات رو نمایش بدید باید از رویدادهایی مثل CellMouseClick و ... استفاده کنید که مربوط به کلیک کاربر در یک سلول میشن.
در این باره قبلا در سایت خیلی بحث شده که می تونید کدها و رویدادهای مورد نیازتون رو پیدا کنید.
موفق باشید.

----------


## sajadsobh

چرا وقتی میخوایم از طریق sqlserver express ری استور کنیم خطا میده؟!  :افسرده: 
موقع بک آپ مشکل نداره موقع ری استور خطا میده!

User does not have permission to alter database 'MyGym', or the database does not exist.
ALTER DATABASE statement failed.
The file 'D:\MyFiles\MyGym\MyGym\MyGym\bin\Debug\Database\M  yGym.mdf' cannot be overwritten.  It is being used by database 'D:\MYFILES\MYGYM\MYGYM\MYGYM\BIN\DEBUG\DATABASE\M  YGYM.MDF'.

----------


## FastCode

برای اینکه فایل مقصدی که برای restore انتخاب کردید وجود داره و توسط یک دیتابیس دیگه استفاده میشه.

----------


## vahidth

یه سوال از استاد ونیز دارم

چطوری میتونم برنامه ای که نوشتم   مسیر کانکشن  در یک فایل متنی باشه و کاربر بتونه خودش ای پی اون سیستم رو بده و برنامه متصل بشه به بانک

----------


## veniz2008

> چرا وقتی میخوایم از طریق sqlserver express ری استور کنیم خطا میده؟! 
> موقع بک آپ مشکل نداره موقع ری استور خطا میده!
> 
> User does not have permission to alter database 'MyGym', or the database does not exist.
> ALTER DATABASE statement failed.
> The file 'D:\MyFiles\MyGym\MyGym\MyGym\bin\Debug\Database\M  yGym.mdf' cannot be overwritten.  It is being used by database 'D:\MYFILES\MYGYM\MYGYM\MYGYM\BIN\DEBUG\DATABASE\M  YGYM.MDF'.


همونطور که دوستم هم گفتن نمیشه همزمان از یک دیتابیس در دو جای متفاوت استفاده کرد و همزمان که توسط برنامه دیگه ای داره استفاده میشه با دیگری بر روی اون دیتابیس تغییرات اعمال کرد. باید قبل از ری استور، تمامی کانکشن های متصل به اون دیتابیس قطع بشه (هیچ استفاده از اون نشه) و بعد از offline کردن اون اقدام به ری استور کنید.




> چطوری میتونم برنامه ای که نوشتم   مسیر کانکشن  در یک فایل متنی باشه و کاربر بتونه خودش ای پی اون سیستم رو بده و برنامه متصل بشه به بانک


فکر کنم اگر منظور و هدفتون رو کامل توضیح بدید بهتر بتونم راهنمایی کنم.
ip سیستم سرور رو میتونی با قرار دادن یک فرم در پروژه و وارد کردن ip توسط کاربر دریافت کنید و بعد اونو در کانکشن استرینگ اعمال کنید و در صورت صحت اونو یک جایی ذخیره کنید و از اون به بعد از اون کانکشن ذخیره شده استفاده کنید.شما میتونی ip های فعال شبکه رو هم خودتون با کدنویسی بدست بیارید و بعد در یک حلقه، (در یک ساختار try و catch) اقدام به وارد کردن تک تک ip ها کنید تا متوجه بشید کدوم ip مربوط به سرور هست. اینطوری دیگه نیازی به گذاشتن فرم و دریافت ip هم از کاربر نیست. این تاپیک ها رو ببینید :
http://stackoverflow.com/questions/1...s-in-a-network
http://stackoverflow.com/questions/9...t-ipv4-address

----------


## vahidth

من میخوام برنامه رو  به کاربر بدم و خودش نصب کنه بدون نیاز من

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

----------


## veniz2008

> من میخوام برنامه رو  به کاربر بدم و خودش نصب کنه بدون نیاز من
> 
> نظر شما در مورد این کار چیه از چه برنامه ای برای اینستال کردن استفاده کنم و چگونه برنامه ای که بصورت شبکه هست رو کاربر خودش نصب کنه؟


در شبکه بودن نرم افزار بحث یه کم متفاوت هست نسبت به تک کاربره بودن نرم افزار.
چون در شبکه بودن نسخه کامل  sql رو نصب میکنن که معمولا حجم زیادی داره و نیاز به یکسری تنظیمات داره که باید حتما برنامه نویس در محل حاضر باشه (یا از راه دور اقدام به نصب کنه) ولی در یک برنامه تک کاربره برای شما sql express کفایت خواهد کرد(بدون نیاز به تنظیمات خاصی).
من گمان میکنم منظور شما نرم افزار تک کاربره هست نه نرم افزاری که قراره در چند سیستم بصورت همزمان کار کنه.
خیلی مهم نیست که با چه نرم افزاری اقدام به تهیه setup کنید. مهم اینه که پیش نیازهایی رو که نیاز هست روی سیستم مشتری نصب بشه وارد یک فایل setup کنید.می تونید با setup خود ویژوال یک فایل ست آپ بسازید. چیزی که مهمه کدنویسی شما برای اتچ خودکار دیتابیس هست.
درباره اتچ کردن خودکار برنامه تاپیک های خیلی زیادی ایجاد شده که توصیه میکنم با جستجو کردن به جواب مورد نظرتون برسید.
موفق باشید.

----------


## sajadsobh

> همونطور که دوستم هم گفتن نمیشه همزمان از یک دیتابیس در دو جای متفاوت استفاده کرد و همزمان که توسط برنامه دیگه ای داره استفاده میشه با دیگری بر روی اون دیتابیس تغییرات اعمال کرد. باید قبل از ری استور، تمامی کانکشن های متصل به اون دیتابیس قطع بشه (هیچ استفاده از اون نشه) و بعد از offline کردن اون اقدام به ری استور کنید.


خب الان چاره چیه؟! چطوری کانکشن ها رو قطع کنم؟ بعدشم شما هم همین کار رو کردین ولی همچین مشکلی نداشتین که!! :متفکر:

----------


## FastCode

مسیر restore رو تغییر بدید.

----------


## sajadsobh

> مسیر restore رو تغییر بدید.


متوجه منظورتون نمیشم.
من میام یه دیتابیس رو که یه جایی ذخیره شده backup میگیرم و بعد میام restore میکنمش.
بعدش که بخوام دوباره برنامه رو اجرا کنم حب همون دیتابیس اول که استفاده میشد استفاده میشه دیگه. من که connectionstring رو تغییر نمیدم. واقعاً گیج شدم من  :ناراحت:

----------


## FastCode

https://www.google.com/search?q=database+restore+path+ssms&tbm=isch

----------


## sajadsobh

ممنون.
فهمیدم مشکل از کجاست. باید توی connection string اسم دیتابیس رو میذاشتم  :چشمک:

----------


## esmaeilbf

یه مشکلی در رابطه با قسمت ثبت سوالات پیش اومده!!!!!
من کامله کامل با توجه به فیلم ها قسمت ثبت سوالات رو طراحی کردم اما موقع ثبت یک سوال درون یک گروه امتحانی ، سوال به QuestionID بعدی وارد میشه 

 private void cmbGroup_SelectedIndexChanged(object sender, EventArgs e)
        {
            SqlDataAdapter da = new SqlDataAdapter("SelectAllQuestionByGroupID", con);
            da.SelectCommand.CommandType = CommandType.StoredProcedure;
            da.SelectCommand.Parameters.AddWithValue("@groupID  ", ((DataRowView)cmbGroup.SelectedItem)["GroupID"]);
            DataTable dt = new DataTable();
            da.Fill(dt);
            grdQuestion.DataSource = dt;
            

        }

مثلا من گروه اقتصاد با شماره QuestionID = 2 رو انتخاب میکنم و سوال رو ثبت میکنم اما وقتی داخل sql میرم میبینم که سوال برای گروه با QuestionID = 3 ثبت شده!!!
-------------------------------------------------------
یه پیشنهادم دارم اینکه سورس پروژه رو واسه دانلود قرار بدین
خیلی خیلی متشکریم:)

----------


## HOSSEINONLINE7

سلام با تشکر از آموزشتون که خیلی خوب هست . 

شما از کانکشن استرینگ و sql در آموزشتون استفاده کردید و سوال اینه که  من فقط روش orm و Linq را بلدم و دانشجو هستم و با این روش  پروژه هام را انجام میدم و آیا برای آینده که میخوام وارد بازار کار بشم نیاز به یادگیری کار با کانکشن استرینگ و sql هست ؟ میتونم فقط با همین روش کار کنم ؟

----------


## FastCode

> سلام با تشکر از آموزشتون که خیلی خوب هست . 
> 
> شما از کانکشن استرینگ و sql در آموزشتون استفاده کردید و سوال اینه که  من فقط روش orm و Linq را بلدم و دانشجو هستم و با این روش  پروژه هام را انجام میدم و آیا برای آینده که میخوام وارد بازار کار بشم نیاز به یادگیری کار با کانکشن استرینگ و sql هست ؟ میتونم فقط با همین روش کار کنم ؟


 همه ی مطالبی که در مورد همه ی connection string ها وجود داره روی هم ۵۰ صفحه نمیشه.(http://www.connectionstrings.com/)
و یکی از اجزا اصلی هر برنامه دیتابیسی هست.مثل اینکه شما بگید من بدون ظرف غذا میخورم.شاید شما اینطوری بگید و هر کسی نگاه کنه همین رو بگه.ولی بلاخره غذاتون رو دارید از یک جایی میخورید که اسمش میشه ظرف.
در روشهایی هم که گفتید بلاخره ارتباط با دیتابیس وجود داره و راهی برای این کار نیست جز connection string

(بعضی دیتابیسها طراحی متفاوتی دارند و نیاز به connection string ندارند و طبق معمول چون چیز متفاوتی هستند در ایران استفاده نمیشن.)

----------


## veniz2008

> یه مشکلی در رابطه با قسمت ثبت سوالات پیش اومده!!!!!
> من کامله کامل با توجه به فیلم ها قسمت ثبت سوالات رو طراحی کردم اما موقع ثبت یک سوال درون یک گروه امتحانی ، سوال به QuestionID بعدی وارد میشه 
> 
>  private void cmbGroup_SelectedIndexChanged(object sender, EventArgs e)
>         {
>             SqlDataAdapter da = new SqlDataAdapter("SelectAllQuestionByGroupID", con);
>             da.SelectCommand.CommandType = CommandType.StoredProcedure;
>             da.SelectCommand.Parameters.AddWithValue("@groupID  ", ((DataRowView)cmbGroup.SelectedItem)["GroupID"]);
>             DataTable dt = new DataTable();
> ...


sp که گذاشتید مربوط به نمایش سوالات یک گروه امتحانی هست ولی سوالتون در ارتباط با ثبت یک سوال هست.
در زمان ثبت برای هر سوال ما GroupID رو ثبت می کنیم تا مشخص بشه سوال درج شده متعلق به کدوم گروه هست.
 در مورد QuestionID که گفتید، این فیلد اصلا مشخص کننده گروه خاصی نیست.
من فکر میکنم بهتره یکبار دیگه ویدئوهای مورد نیازتون رو از اول و با دقت بیشتری نگاه کنید.



> سلام با تشکر از آموزشتون که خیلی خوب هست . 
> 
> شما از کانکشن استرینگ و sql در آموزشتون استفاده کردید و سوال اینه که  من فقط روش orm و Linq را بلدم و دانشجو هستم و با این روش  پروژه هام را انجام میدم و آیا برای آینده که میخوام وارد بازار کار بشم نیاز به یادگیری کار با کانکشن استرینگ و sql هست ؟ میتونم فقط با همین روش کار کنم ؟


سلام دوست عزیز.
 در تکمیل صبحت های جناب FastCode این مطلب رو بگم که در LINQ و EF هم کانکشن استرینگ وجود داره ولی کاربر نیازی به درگیر شدن با این مفاهیم رو نداره و در واقع در پس زمینه این موارد ست میشه.
شما اگر مفاهیم ADO رو خوب درک کنید در LINQ و Entity Framework هم با مشکل مفاهیم روبرو نخواهید شد چراکه LINQ و EF هم در پس زمینه همون کارهای ADO رو دارند ولی کاربر دیگه درگیر این مفاهیم نمیشه.
بدون شک باید به سمت LINQ و EF حرکت کرد و بازارکار هم روز به روز طلب بیشتری رو برای این تکنولوژی ها میکنه.
در مورد sql هم همونطور که خودتون مستحضر هستید زبان LINQ شما رو بی نیاز به دونستن دستورات خاص sql میکنه ولی همین دستورات در نهایت باز هم به زبان قابل فهم اون دیتابیس (sql، mysql ، oracle یا ...) تبدیل میشه (بدون دخالت کاربر) ولی به شخصه اعتقاد دارم که هیچ چیزی نمیتونه جای یادگیری SQL Server رو بگیره.
موفق باشید.

----------


## esmaeilbf

مشکل اینه وقتی فرم ثبت سوال لود میشه اگر سوال رو برای ایتم اول کمبوباکس ثبت کنم درسته اما وقتی یک گروه دیگه انتخاب میکنم برای بعدیش ثبت میشه!!!! 
واقعا چند بار فیلم رو دیدم کپی برابر اصله اما نمیدونم مشکل از کجاست!!!!
اینم کد دکمه ی ثبت سوال
SqlCommand cmd = new SqlCommand("AddQuestion", con);
                cmd.CommandType = CommandType.StoredProcedure;
                cmd.Parameters.AddWithValue("@GroupID", cmbGroup.SelectedValue);
                cmd.Parameters.AddWithValue("@QuestionText",txtbox  Question.Text);
                cmd.Parameters.AddWithValue("@txtCase1",textboxCas  e1.Text);
                cmd.Parameters.AddWithValue("@txtCase2",textboxCas  e2.Text);
                cmd.Parameters.AddWithValue("@txtCase3",textboxCas  e3.Text);
                cmd.Parameters.AddWithValue("@txtCase4",textboxCas  e4.Text);
                cmd.Parameters.AddWithValue("@answer",cmbAnswer.Te  xt);

                con.Open();
                cmd.ExecuteNonQuery();
                con.Close();
                MessageBox.Show("سوال مورد نظر با موفقیت اضافه گردید");
                clearTextBox();
                FillGrid();
*اما اگر سورس برنامه رو هم لطف کنید شاید بهتر باشه ،  از زحماتتون بسیار سپاس گذارم*
-----------------------------------------------------------------------------------------------------------------------------
*یه سوال هم در مورد متغیرهای از نوع setting برای چی از این نوع استفاده کردین؟!
چه مزیتی نسبت به متغیر های معمولی داره؟*

----------


## esafb52

با اجازه جناب ونیز 2008 
کدهای کامل این فرم رو بذارید درخواست سورس هم نفرمایید دوست عزیز قبلا راجب به این مسئله پاسخ داده شده

----------


## ahmad002

سلام خدمت استاد عزیز آقای ونیز
من خدایش سورس نمیخوام، تا الان هم سعی کردم خودم روی تمام سورس ها کار کنم، فقط الان به یه مشکل جدی خوردم، این محاسبه کننده جواب های صحیح و غلط و بی پاسخ واسه من اشتباه، جواب درست آزمون رو بهم نمیده، واقعاً مغزم داغ کرده اونقدر این کدهای این صفحه رو مرور کردم، دیگه ناامید شدم و گفتم از شما و باقی دوستان کمک بگیرم!
کدهای این صفحه رو میزارم اگه ممکنه یه نگاه بندازید، خیلی ممنون میشم اگه کمک کنید،(کدهای فرم آزمون)

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Data.SqlClient;
namespace MyAzmoon
{
    public partial class FrmAzmon : Form
    {
        SqlConnection con = new SqlConnection("server=(local);DataBase=DBAzmoon;In  tegrated security = true");
        DataTable dt;
        int MyTime;
        int k = 0;
        ListBox MyListAnswer;
        //int num = 0;
        public static int bipasokh, sahih, ghalat;
        public FrmAzmon()
        {
            InitializeComponent();
        }
        public void UncheckRadioButton(Control parent)
        {
            foreach ( Control ctrl in Parent.Controls)
            {
                if (object.ReferenceEquals(ctrl.GetType(), typeof(RadioButton)))
                {
                    ((RadioButton)ctrl).Checked = false;
                }
            }
        }
        private void FrmAzmon_Load(object sender, EventArgs e)
        {
            txtQuestionNumber.Focus();
            SqlDataAdapter da = new SqlDataAdapter("SelectAllGroup", con);
            da.SelectCommand.CommandType = CommandType.StoredProcedure;
            DataTable dt = new DataTable();
            da.Fill(dt);
            CmbGroup.DataSource = dt;
            CmbGroup.DisplayMember = "GroupName";
            CmbGroup.ValueMember = "GroupID";
            UncheckRadioButton(groupBox2);
            //BtnNext.Enabled = false;
            //btnPreviews.Enabled = false;
            groupBox2.Enabled = false;
        }

        private void btnCancel_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        private void btnShow_Click(object sender, EventArgs e)
        {
            if (string.IsNullOrWhiteSpace(txtQuestionNumber.Text)  )
                errorProvider1.SetError(txtQuestionNumber, "تعداد سوالات را تعیین کنید");
            else if (string.IsNullOrWhiteSpace(CmbGroup.Text))
                errorProvider1.SetError(CmbGroup, "گروه امتحانی را تعیین کنید");
            else if (txtQuestionNumber.Text == (0).ToString())
                errorProvider1.SetError(txtQuestionNumber, "تعداد سوالات نمیشود صفر باشد");
            else
            {
                errorProvider1.SetError(txtQuestionNumber, "");
                errorProvider1.SetError(CmbGroup, "");
                SqlCommand cmd = new SqlCommand("CheckQuestionNumber", con);
                cmd.CommandType = CommandType.StoredProcedure;
                cmd.Parameters.AddWithValue("@groupid", CmbGroup.SelectedValue);
                cmd.Parameters.AddWithValue("@questionnumber", txtQuestionNumber.Text.Trim());
                cmd.Parameters.Add("@result", SqlDbType.Int);
                cmd.Parameters["@result"].Direction = ParameterDirection.Output;
                con.Open();
                cmd.ExecuteNonQuery();
                con.Close();
                int res = Convert.ToInt32(cmd.Parameters["@result"].Value);
                if (res == 0)
                {
                    MessageBox.Show("تعداد سوالات درخواستی در بانک اطلاعاتی موجود نیست","ERROR", MessageBoxButtons.OK, MessageBoxIcon.Error, MessageBoxDefaultButton.Button1);
                    txtQuestionNumber.ResetText();

                }
                else if (res == 1)
                {
                    btnPreviews.Enabled = true;
                    BtnNext.Enabled = true;
                    //btnShow.Enabled = false;
                    //btnCancel.Enabled = false;
                    groupBox1.Enabled = false;
                    groupBox2.Enabled = true;
                    SqlDataAdapter da = new SqlDataAdapter();
                    da.SelectCommand = cmd;
                    dt = new DataTable();
                    da.Fill(dt);
                    if (CHKTime.Checked)
                    {
                        timer1.Start();
                        lblTotalTime.Text = (Properties.Settings.Default.QuestionTime * dt.Rows.Count).ToString();
                    }
                    k = 0;
                    txtQuestion.Text = dt.Rows[0]["QuestionText"].ToString();
                    RdbCase1.Text = dt.Rows[0]["Case1"].ToString();
                    RdbCase2.Text = dt.Rows[0]["Case2"].ToString();
                    rdbCase3.Text = dt.Rows[0]["Case3"].ToString();
                    RdbCase4.Text = dt.Rows[0]["Case4"].ToString();
                    //
                    MyListAnswer = new ListBox();
                    for (int i = 0; i < dt.Rows.Count; i++)
                    {
                        MyListAnswer.Items.Add(0);
                    }
                }//End else
            }
        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            MyTime = 0;
            MyTime = Convert.ToInt32(lblTotalTime.Text);
            MyTime--;
            lblTotalTime.Text = MyTime.ToString();
            if (MyTime == 0)
            {
                timer1.Stop();
                btnPreviews.Enabled = false;
                BtnNext.Enabled = false;
                //MessageBox.Show("زمان شما به اتمام رسید.");
                for (int i = 0; i < dt.Rows.Count; i++)
                {
                    if (Convert.ToInt32(MyListAnswer.Items[i]) == Convert.ToInt32(dt.Rows[i]["Answer"]))
                    {
                        sahih++;
                    }
                    else if (Convert.ToInt32(MyListAnswer.Items[i]) == 0)
                    {
                        bipasokh++;
                    }
                    else if (Convert.ToInt32(MyListAnswer.Items[i]) != Convert.ToInt32(dt.Rows[i]["Answer"]))
                    {
                        ghalat++;
                    }
                }
                frmResultQuestion fresult = new frmResultQuestion();
                fresult.ShowDialog();
            }
        }

        private void BtnNext_Click(object sender, EventArgs e)
        {
            sahih = 0;
            ghalat = 0;
            bipasokh = 0;
            RdbCase1.Checked = false;
            RdbCase2.Checked = false;
            rdbCase3.Checked = false;
            RdbCase4.Checked = false;
            if (!RdbCase1.Checked && !RdbCase2.Checked && !rdbCase3.Checked && !RdbCase4.Checked)
            {
                MyListAnswer.Items[k] = 0;
            }
            else if (RdbCase1.Checked)
            {
                MyListAnswer.Items[k] = 1;
            }
            else if (RdbCase2.Checked)
            {
                MyListAnswer.Items[k] = 2;
            }
            else if (rdbCase3.Checked)
            {
                MyListAnswer.Items[k] = 3;
            }
            else if (RdbCase4.Checked)
            {
                MyListAnswer.Items[k] = 4;
            }
            //
            if (k == dt.Rows.Count - 1)
            {
                for (int i = 0; i < dt.Rows.Count; i++)
                {
                    if (Convert.ToInt32(MyListAnswer.Items[i]) == Convert.ToInt32(dt.Rows[i]["Answer"]))
                    {
                        sahih++;
                    }
                    else if (Convert.ToInt32(MyListAnswer.Items[i]) == 0)
                    {
                        bipasokh++;
                    }
                    else if (Convert.ToInt32(MyListAnswer.Items[i]) != Convert.ToInt32(dt.Rows[i]["Answer"]))
                    {
                        ghalat++;
                    }
                }
                timer1.Stop();
                BtnNext.Enabled = true;
                btnPreviews.Enabled = false;
                MessageBox.Show("صحیح برابر است با : " + sahih + "");
                MessageBox.Show("غلط برابر است با : " + ghalat + "");
                MessageBox.Show("نزده برابر است با : " + bipasokh + "");
                frmResultQuestion fresult = new frmResultQuestion();
                fresult.ShowDialog();
            }
            else
            {
                k++;
                txtQuestion.Text = dt.Rows[k]["QuestionText"].ToString();
                RdbCase1.Text = dt.Rows[k]["Case1"].ToString();
                RdbCase2.Text = dt.Rows[k]["Case2"].ToString();
                rdbCase3.Text = dt.Rows[k]["Case3"].ToString();
                RdbCase4.Text = dt.Rows[k]["Case4"].ToString();
                //UncheckRadioButton(groupBox2);
            }
        }

        private void btnPreviews_Click(object sender, EventArgs e)
        {
            if (k > 0)
            {
                k--;
                txtQuestion.Text = dt.Rows[k]["QuestionText"].ToString();
                RdbCase1.Text = dt.Rows[k]["Case1"].ToString();
                RdbCase2.Text = dt.Rows[k]["Case2"].ToString();
                rdbCase3.Text = dt.Rows[k]["Case3"].ToString();
                RdbCase4.Text = dt.Rows[k]["Case4"].ToString();
            }
        }

        private void button1_Click(object sender, EventArgs e)
        {
            groupBox1.Enabled = true;
            groupBox2.Enabled = false;
            timer1.Stop();
        }
    }
}


بنظر شما مشکل کجاست که نتیجه آزمون درست نیست!؟ منظورم اینه که تعداد پاسخ های صحیح و غلط و پاسخ داده شده درست نیست، مثلاً کاربر هیچی نزده ولی میگه 1یکی صحیح و مثلاً 3 تا نزده!
خیلی خیلی ممنونم از شما...

----------


## veniz2008

> سلام آقای ونیز
> من خدایش سورس نمیخوام، تا الان هم سعی کردم خودم روی تمام سورس ها کار کنم، فقط الان به یه مشکل جدی خوردم، این محاسبه کننده جواب های صحیح و غلط و بی پاسخ واسه من اشتباه، جواب درست آزمون رو بهم نمیده، واقعاً مغزم داغ کرده اونقدر این کدهای این صفحه رو مرور کردم، دیگه ناامید شدم و گفتم از شما و باقی دوستان کمک بگیرم!
> کدهای این صفحه رو میزارم اگه ممکنه یه نگاه بندازید، خیلی ممنون میشم اگه کمک کنید،(کدهای فرم آزمون)
> 
>         private void BtnNext_Click(object sender, EventArgs e)
>         {
>             sahih = 0;
>             ghalat = 0;
>             bipasokh = 0;
> ...


سلام دوست عزیز.
مشکل از جایی شروع میشه که ما یه کدی رو بدون اینکه منطقی براش داشته باشیم اضافه می کنیم.
هیچ اشکالی نداره که شما بخواید کدهای درون ویدئوها رو دستخوش تغییرات کنید (نه تنها ایرادی نداره که بسیار کار خوبی هم هست) فقط باید برای هر قطعه کدی که اضافه می کنیم دلیل داشته باشیم و خوب بررسی کنیم آیا این یه خطی که من اضافه میکنم جایی تاثیر گذار هست یا که خیر.
در دکمه Next شما تغییراتی رو لحاظ کردید که تاثیر گذار هست. وقتی کاربر روی دکمه بعدی کلیک میکنه شما میاید مقادیر متغیرهای صحیح، بی پاسخ و غلط رو 0 می کنید. خوب این کار یعنی چی؟ ما که نباید مقادیر این متغیرها رو از بین ببریم.
یه بار دیگه ویدئوی 10 و بخش کدنویسی دکمه next رو با کدهای خودتون مقایسه کنید.
موفق باشید.

----------


## ahmad002

> سلام دوست عزیز.
> مشکل از جایی شروع میشه که ما یه کدی رو بدون اینکه منطقی براش داشته باشیم اضافه می کنیم.
> هیچ اشکالی نداره که شما بخواید کدهای درون ویدئوها رو دستخوش تغییرات کنید (نه تنها ایرادی نداره که بسیار کار خوبی هم هست) فقط باید برای هر قطعه کدی که اضافه می کنیم دلیل داشته باشیم و خوب بررسی کنیم آیا این یه خطی که من اضافه میکنم جایی تاثیر گذار هست یا که خیر.
> در دکمه Next شما تغییراتی رو لحاظ کردید که تاثیر گذار هست. وقتی کاربر روی دکمه بعدی کلیک میکنه شما میاید مقادیر متغیرهای صحیح، بی پاسخ و غلط رو 0 می کنید. خوب این کار یعنی چی؟ ما که نباید مقادیر این متغیرها رو از بین ببریم.
> یه بار دیگه ویدئوی 10 و بخش کدنویسی دکمه next رو با کدهای خودتون مقایسه کنید.
> موفق باشید.


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

----------


## veniz2008

> از صبر و حوصلتون بسیار ممنونم...


 :گریه: 



> کدهایی که باعث میشد مقدار متغییر های صحیح، بی پاسخ و غلط صفر بشه رو برداشتم، ولی متاسفانه  هنوز هم جواب صحیح رو بهم نمیده!


این کدهای فرم آزمون. بررسی کنید ببینید کجا رو اشتباه نوشتید :

imgcode1.JPG

imgcode2.JPG

imgcode3.JPG

----------


## esafb52

با سلام به جناب ونیز 2008 و تشکر از زحماتشون 
من پیشنهاد میدم اگه قراره کدی رو هم بذارین عکس از اون قطعه کد بذارین تادوستان حداقل یکبار کد رو تایپ کنند قطعا بعدها از این کار نتیجه بهتری خواهند گرفت 
موفق باشی

----------


## esmaeilbf

با زدن دکمه بعدی nullException میده!!!
چند بارم فیلم رو دیدم نمیدونم مشکل از کجاست این سورس صفحه آزمون:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Data.SqlClient;
namespace MyAzmoon
{
    public partial class frmExam : Form
    {
        int num = 0;
        public  int myTime = 0;
        DataTable dt;
        int k = 0;
        int sahih, bipasokh, ghalat;
        ListBox myList = new ListBox();

        SqlConnection con = new SqlConnection("server = (local);DataBase = DBAzmoon;Integrated Security = True");
        public frmExam()
        {
            InitializeComponent();
        }
        //this method uncheck all of radio button in a parent ex:groupBox1
        public void UncheckedRadioButton(Control parent)
        {
            foreach (Control ctrl in Parent.Controls)
            {
                if(object.ReferenceEquals(ctrl.GetType() , typeof(RadioButton)))
                {
                    ((RadioButton )ctrl).Checked = false;
                }
            }
        }
        private void label1_Click(object sender, EventArgs e)
        {

        }

        private void frmExam_Load(object sender, EventArgs e)
        {
            
            SqlDataAdapter da = new SqlDataAdapter("SelectAllGroup", con);
            da.SelectCommand.CommandType = CommandType.StoredProcedure;
            DataTable dt = new DataTable();
            da.Fill(dt);
            cmbGroup.DataSource = dt;
            cmbGroup.DisplayMember = "GroupName";
            cmbGroup.ValueMember = "GroupID";
            //
            UncheckedRadioButton(groupBox2);

        }

        private void btnShow_Click(object sender, EventArgs e)
        {
            if (string.IsNullOrWhiteSpace(textBoxQuestionNumber.T  ext))
            {
                errorProvider1.SetError(textBoxQuestionNumber, "تعداد سوالات را وارد نمایید");
            }
            else if (string.IsNullOrWhiteSpace(cmbGroup.Text))
            {
                errorProvider1.SetError(cmbGroup, "گروه امتحانی بایستی وارد شود");
            }
            else
            {
                errorProvider1.SetError(textBoxQuestionNumber, "");
                SqlCommand cmd = new SqlCommand("CheckQuestionNumber", con);
                cmd.CommandType = CommandType.StoredProcedure;
                cmd.Parameters.AddWithValue("@groupid", cmbGroup.SelectedValue);
                cmd.Parameters.AddWithValue("@questionnumber", textBoxQuestionNumber.Text);
                cmd.Parameters.Add("@result", SqlDbType.Int);
                cmd.Parameters["@result"].Direction = ParameterDirection.Output;
                con.Open();
                cmd.ExecuteNonQuery();
                con.Close();
                int res = Convert.ToInt32(cmd.Parameters["@result"].Value);
                if (res == 0)
                {
                    MessageBox.Show("تعداد سوالات موجود در بانک اطلاعاتی از تعداد سوالات مد نظر کمتر است");
                }
                else if(res==1)
                {
                    SqlDataAdapter da = new SqlDataAdapter();
                    da.SelectCommand = cmd;
                    dt = new DataTable();
                    da.Fill(dt);
                    //
                    ListBox myListResult = new ListBox();
                    while (myListResult.Items.Count   < Convert.ToInt32(textBoxQuestionNumber.Text.Trim())  )
                    {
                        //یک عدد رندوم بر اساس تعداد سوالاتی که از دیتابیس واکشی شده تولید میکند
                        Random rand = new Random();
                        num =  rand.Next(Convert.ToInt32(dt.Rows[0][0].ToString()),Convert.ToInt32(dt.Rows[dt.Rows.Count-1][0].ToString()));

                        //به تعداد سوالات موجود در دیتا تیبل چک  میکنیم
                       for (int i = 0; i < dt.Rows.Count; i++)
                       {
                           // که آیا عدد رندوم تولیدی درون دیتا تیبل موجود هست و معتبر می باشد
                           if (num == Convert.ToInt32(dt.Rows[i][0].ToString()))
                           {
                               //اگر لیست باکس خالی بود که عدد رو اضافه کن
                               if (myListResult.Items.Count == 0)
                                   myListResult.Items.Add(num);
                               //اگر نبود
                               else
                               {
                                   //به تعداد اعضای لیست باکس چک میکنیم
                                   for (int j = 0; j < myListResult.Items.Count; j++)
                                   {
                                       //عدد تکراری نباشد اگر بود حلقه را به پایان ببرد
                                       if (num == Convert.ToInt32(myListResult.Items[j]))
                                           j = myListResult.Items.Count;
                                       else
                                       {
                                           //اگر حلقه با آخر رسید عدد تصادفی را  داخل لیست باکس قرار بده
                                           if (j == myListResult.Items.Count - 1)
                                           {
                                               myListResult.Items.Add(num);
                                               
                                           } 
                                       }

                                   }
                               }

                           }

                       }
                       
                    }//end while
                    string s = "";
                    for (int i = 0; i < myListResult.Items.Count; i++)
                    {
                        s += myListResult.Items[i] + ",";
                    }

                    s = s.Remove(s.Length - 1, 1);
                    //

                    da = new SqlDataAdapter("SelectFilterQuestion", con);
                    da.SelectCommand.CommandType = CommandType.StoredProcedure;
                    da.SelectCommand.Parameters.AddWithValue("@listQue  stionNumber",s);
                    dt = new DataTable();
                    da.Fill(dt);
                    //
                    if (chkLimitTime.Checked == true)
                    {
                        timer1.Start();
                        lblTimer.Text = (dt.Rows.Count * Properties.Settings.Default.QuestionTime).ToString  ();
                    }
                    if (chkLimitTime.Checked == false)
                    {
                        timer1.Stop();
                        lblTimer.ResetText();
                    }
                    k = 0;
                    lblQuestion.Text = dt.Rows[0]["QuestionText"].ToString();
                    RdbCase1.Text = dt.Rows[0]["Case1"].ToString();
                    RdbCase2.Text = dt.Rows[0]["Case2"].ToString();
                    RdbCase3.Text = dt.Rows[0]["Case3"].ToString();
                    RdbCase4.Text = dt.Rows[0]["Case4"].ToString();
                    for (int i = 0; i < dt.Rows.Count; i++)
                    {
                        myList.Items.Add(0);
                    }
                   
                }

            }
        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            
            myTime = Convert.ToInt32(lblTimer.Text);
            myTime--;
            lblTimer.Text = myTime.ToString();
            if (myTime == 0)
            {
                timer1.Stop();
            }
        }

        private void btnNext_Click(object sender, EventArgs e)
        {
            if(!RdbCase1.Checked && !RdbCase2.Checked && ! RdbCase3.Checked && !RdbCase4.Checked)
            {
                myList.Items[k] = 0;
            }
            else if (RdbCase1.Checked)
            {
                myList.Items[k] = 1;
            }
            else if (RdbCase2.Checked)
            {
                myList.Items[k] = 2;
            }
            else if (RdbCase3.Checked)
            {
                myList.Items[k] = 3;
            }
            else if(RdbCase4.Checked)
            {
                myList.Items[k] = 4;
            }
            if (k == dt.Rows.Count-1)
            {
                for(int i = 0; i<dt.Rows.Count; i++)
                    {
                        if (Convert.ToInt32(myList.Items[i].ToString()) == Convert.ToInt32(dt.Rows[i]["Answer"].ToString()))
                        {
                            sahih++;
                        }
                        else if (Convert.ToInt32(myList.Items[i].ToString()) != Convert.ToInt32(dt.Rows[i]["Answer"].ToString()))
                        {
                            ghalat++;
                        }
                        else
                        {
                            bipasokh++;
                        }
                    }
            }
            else
            {
                k++;
                lblQuestion.Text = dt.Rows[k]["QuestionText"].ToString();
                RdbCase1.Text = dt.Rows[k]["Case1"].ToString();
                RdbCase2.Text = dt.Rows[k]["Case2"].ToString();
                RdbCase3.Text = dt.Rows[k]["Case3"].ToString();
                RdbCase4.Text = dt.Rows[k]["Case4"].ToString();
                UncheckedRadioButton(groupBox2);
            }
        }
    }
}


به حلقه ی foreach خطا میگیره همونجایی که متدی برای غیرفعال کردن چکباکس ها نوشتید: :متفکر: 
Object reference not set to an instance of an object.!!!!!

----------


## FastCode

برای اینکه parent رو با P نوشتید.باید با p مینوشتید.

----------


## ahmad002

> این کدهای فرم آزمون. بررسی کنید ببینید کجا رو اشتباه نوشتید :
> 
> imgcode1.JPG
> 
> imgcode2.JPG
> 
> imgcode3.JPG


هیچ کجا اشتباه نبود، دوباره فیلم رو میبینم شاید درست شد!

----------


## bitcob589

با سلام
چگونه می توانیم  به ترتیب سوالهای غلط و صحیح و بی پاسخ را  در فرم دیگر  نمایش دهیم

----------


## veniz2008

> با سلام
> چگونه می توانیم  به ترتیب سوالهای غلط و صحیح و بی پاسخ را  در فرم دیگر  نمایش دهیم


سلام.
توی آموزش هم ما همین کار رو انجام دادیم.
با استفاده از سه متغیر static و البته public ، در فرم مقصد به مقدار این سه متغیر دسترسی پیدا کردیم.
شاید هم منظورتون، نمایش خود سوالات هست!. اینکه کدوم سوال رو اشتباه زده و کدوم رو درست.
اگر جواب شما، چیزی خارج از محدوده آموزش هست، لطفا بصورت کامل سوالتون رو مطرح کنید تا پاسخگو باشم ولی چیزی که من از سوالتون متوجه شدم دقیقا داخل آموزش وجود داره.

----------


## bitcob589

> سلام.
> توی آموزش هم ما همین کار رو انجام دادیم.
> با استفاده از سه متغیر static و البته public ، در فرم مقصد به مقدار این سه متغیر دسترسی پیدا کردیم.
> شاید هم منظورتون، نمایش خود سوالات هست!. اینکه کدوم سوال رو اشتباه زده و کدوم رو درست.
> اگر جواب شما، چیزی خارج از محدوده آموزش هست، لطفا بصورت کامل سوالتون رو مطرح کنید تا پاسخگو باشم ولی چیزی که من از سوالتون متوجه شدم دقیقا داخل آموزش وجود داره.
> ---------------------------------------------------------------------------------------
> توجه :
> دوستان عزیز در بعضی از پست ها که دوستان یا تشکر میکنن یا پستی رو میذارن که جواب فنی نداره، از پاسخ دادن اجتناب میکنم.
> متاسفانه در بعضی از مدیران تالار، روندی وجود داره که رفتار غرض ورزانه و سلیقه ای رو در پیش گرفتن و به بهانه های الکی و مضحک (که خودشون بارها همون کارها رو میکنن) اقدام به جریمه و حذف پست میکنن.
> ...


منظورم خود سوالات است با جواب صحیح و غلط

----------


## veniz2008

> منظورم خود سوالات است با جواب صحیح و غلط


برای این کار دیتاتیبل سوالات رو بصورت public static تعریف کنید.
بعد از اینکه کاربر جواب همه سوالات رو داد یک ستون به دیتاتیبل اضافه کنید. مثلا ستون result :
dt.Columns.Add("result");
حالا، با یک حلقه for که به تعداد سطرهای دیتاتیبل (تعداد سوالات) هست بین جواب صحیح سوال (فیلد Answer) و جوابی که کاربر داده (همون MyListAnswer) یک مقایسه انجام بدید. اگر با هم برابر بودن مثلا عبارت "صحیح" رو به ستون result اضافه کنید.
dt.Columns.Add("result");
           for (int i = 0; i < dt.Rows.Count; i++)
                {
                    if (Convert.ToInt32(mylistanswer.Items[i]) == Convert.ToInt32(dt.Rows[i]["Answer"].ToString()))
                    {
                        sahih++;
                        dt.Rows[i]["result"] = "صحیح";
                    }
                    else if (Convert.ToInt32(mylistanswer.Items[i]) == 0)
                    {
                        bipasokh++;
                        dt.Rows[i]["result"] = "بی پاسخ";
                    }
                    else if (Convert.ToInt32(mylistanswer.Items[i]) != Convert.ToInt32(dt.Rows[i]["Answer"].ToString()))
                    {
                        ghalat++;
                        dt.Rows[i]["result"] = "اشتباه";
                    }
                }
 حالا در فرم مقصد، همونطوری که به متغیرها دسترسی داریم می تونید به دیتاتیبل هم دسترسی داشته باشید.

----------


## علی متقی پور

با سلام

جسارتا میتونم بپرسم چرا برنامه با EF و Linq نوشته نشده؟

یعنی شما دیگران رو تشویق مکینید که از Ado.net و Sp ها استفاده کنند؟

در صورت عدم تمایل میتونید پاسخ ندید

با تشکر

----------


## FastCode

> با سلام
> 
> جسارتا میتونم بپرسم چرا برنامه با EF و Linq نوشته نشده؟
> 
> یعنی شما دیگران رو تشویق مکینید که از Ado.net و Sp ها استفاده کنند؟
> 
> در صورت عدم تمایل میتونید پاسخ ندید
> 
> با تشکر


 علتش رو یک بار توضیح دادن.به خاطر abstraction زیاد این تکنولوژی ها نمیشه مبانی رو آموزش داد.

----------


## veniz2008

سلام دوستان.
با عذر خواهی از مدیریت تالار بخاطر این پست فاقد محتوا.
این چند وقت شرایط به گونه ای رقم خورده که به این نتیجه رسیدم که مدتی در خدمت دوستان نباشم و در تالار فعالیت نداشته باشم.
امیدوارم در غیاب من،دوست عزیزم جناب FastCode و جناب esafb52 به پرسش های دوستان پاسخ بدن بلکه گره ای از مشکل یه شخص باز بشه.
شاد و موفق و سربلند باشید.

----------


## hosseines

با سلام خدمت دوستان
من از اس کیول 2000 استفاده کردم ولی به یک مشکل برخوردم لطفا راهنمایی کنید.
create proc CheckQuestionNumber1
@groupid int,
@questionnumber int,
@result int output
as
declare @totalQuestion int 
select @totalQuestion=count(*) from TblQuestion
where GroupId=@groupid 

if(@questionnumber>@totalQuestion)
set @result=0
else 
begin
set @result=1
select Top '@questionnumber' * FROM TblQuestion
where GroupId=@groupid
order by newid()
end

ارور:
Server: Msg 170, Level 15, State 1, Procedure CheckQuestionNumber1, Line 15
Line 15: Incorrect syntax near '@questionnumber'.

----------


## esafb52

> با سلام خدمت دوستان
> من از اس کیول 2000 استفاده کردم ولی به یک مشکل برخوردم لطفا راهنمایی کنید.
> create proc CheckQuestionNumber1
> @groupid int,
> @questionnumber int,
> @result int output
> as
> declare @totalQuestion int 
> select @totalQuestion=count(*) from TblQuestion
> ...


با سلام و ابتدا کسب اجازه از استادو دوست عزیز ونیز2008 و سلام به شما دوست عزیز دستور تاپ رو فکر کنم اشتباه نوشتی و باید پرانتز میگذاشتین به هرحال من این  کوئری رو برات میذارم
USE [DBAZMOON]
GO
/****** Object:  StoredProcedure [dbo].[CHECKquestonCount]    Script Date: 11/07/2013 11:23:36 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROC [dbo].[CHECKquestonCount]
@groupid INT ,
@questioncount INT ,
@result INT OUTPUT
AS
DECLARE @totoalquestion INT
SELECT @totoalquestion = COUNT (*) FROM TBLQUSETION WHERE GROUPID=@groupid
IF (@questioncount > @totoalquestion)
BEGIN
SET
 @result=0
END
ELSE
BEGIN
set @result=1
SELECT TOP(@questioncount) * FROM TBLQUSETION WHERE GROUPID=@groupid
ORDER BY NEWID()
END    
RETURN

----------


## FastCode

مشکل پرانتز نگذاشتن نیست
مشکل گذاشتن دو تا single quote (') هست

----------


## hosseines

سلام
با دستور TOP(@questioncount) باز ارور زیر رو میده.
Incorrect syntax near '('.

----------


## hosseines

سلام 
شرمنده باز ارور میده
 Incorrect syntax near '('.

----------


## FastCode

سلام.
پرانتز ها رو بردارید و جاشون فاصله بزارید

----------


## asrah6

سلام  
من قسمت بکاپ گیری را طبق فیلم آموزشی پیش رفتم و در ویندوز 7 با VS 2010 و  sqlserver 2008 کار می کنم در ضمن ویندوز را در درایو D نصب کرده ام  بعد از اجرای فرم بکاپ یک پوشه روی دسکتاپ به نام test backup ساختم و نامی که برای فایل بکاپ انتخاب کردم back1 گذاشتم و سپس بر روی باتن پشتیبان گیری کلیک کردم تا عملیات پشتیبان گیری شروع شود ولی ارور زیر را داد در ضمن در درایو های دیگر مشکلی با پشتیبان گیری نداشتم

----------


## hosseines

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

----------


## FastCode

علتش اینه که کاربر SQL به پوشه شخصی کاربر دسترسی نداره.
یا engine رو یا کاربر سیستم اجرا کنید یا دسترسی پوشتون رو باز کنید.
برای اولی باید از SQL Server configuration manager یا Service Manager استفاده کنید.
برای دومی باید در مشخصات پوشه در قسمت دسترسی سطح دسترسی کاربر SQL یا System users یا Authenticated users یا everyone رو باز کنید.
پ.ن.:شاید یکی دو تا از اسم ها رو اشتباه نوشته باشم.خیلی وقته که از این کارها نکردم.

----------


## esafb52

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


با سلام مطمن باشین که جایی رو دارین درست تایپ نمکیین پیشنهاد من اینه که برنامه اس کیول اسیستنت رو نصب کن بهت در کد نویسی کمک میکنه یا ای کیو ال پرمپت

----------


## hosseines

دوست عزیز این برنامه رو از کجا دانلود کنم

----------


## esafb52

بفرما دوست عزیز
http://www.softgozar.com/WebPage/Dow...2013.1.8.2.372

----------


## veniz2008

سلام.
در ویدئوی اول بن دقایق 40 تا 42 یک مطلب رو به اشتباه اعلام کرده بودم که ضمن پوزش از دوستان مطلب صحیح رو اعلام میکنم.
در  اونجا گفته شده بود که در محیط ویژوال استودیو، در خط آخر stored  procedure به جای کلمه go بایستی از کلمه return استفاده کرد که در واقع  این مورد صحیح نیست و سبک stored procedure نوشتن در هر دو محیط یکسان هست.
توضیح اضافه اینکه :
return اساسا برای اطلاع از اجرای موفقیت آمیز یا عدم اجرای موفقیت آمیز   SP استفاده میشه که یک مقدار با خودش بر میگردونه. مقدار 0 به معنای موفقیت و 1-   به معنای عدم موفقیت هست البته این اعداد قراردادی هست.
نکته بعدی اینکه به محض اینکه return در  SP اجرا میشه کار اون هم تمام  خواهد شد.(یعنی اگر قطعه کدی بعد از Return وجود داشته باشه دیگه اجرا  نخواهد شد). 
به عبارتی return رو هر جایی از  پروسیجر می تونیم بگذاریم.
پس چه در Express و چه در غیر اون این دستور فرقی نداره و نحوه نوشتن sp یکسان هست. 
موفق باشید.

----------


## bitcob589

در ویدئو یک عدد menuStrip در صفحه اصلی گذاشته شد و منو فقط در همان صفحه قابل مشاهده بود آیا این امکان وجود دارد که منو در تمام صفحات قابل مشاهده باشد

----------


## kasraaa

در مورد حرف دوست خوبمون    esafb52  نباید و بحث هایی که شده سورس کد را در اختیار مبتدی ها گذاشت اما مبتدی ها اگه میخوان پیشرفت کنن خودشان دانلود نکنن این بنظر من بهتره چون هیچ کسی تا میتونه به ضرر خودش کار نمیکنه

----------


## mehdiomnia

واقعا نمیدونم چطوری تشکر کنم از این ویدئوهاتون واقعا نمیدونم ها یعنی اصلا زبان نمیتونه بیان کنه 
من 16 ویدئو رو دو شبه دیدم و برای بار دوم هست دارم میبینم واقعا نکات عالی توشون هست
یک سوال : برای شبکه کردن از همین راهی که فرمودید این از طریق شبکه داخلی بود برای نت هم همین وضعه درسته فرقش اینه بجای اون آی پی مثلا آی پی ولید که خریداری شده ست میشه روش درسته ؟
سوالم اینجاست شاید البته به مفاهیم شبکه برگرده ولی آی پی که ولید هست و میخریم و روی سرور ست میکنیم در شبکه داخلی هم سرور از طریق همون آی پی در دسترس خواهد بود ؟ یا برای اینکه یک نرم افزار در شبکه داخلی و خارجی کار کنه باید از دو رنج آی پی استفاده کرد ؟ چون اونطور که من میدونم آی پی ولید که میخری خوده سرویس دهنده وب رو سیستمش برات کانفیگ میکنه پس عملا سرور ما اون آی پی رو نداره پس اگر نرم افزاری رو روی اون ست کنی و اینترنت قطع بشه ولی نرم افزار از طریق شبکه داخلی به سرور دسترسی داشته باشه اون موقع چی ؟

----------


## FastCode

جست وجو کنید:Port forwarding
Edit:ببخشید اشتبها یک چیز دیگه نوشته بودم که دیر متوجه شدم که ویرایش نشده.

----------


## reza93509350

سلام
ضمن تشکر و قدر دانی ازveniz2008 بخاطر آموزشهای مفید و کاربردی ویدویی که در این بخش قرار دادید
کاربر مبتدی هستم، در بخش اول آموزش قسمت اتصال به دیتابیس زمانی که در ویژوال برنامه را اجرا نمودم و فیلد را پر کردم هنگامی که دکمه ثبت را می زنم ،در بخش کدنویسی خط con.Open را به حالت زرد رنگ در می اورد
کد نوشته شده:

            {
                errorProvider1.SetError(textname, "نام را حتماوارد کنید");
            }
            else
            {
                //errorProviderجهت خالی نمودن 
                errorProvider1.SetError(textname, "");
                //اتصال به دیتابیس
                SqlConnection con = new SqlConnection("server = .\\REZA; DataBase = DBestelam;integrated security = true");
                //ارتباط با نام استرو پروسجر دیتابیس
                SqlCommand cmd = new SqlCommand("sabt", con);
                cmd.CommandType = CommandType.StoredProcedure;
                //قرار دادن تکست نام ویژوال برروی فیلد نام دیتابیس
                cmd.Parameters.AddWithValue("@name", textname.Text);
                con.Open();
                //اجرا شدن دستور دیتابیس
                cmd.ExecuteNonQuery();
                con.Close();
                MessageBox.Show("با موفقیت ثبت و دخیره شد");
            }

----------


## esafb52

دوست عزیز اشکال از رشته اتصال به سرورت هست اون رو باید درست وارد کنی

----------


## reza93509350

دوست گرامی ممنون از جوابتون اگه میشه یکم بیشتر توضیح بدین

----------


## esafb52

دوست عزیز خطای شما میگه آدرس سرور رو اشتباه نوشتین باید اون رو اصلاح کنیین شما از چه نسخه sql استفاده میکنین

----------


## kasraaa

> دوست عزیز خطای شما میگه آدرس سرور رو اشتباه نوشتین باید اون رو اصلاح کنیین شما از چه نسخه sql استفاده میکنین


در مورد حرف دوست خوبمون esafb52 نباید و بحث هایی که شده سورس کد را در اختیار مبتدی ها گذاشت اما مبتدی ها اگه میخوان پیشرفت کنن خودشان دانلود نکنن این بنظر من بهتره چون هیچ کسی تا میتونه به ضرر خودش کار نمیکنه

----------


## reza93509350

sql2088-R2
همان اسمی که موقع کانکت اسکول می زنیم وارد کردم ولی قبول نمی کنه
آدرس دقیق سرور رو چطور می تونم ببینم

----------


## esafb52

با سلام ما اگر دیتابیس خود رو بروی سرور ساخته اید مطابق با آموزش ها پس این مکراحل رو انجام بدین
1-از سربرگ دیتا add new data source
2-همون گزینه دیتابیس رو نکس بزنید
3-باز یک نکس(دیتاست انتخاب شده)
4-بعد گزینه new connection
5- بعد هم microsoft sql server
6-بعد در تکس باکس دومی کلیک کن تا اسم سرور نمایش داده بشه 
7-و از قسمت پایین اسم دیتابیست رو انتخاب کن بعدش اوکی و در قسمت پایین میبینی که رشته اتصال ساخته شده فقط کافیه کپی و پیست بشه 
موفق باشی

----------


## hosseines

سلام 
موقع ریستور کردن با ارور زیر برخورد می کنم علتش چی می تونه باشه.
User must be in the master database.
ALTER DATABASE statement failed.
Exclusive access could not be obtained because the database is in use.
RESTORE DATABASE is terminating abnormally.
User must be in the master database.
ALTER DATABASE statement failed.

----------


## FastCode

قبل از restore با دستور USE [MASTER] دیتابیستون رو عوض کنید.

----------


## hosseines

دوست عزیز 
کجا و چجوری باید عوض کنم؟

----------


## FastCode

قبل از اجرای دستور restore باید این دستور رو اجرا کنید.

----------


## hosseines

دوست عزیز ببخشد دستور رو اضافه کردم ولی نشد ببین درست نوشتم؟

create proc MyRestor
@pathFile nvarchar(400)
as
Alter DataBase DBAzmoon set Offline with rollback IMMEDIATE 
use [DBAzmoon]
restore DataBase DBAzmoon From disk = @pathFile with replace
alter DataBase DBAzmoon set online

GO
ارور

Server: Msg 154, Level 15, State 1, Procedure MyRestor1, Line 5
a USE database statement is not allowed in a procedure or trigger.

----------


## FastCode

گفتم قبل از دستور نه وسطش

----------


## hosseines

شرمنده دوست عزیز من هر جا که دستور رو میزارم ارور میده لطف می کنید دقیق بگید کجاش بنویسم.

create proc MyRestor1
@pathFile nvarchar(400)
as
use [DBAzmoon]
Alter DataBase DBAzmoon set Offline with rollback IMMEDIATE
restore DataBase DBAzmoon From disk = @pathFile with replace
alter DataBase DBAzmoon set online
GO

----------


## FastCode

اوله اوله اول.
این پراسیجر باید توی دیتابیس مستر ایجاد بشه.
چرا نوشتید USE DBAzmoon?باید بنویسید USE MASTER

----------


## hosseines

خب یعنی پراسیجر تو دیتابیس مستر ایجاد کنم یه مشکل پیش میاد که موقع ریستور کردن باید نام دیتابیس کانکشن رو به مستر تغییر بدم؟
بعد یه سوال داشتم یا بهترین روش برای برنامه نویسی بانک اطلاعاتی همین روش می باشد یعنی از طریق پراسیجرها عملیات انجام بگیره یا نه کدهای دیتابیس رو در سی شارپ بنویسیم و در بانک اطلاعاتی فقط دیتاتیبل ایجاد کنیم؟

----------


## FastCode

> خب یعنی پراسیجر تو دیتابیس مستر ایجاد کنم یه مشکل پیش میاد که موقع ریستور کردن باید نام دیتابیس کانکشن رو به مستر تغییر بدم؟
> بعد یه سوال داشتم یا بهترین روش برای برنامه نویسی بانک اطلاعاتی همین روش می باشد یعنی از طریق پراسیجرها عملیات انجام بگیره یا نه کدهای دیتابیس رو در سی شارپ بنویسیم و در بانک اطلاعاتی فقط دیتاتیبل ایجاد کنیم؟


سوال اول که جوابش مثبته.
در مورد سوال دوم باید بگم یک مقدار سلیقه ایه.البته در مقیاس بالا این انتخاب تفاوت بسیار زیادی در سرعت ایجاد میکنه که با مطالعه در مورد اینکه SQL چطوری SP ها رو کامپایل میکنه و چه تصمیمگیریهایی موقع compile کردن SP و query معمولی توسط MSSQL گرفته میشه میتونید برای هر query این انتخاب رو درست انجام بدید.من خودم به دلایل دیگه مثل interoperability با دیتابیس های دیگه و cross-platform و cross-database بودن برنامه هام همیشه محاسبات رو در برنامه انجام میدم و کلا از sql استفاده نمیکنم.شما هم بهتره فعلا با توجه به نیازتون و راحتی کد نویسی این انتخاب رو انجام بدین.بعدا که تعداد سطرهای پروژه هاتون مقیاس میلیونی و میلیاردی گرفت زمان و داده آزمایشی کافی برای تصمیمگیری خواهید داشت.

----------


## hosseines

ممنون از راهنمایی تون دوست عزیز

----------


## Iran58

باسلام
  فرض كنيد برنامه را تحت شبه كرده ايم
  و دوكاربر كه يك سطح دسترسي دارند مي خواهند در جدول نام گروهي را وارد كنند همزمان 
  حال چه كدي بنويسم بين اين دو ثبت همزمان جند ثانيه اختلاف بذارم تا مشكلي در ثبت همزمان پيش نياييدو يااگر تكراري بود پيام تكراري بودن را نشان بدهد

----------


## matrix-program

> باسلام
>   فرض كنيد برنامه را تحت شبه كرده ايم
>   و دوكاربر كه يك سطح دسترسي دارند مي خواهند در جدول نام گروهي را وارد كنند همزمان 
>   حال چه كدي بنويسم بين اين دو ثبت همزمان جند ثانيه اختلاف بذارم تا مشكلي در ثبت همزمان پيش نياييدو يااگر تكراري بود پيام تكراري بودن را نشان بدهد


پیشنهاد من این است که برای هر تیبل یک متغیر بولین تعریف کنید برای غیر قابل تغییر بودن که هر وقت کاربر تغییر ایجاد کرد به مدت پنج ثانیه ترو بشود
در ضمن سوالتون رو بد جا پرسیدید
لطفا تاپیک آقای ونیز 2008 رو شلوغ نکنید اینجا محل مطرح سوالات و نظرات برای آموزش ایشونه

----------


## FastCode

> پیشنهاد من این است که برای هر تیبل یک متغیر بولین تعریف کنید برای غیر قابل تغییر بودن که هر وقت کاربر تغییر ایجاد کرد به مدت پنج ثانیه ترو بشود
> در ضمن سوالتون رو بد جا پرسیدید
> لطفا تاپیک آقای ونیز 2008 رو شلوغ نکنید اینجا محل مطرح سوالات و نظرات برای آموزش ایشونه


 این روش هیچ خاصیتی نداره.
برای این کار چند راه دارید.
۱. serializable transaction
۲.stored procedure
۳.uuid primary key
و چند تای دیگه.
هر کدوم رو که دوست دارید بگید توضیح بدم.(در یک تاپیک دیگه)

----------


## FastCode

باید معذرت خواهی کنم چون متاسفانه ۹ تا از فایل های درون سرور من به علت خرابی هارد دیسک سرور آسیب دیده بودند که تعمیر شده و به حالت اول بازگردانده شدند.
برای  تعمیر فایلهای خود از این راهنما استفاده  کنید:
http://arvind-tech.blogspot.de/2012/...ete-files.html
۱.ابتدا تورنت مربوطه رو دانلود میکنید.
۲.سپس تورنت را شروع میکنید.
۳.تورنت را متوقف میکنید.
۴.فایلهای خراب را به جای فایلهای نیمه دانلود شده میگزارید(overwrite)
۵.ترونت را verify میکنید.
۶.تورنت را استارت میکنید.

باز هم معذرت میخوام.با اینکه ایراد سختافزاری بود باید زودتر متوجه میشدم.تقریبا به مدت ۳۰ ساعت فایلهای روی سرور خراب بودند.
فایلهای خراب:
فایل های تبدیل شده به شماره های:
1v1
۱
۲
۱۰
۱۶
و
فایلهای تبدیل نشده اصلی به شماره های:
۴
۵
۶
۷
واقعا معذرت میخوام.

----------


## dashkeyvan

> سلام دوست عزیزم.
> ممنونم از اینکه اولین نظر رو شما دادید.
> این ویدئوها بصورت کامل آماده شدن ولی در ارتباط با پیشنهادتون :
> هدف اصلی این آموزش ها مخاطبان مبتدی هست و تلاش میشه که این مخاطبان تا حد متوسطی از لحاظ کدنویسی بالا کشیده بشن.
> باور بفرمایید اگر برای یک مبتدی که هنوز با مفاهیم آشنا نیست من برم سراغ چند لایه نوشتن، چیزی رو یاد نخواهد گرفت. چند لایه آموزش دادن برای کسانی مفید خواهد بود که با مباحث اولیه آشنایی دارند.
> 
>  سلام دوست من.
> ممنونم که نظر دادید.
> نظر من متفاوت با نظر شما هست.
> ...



ایولا خوشم اومد منم خودم همین تفکر رو دارم و مطمئن هستم فردی با این تفکر به هر مقامی برسه حقشه دمت گرم فیلم هارو هم استفاده کردیم و لذت بردیم نکات مفیدی توش بود

----------


## حميدسي شارپ

> باید معذرت خواهی کنم چون متاسفانه ۹ تا از فایل های درون سرور من به علت خرابی هارد دیسک سرور آسیب دیده بودند که تعمیر شده و به حالت اول بازگردانده شدند.
> برای  تعمیر فایلهای خود از این راهنما استفاده  کنید:
> http://arvind-tech.blogspot.de/2012/...ete-files.html
> ۱.ابتدا تورنت مربوطه رو دانلود میکنید.
> ۲.سپس تورنت را شروع میکنید.
> ۳.تورنت را متوقف میکنید.
> ۴.فایلهای خراب را به جای فایلهای نیمه دانلود شده میگزارید(overwrite)
> ۵.ترونت را verify میکنید.
> ۶.تورنت را استارت میکنید.
> ...


 ------------------------------------
سلام.آقا دشمنت شرمنده.ولي من مبتدي هستم و دانلود كردم همه رو.ولي حالا كه  باز ميكنم ميبينم يه جاهايي از صفحه خرابه.لطفا راهنمايي كنين منو...حالا  كه دانلودشون كردم بايد چيكار كنم؟آخه لينك راهنمايي رو كه دادين خرابه و  باز نميشه.لطفا كاملتر توضيح بدين چطور فايلارو ترميم كنيم؟منظورتون از  اينكه تورنت رو شروع كنيم چيه؟اصلا با چي شروع كنيمشون؟
ممنون

----------


## SEPIDEYESHAB

با سلام و تشکر فراوان بخاطر این آموزش بسیار روان و پر محتوا !

من از قابلیت asynchronous Delegate برای بکاپ گیری برنامه ام استفاده کرده ام اما در CPU های تک هسته ای برنامه اجرا نمیشود  :افسرده: 

لطفا راهنمایی کنید چگونه از این قابلیت در این سیستم ها استفاده کنم !!!

----------


## peiman.oruji

سلام آقا من تا گرفتن پشتیبان رو مثل برنامه آموزشی نوشتم، ولی وقتی دکمه پشتیبان گیری رو میزنم این ارور رو میده:
http://upload7.ir/images/89645944737623497489.jpg

Cannot open backup device C:\program file\microsoft SQlserver\MSSQL.1\MSSQL\Backup\mybackup.bak

مرگ من جواب بدین پروژه پایان ترم میخوام بدمش

----------


## peiman.oruji

سلام وقتی تعداد سوالات رو برابر تعداد سوالات موجود در دیتا بیس در نظر میگیرم برنامه کلا هنگ میکنه. دقیقا تو این حلقه هنگ میکنه:
http://upload7.ir/viewer.php?file=58...6836036070.jpg

----------


## FastCode

اگر فایلها خراب باشند کلا باز نمیشن.
با مدیا پلیر دیگه ای آزمایش کردید؟
این اتفاق دو هفته قبل از پست شما افتاده و از اون موقع فایلها هر ۴۸ ساعت یک بار تست میشن.

----------


## esafb52

> سلام وقتی تعداد سوالات رو برابر تعداد سوالات موجود در دیتا بیس در نظر میگیرم برنامه کلا هنگ میکنه. دقیقا تو این حلقه هنگ میکنه:
> http://upload7.ir/viewer.php?file=58...6836036070.jpg


دوست عزیز بجای عکس متن خطا رو بذارین !!

----------


## peiman.oruji

سلام. خطا نمیده فقط هنگ میکنه.رفتم خط به خط اجراش کردم تو همین حلقه می افته!

----------


## veniz2008

> با سلام و تشکر فراوان بخاطر این آموزش بسیار روان و پر محتوا !
> 
> من از قابلیت asynchronous Delegate برای بکاپ گیری برنامه ام استفاده کرده ام اما در CPU های تک هسته ای برنامه اجرا نمیشود 
> 
> لطفا راهنمایی کنید چگونه از این قابلیت در این سیستم ها استفاده کنم !!!


سلام.
تا اونجایی که بنده اطلاع دارم cpu های تک هسته ای از چند نخی پشتیبانی نمیکنند بنابراین این cpuها،قابلیت های روش های برنامه سازی همزمان (مثل تردها، asynchronous delegate و ...) رو ندارند. بهتره در این زمینه جستجو کنید شاید راه حلی وجود داشته باشه.




> سلام آقا من تا گرفتن پشتیبان رو مثل برنامه آموزشی نوشتم، ولی وقتی دکمه پشتیبان گیری رو میزنم این ارور رو میده:
> http://upload7.ir/images/89645944737623497489.jpg
> 
> Cannot open backup device C:\program file\microsoft SQlserver\MSSQL.1\MSSQL\Backup\mybackup.bak
> 
> مرگ من جواب بدین پروژه پایان ترم میخوام بدمش


 سلام.
دوست عزیز، اگر متن خطا و مسیری رو که درون برنامه وارد کردید با هم مقایسه کنید می بینید که دو مسیر کاملا متفاوت هست. ظاهرا فایل های پشتیبان رو بر روی desktop ذخیره می کنید ولی زمانیکه میخواید فایل رو انتخاب کنید دارید از یک مسیر دیگه (C:\programfiles) استفاده می کنید که متن خطا هم داره بهتون میگه که چنین فایلی در اون مسیر وجود نداره. مسیرهایی رو که درون برنامه وارد می کنید به دقت چک کنید تا مشکلتون برطرف بشه.(شاید دیدن مجدد ویدئو هم بهتون کمک کنه).



> سلام وقتی تعداد سوالات رو برابر تعداد سوالات موجود در دیتا بیس در نظر میگیرم برنامه کلا هنگ میکنه. دقیقا تو این حلقه هنگ میکنه:
> http://upload7.ir/viewer.php?file=58...6836036070.jpg


سلام.
 مشکل بخاطر پارامتر دوم متد رندوم هست. در تابع رندوم ( (rand.next(min,max)  ) همیشه مقدار max رو یکی کمتر در نظر میگیره مثلا اگر min = 1 و max = 10 باشه، یک عدد بین 1 تا 9 برای شما تولید میکنه (اعداد 1 و 9 میتونن جز اعداد تولید شده باشند ولی عدد 10 رو شامل نمیشه). برای رفع این مشکل کافیه به max یکی اضافه کنید یعنی اگر میخواید عدد رندومی بین 1 و 10 تولید کنید که خود اعداد 1 و 10 هم امکان انتخاب شدن داشته باشند بایستی بازه رو بین 1 و 11 انتخاب کنید ( min = 1 و max = 11). 
بنابراین برای رفع مشکلتون به عدد موجود در آخرین سطر دیتاتیبل یکی اضافه کنید. 
کدها رو نسبت به قبل بهینه تر کردم که می تونید از کدهای زیر استفاده کنید :
while (MyListResult.Items.Count < Convert.ToInt32(TxtQuestionNumber.Text.Trim()))
                  {
                         Random rand = new Random();
                        num = rand.Next(Convert.ToInt32(dt.Rows[0][0]), Convert.ToInt32(dt.Rows[dt.Rows.Count - 1][0]) + 1);
                        //
                        for (int i = 0; i < dt.Rows.Count ; i++)
                       {
                            if (num == Convert.ToInt32(dt.Rows[i][0]))
                            {
                                i = dt.Rows.Count;
                                if (MyListResult.Items.Count == 0)
                                    MyListResult.Items.Add(num);
                                 else if (!MyListResult.Items.Contains(num))
                                    MyListResult.Items.Add(num);
                            }
                        }
                    }
موفق باشید.

----------


## m_soheyl_s

*veniz2008* عزیز
متاسفانه هفته ی پیش سایت پرشین گیگ غیر قابل دسترس شد و الان که دوباره راه افتاده فایل های این آموزش پاک شده اند.
خواهشمندم دوباره این فایلها را آپلود نمایید.
با تشکر فراوان از شما.

----------


## esafb52

تو امضا فست کد لینکش هست
http://78.47.35.18/veniz/

----------


## veniz2008

> *veniz2008* عزیز
> متاسفانه هفته ی پیش سایت پرشین گیگ غیر قابل دسترس شد و الان که دوباره راه افتاده فایل های این آموزش پاک شده اند.
> خواهشمندم دوباره این فایلها را آپلود نمایید.
> با تشکر فراوان از شما.


ممنونم که اطلاع دادید.
جناب FastCode زحمت کشیدن و تمام ویدئوها رو دوباره بر روی پرشین گیگ آپلود کردن.
دوستان به مانند سابق می تونن ویدئوها رو دانلود کنن.
با تشکر از جناب FastCode .

----------


## jafarpalideh

با تشكر از Veniz  عزيز باطر اين آموزش ها
يه سوال داشتم :
چطور ميتونيم هنگام وارد كردن داده(مثلا بر اساس گروه ميخوام سوال وارد كنم و هربار كه يه سوال ثبت ميشه فوكوس روي همون گروه بمونه) فوكوس همچنان روي همون كمبوباكسي كه روش هستيم بمونه و نياد روي ايندكس صفر .
البته شرمنده بابت اين سوال .

----------


## veniz2008

> چطور ميتونيم هنگام وارد كردن داده(مثلا بر اساس گروه ميخوام سوال وارد كنم و هربار كه يه سوال ثبت ميشه فوكوس روي همون گروه بمونه) فوكوس همچنان روي همون كمبوباكسي كه روش هستيم بمونه و نياد روي ايندكس صفر .


کافیه که قطعه کد ;CmbGroup.SelectedIndex = 0 رو از درون متد ClearTextBox (یا هر جای دیگه ای که اون کد رو نوشتید) بردارید تا فوکوس روی همون گروه جاری باقی بمونه.
موفق باشید.

----------


## hassan20000

سلام من در قسمت برگزاري آزمون بعداز  اينكه تعداد سوالات و گروه امتحاني را انتخاب كردم بعد نمايش دو سه بار سوالات ، سيستم هنگ مي كند علت چيست ؟
تمام قسمت هاي كد را چك كردم مشكل نداشت

----------


## veniz2008

سلام.
دوست عزیز وقتی خطایی براتون اتفاق می افته باید کدتون رو بذارید تا بشه راهنمایی درستی رو انجام داد. الان با این کار باید دو پست اضافه دیگه هم ایجاد بشه!. یکی برای گذاشتن کد شما و دیگری هم برای جواب من.
بگذریم...
قبل از اینکه کدتون رو بذارید چند تا نکته رو میگم شاشد مشکلتون حل شد :
1. جستجوی سوالات غیر تکراری رو به SQL بسپارید. این کار هم بسیار اصولی تر هست و هم سریعتر.
2. اگر اصرار به جستجوی سوالات در سمت ویژوال و با کدهای سی شارپ رو دارید، حتما توضیحات پست 169 همین تاپیک (چندتا پست بالاتر) رو مطالعه کنید. چون هم دلیل خطا رو توضیح دادم و هم کد بهینه تری رو قرار دادم تا سرعت جستجو و نمایش سوالات افزایش پیدا کنه.
موفق باشید.

----------


## hassan20000

ممنون كه پاسخ داديد 
ولي در قسمت كد هاي زير در اجرا خطا مي گيرد فيلم ها چند با با دقت نگاه كردم ولي مشكل حل نشد 


  public void UncheckRadioButton(Control parent)
        {
            foreach (Control ctrl in Parent.Controls)
            {
                if (object.ReferenceEquals(ctrl.GetType(), typeof(RadioButton)))
                {
                    ((RadioButton)ctrl).Checked = false;
                }
            }
        }

----------


## hassan20000

از اينكه به بهترين شكل ممكن و در نهايت آرامش و باحوصله آموزش داده ايد بسيا ر متشكر و ممنونيم انشااله اين آموزش زكات علم ات باشد 
ديگر اينكه خطا فقط در حرف p  بود كه حل شد  p با حرف كوچك 
  public void UncheckRadioButton(Control parent)
        {
            foreach (Control ctrl in parent.Controls)
            {
                if (object.ReferenceEquals(ctrl.GetType(), typeof(RadioButton)))
                {
                    ((RadioButton)ctrl).Checked = false;
                }
            }
        }

----------


## veniz2008

> با درود و سپاس فراوان به شما آقای ونیز2008 :
> من یه چیزی میخواستم بپرسم ، اینکه کار هایی در سیستم سرور در ویدیوی 16 انجام دادی شما رو می تونیم با کد با Query انجام بدیم ؟


سلام.
عذر میخوام بابت دیر جواب دادن.
واقعیتش اینه که روی کاغذ و بصورت تئوری انجام دادن تمام کارهای sql با استفاده از query امکان پذیر هست! ولی در عمل بعضی از موارد میتونه دشوار باشه (من خودم بعضی هاش رو انجام ندادم مثل همون قسمت SQL Server Configuration Manager) ولی بعضی دیگه از موارد مثل ساخت user و دادن سطح دسترسی و ... کار راحت تری هست.
ولی در عمل معمولا در سیستم های کلاینت - سروری نیاز خواهید داشت که حداقل یکبار رو بصورت دستی به تنظیم خصوصیات و ریزه کاری ها بپردازید (یا حضوری یا از راه دور (مثل استفاده از Teamviewer)).
موفق باشید.

----------


## حمیدرضا1

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

----------


## حمیدرضا1

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

----------


## veniz2008

> سلام خدمت ونیز عزیز که این آموزش ها رو زحمت کشیدن و گذاشتن.من تا ویدیو ی شیشم دیدم.به نظرتون بهتر نیست دست کاربر رو خیلی باز نگذاریم.مثلا وقتی در فرم سوالات روی گرید کلیک میکنه اطلاعاتش میاد داخل تکست باکسا.حالا فرض کنید کاربر کلید افزودن رو زد،پس دکمه ی حذف و ویرایش غیر فعال میشه.ولی گرید فعاله و کاربر میتونه با کلید روی اون اطلاعات رو وارد تکست باکسا کنه و اطلاعات تکراری وارد کنه.
> من یه پروژه ی دیگه تو همین تالار دیدم که اومده بود چند تا حالت تعریف کرده بود.مثل حالت GoToAddOrEditMode .بع میومد تو این حالات ،بسته به این که چه کلیدی زده بشه،گرید و دکمه های دیگر را غیر فعال میکرد و اجازه ی کارای بیهوده به کاربر نمیداد و به عبارتی کاربر نمیتونست تو پروژه خرابکاری بکنه.یا مثلا در اینجا وقتی کلید افزودن فعال میشه،دیگه حالتی برای انصراف نداریم.میشه اینم توضیح بدین چجوری بزاریم.ممنون


سلام.
دقیقا متوجه منظورتون نشدم ولی اگر درون ویدئوها رو دقت کنید در یک لحظه یا کلید "ثبت" فعال هست یا کلیدهای "حذف" و "تصحیح".
مثلا در لحظه اولیه فقط دکمه ثبت فعال هست ولی وقتی کاربر، یک رکورد خاص رو انتخاب میکنه معناش این هست که قصد داره یا تصحیح کنه یا حذف رو انجام بده، به همین خاطر دکمه ثبت رو براش غیرفعال میکردیم ولی اینو بدونید که شیوه طراحی کاملا سلیقه ای هست.
به قول شما یه نفر به یه شکل دیگه ای طراحی رو انجام میده و من به یه شکل دیگه. باید نرم افزارهای مختلف رو ببینید و با توجه به سلیقه خودتون بهترین شیوه رو انتخاب کنید (در کل نمیتونم در بخش طراحی بخاطر سلیقه ای بودن اظهارنظر بیشتری رو انجام بدم).
برای حالت انصراف هم میشه یه دکمه گذاشت و درون اون وضعیت دکمه ها رو به حالت پیش فرض تغییر داد (دکمه ثبت فعال بشه و دکمه های حذف و تصحیح غیر فعال و تکست باکس ها هم خالی بشن).

----------


## حمیدرضا1

> سلام.
> دقیقا متوجه منظورتون نشدم ولی اگر درون ویدئوها رو دقت کنید در یک لحظه یا کلید "ثبت" فعال هست یا کلیدهای "حذف" و "تصحیح".
> مثلا در لحظه اولیه فقط دکمه ثبت فعال هست ولی وقتی کاربر، یک رکورد خاص رو انتخاب میکنه معناش این هست که قصد داره یا تصحیح کنه یا حذف رو انجام بده، به همین خاطر دکمه ثبت رو براش غیرفعال میکردیم ولی اینو بدونید که شیوه طراحی کاملا سلیقه ای هست.
> به قول شما یه نفر به یه شکل دیگه ای طراحی رو انجام میده و من به یه شکل دیگه. باید نرم افزارهای مختلف رو ببینید و با توجه به سلیقه خودتون بهترین شیوه رو انتخاب کنید (در کل نمیتونم در بخش طراحی بخاطر سلیقه ای بودن اظهارنظر بیشتری رو انجام بدم).
> برای حالت انصراف هم میشه یه دکمه گذاشت و درون اون وضعیت دکمه ها رو به حالت پیش فرض تغییر داد (دکمه ثبت فعال بشه و دکمه های حذف و تصحیح غیر فعال و تکست باکس ها هم خالی بشن).


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

----------


## peiman.oruji

*با سلام و تشکر از Veniz2008! میخواستم بپرسم اگه نخواستیم در بخش گزارش گیری از نمایش زمان استفاده کنیم،نیازی به دیتا ست نیست و میشه فقط از data table استفاده کردعــــایا؟*

----------


## esafb52

بله دوست عزیز

----------


## حمیدرضا1

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

----------


## ali.alavi245

با سلام و تشکر از آموزش بسیار خوبتان که برای ما شهرستانی ها که دسترسی به کلاسهای معتبر وحرفه ای نداریم بهترین مرجع آموزشی برای یادگیری است
من ویدوئوی مربوط به گزارش گیری را دیدم و سوالی برای من پیش آمد
وقتی در فیلدهای بانک اطلاعاتی من متن فارسی انگلیسی باهم وجود داشته باشد در هنگام گزارش گیری این متون بهم ریخته نمایش داده میشوند 
با اینکه این متون در دیتابیس بصورت درست ذخیره شده اند و هنگام نمایش سوال در فرم بهم ریخته نیست اما هنگامی که در گزارش گیری آورده میشود بهم ریخته می شود
ضمنا من هم برای شیء Data و هم برای page در استیمول خاصیت right to left را true قرار دادم اما باز در هنگام گزارش گیری این مشکل وجود دارد
سوال من این است که آیا راه حلی برای این مشکل وجود دارد؟ و یا استفاده از دیتاتیبل باعث ایجاد این مشکل میشود
چون وقتی از خود اطلاعات جدول در استیمول گزارش میگیرم فیلدها به درستی دیده میشوند.
با تشکر

----------


## veniz2008

> وقتی در فیلدهای بانک اطلاعاتی من متن فارسی انگلیسی باهم وجود داشته باشد در هنگام گزارش گیری این متون بهم ریخته نمایش داده میشوند 
> با اینکه این متون در دیتابیس بصورت درست ذخیره شده اند و هنگام نمایش سوال در فرم بهم ریخته نیست اما هنگامی که در گزارش گیری آورده میشود بهم ریخته می شود
> ضمنا من هم برای شیء Data و هم برای page در استیمول خاصیت right to left را true قرار دادم اما باز در هنگام گزارش گیری این مشکل وجود دارد
> سوال من این است که آیا راه حلی برای این مشکل وجود دارد؟ و یا استفاده از دیتاتیبل باعث ایجاد این مشکل میشود
> چون وقتی از خود اطلاعات جدول در استیمول گزارش میگیرم فیلدها به درستی دیده میشوند.


سلام.
مشکل از دیتاتیبل نیست، بلکه باید یک خاصیت رو در محیط استیمول برای Text ها فعال کنید که بصورت پیش فرض False هست.
برای حل این مشکل در محیط استیمول، همه Text ها رو با گرفتن کلید Ctrl انتخاب کنید. بعدش در قسمت properties یک گزینه Text Options دارید که خصوصیات کلی متن رو نمایش میده. در بین خصوصیاتش یک گزینه به نام RightToLeft داره که بصورت پیش فرض False هست. این گزینه رو بصورت دستی با کلمه True جایگزین کنید. فایل گزارشتون رو save کنید و دوباره تست کنید.
http://veniz2008.persiangig.com/image/az4.JPG
نتیجه رو هم می تونید در تصویر زیر مشاهده کنید :
http://veniz2008.persiangig.com/image/az3.JPG
موفق باشید.

----------


## behnam-soft

جناب Veniz 2008 شما در ویدئوی سوم یا چهار -اگر اشتباه نکنم- برای پر کردن کمبو باکسی که در زمان لود فرم اتفاق می افته یه روش استاندارد گفتید که من فقط کدش رو یه جایی یادداشت کردم، الان که دارم یکی از برنامه های قدیمی مو بازسازی می کنم، اون کد رو که می نویسم کار نمی کنه و خطا میگیره، من اشتباه نوشتم یا کد شما در C#‎2008 اجرا نمیشه؟
کدی که من نوشتم : 
dataGridViewX1.DataSource =b.ShowBakhsh((DataRowView)cmbShahrestan.SelectedV  alue)["id"]);

----------


## mamad_tanha_2006

> جناب Veniz 2008 شما در ویدئوی سوم یا چهار -اگر اشتباه نکنم- برای پر کردن کمبو باکسی که در زمان لود فرم اتفاق می افته یه روش استاندارد گفتید که من فقط کدش رو یه جایی یادداشت کردم، الان که دارم یکی از برنامه های قدیمی مو بازسازی می کنم، اون کد رو که می نویسم کار نمی کنه و خطا میگیره، من اشتباه نوشتم یا کد شما در C#‎‎2008 اجرا نمیشه؟
> کدی که من نوشتم : 
> dataGridViewX1.DataSource =b.ShowBakhsh((DataRowView)cmbShahrestan.SelectedV  alue)["id"]);


سلام دوست عزیز 
این کد شما دقیقا کارش چیه ؟
ShowBakhsh چیه؟
برای منبع دیتا گرید باید از دیتا تیبل استفاده کنی

----------


## mamad_tanha_2006

سلام جناب ونیز
ضمن تشکرات فراوان بابت آموزش خوب و عالیتون 
وقتی میخوام فرم اصلی رو لود کنم و در لود اون ابتدا فرم لوگین لود میشه ـ اروری بصورت زیر میده :
Untitled.jpg
کدهام هم دقیقا کدهای خودتون هست
میدونم که این به این معنیه که هنوز منو ساخته نشده ولی هرکاری میکنم این مشکلم رفع نمیشه
واقعا مونم چیکار کنم ممنون میشم اگه راهنماییم کنیناینم کدهای مربوط به لود فرم اصلی


```
       
private void FrmMain_Load(object sender, EventArgs e)
    {
            
FrmLogin flogin = new FrmLogin();   

       

            flogin.ShowDialog();

            
if (flogin.DialogResult !=DialogResult.OK)

               
Application.ExitThread();

             
if (FrmLogin.myflag == 1)

            {

                

                menuStrip1.Items[
"M0"].Enabled = false;

           }

            
```

----------


## esafb52

شاید اسم این ایتمت اشتباه هست که خطای نال رو بهت میده

----------


## mamad_tanha_2006

> شاید اسم این ایتمت اشتباه هست که خطای نال رو بهت میده


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

----------


## esafb52

خواهش میکنم همیشه باید به نکات ریز در کار باید توجه کرد ضمنا باید از ونیز تشکر کنی من خیلی چیزا رو از اون یاد گرفتم

----------


## mamad_tanha_2006

> خواهش میکنم همیشه باید به نکات ریز در کار باید توجه کرد ضمنا باید از ونیز تشکر کنی من خیلی چیزا رو از اون یاد گرفتم


مرسی از لطفتون
من به برنامه نویسی خیلی علاقه دارم ، از روز اولی که رفتم دانشگاه به C++‎‎‎‎‎‎‎ علاقمند شدم. هنوزم دارم ادامه میدم. بزرگانی مثل شما و جناب ونیز هستند که به آدم روحیه و امید  میدن . با آرزوی موفقیت و شادی روز افزون 
راستی یه سوال ، فقط اگه خنده دار بود بهم نخندین :d
میخوام به یه روش دیگه این برنامه رو پیاده کنم . یعنی یه کلاس در نظر بگیرم برای هر سوال یه شیی بسازم که دارای همین خصوصیت ها باشه یعنی یه چیز تو این مایه ها:


class
 Question

    {

        
private int QuestionID ;

        
private int GroupId;

        
private string QuestionText ;

        
private string Case1 ;

        
private string Case2 ;

        
private string Case3 ;

        
private string Case4 ;

        
private int Answer;

     }


 بنظرتون تو افزایش کارآیی برنامه تاثیری  داره ؟

----------


## behnam-soft

> سلام دوست عزیز 
> این کد شما دقیقا کارش چیه ؟
> ShowBakhsh چیه؟
> برای منبع دیتا گرید باید از دیتا تیبل استفاده کنی


دوست من، من از روش 3 لایه استفاده کردم که یه متد داره که کارش نشون دادن بخش هاست اما در زمان اود فرم به مشکل بر می خوردم که با کلی جستجو در سایت های انگلیسی زبان، با یه خط کد مشکلم حل شد!

----------


## haamidd

سلام علیکم. ببخشید در قسمت 9 و در بخش ایجاد اعداد تصادفی گیر کردم!

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

این کدهای من:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Data.SqlClient;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace AzmoonGir
{
    public partial class frmTest : Form
    {
        SqlConnection con = new SqlConnection("Data Source=.;Initial Catalog=AzmoonGir;User ID=sa;Password=123456;Persist Security Info=True");
        DataTable dt;
        int rndNum;
        public frmTest()
        {
            InitializeComponent();
        }

        private void frmTest_Load(object sender, EventArgs e)
        {
            SqlDataAdapter da = new SqlDataAdapter("sp_SelectAllGroup", con);
            da.SelectCommand.CommandType = CommandType.StoredProcedure;
            DataTable dt = new DataTable();
            da.Fill(dt);
            comboBox1.DataSource = dt;
            comboBox1.DisplayMember = "GroupName";
            comboBox1.ValueMember = "GroupId";
        }

        private void button1_Click(object sender, EventArgs e)
        {
            SqlCommand cmd = new SqlCommand("sp_CheckQuestionNumber", con);
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.Parameters.AddWithValue("QuestionNumber", textBox1.Text);
            cmd.Parameters.AddWithValue("GroupId", ((DataRowView)comboBox1.SelectedItem)["GroupId"]);
            cmd.Parameters.Add("@Result", SqlDbType.Int);
            cmd.Parameters["@Result"].Direction = ParameterDirection.Output;
            con.Open();
            cmd.ExecuteNonQuery();
            con.Close();

            int res = Convert.ToInt32(cmd.Parameters["@Result"].Value);
            if (res == 0)
            {
                MessageBox.Show("تعداد سوالات کمتر از میزان درخواستی شما می باشد");
            }
            else if (res == 1)
            {
                SqlDataAdapter da = new SqlDataAdapter();
                da.SelectCommand = cmd;
                dt = new DataTable();
                da.Fill(dt);

                ListBox lst = new ListBox();


                while (lst.Items.Count < int.Parse(textBox1.Text))
                {
                    Random rnd = new Random();
                    rndNum = rnd.Next((int)dt.Rows[0][0], (int)dt.Rows[dt.Rows.Count][0]);
                    for (int i = 0; i < dt.Rows.Count - 1; i++)
                    {
                        if (rndNum == (int)dt.Rows[i][0])
                        {
                            for (int j = 0; j < lst.Items.Count; j++)
                            {
                                if (rndNum == (int)lst.Items[j])
                                {
                                    j = lst.Items.Count;
                                }
                                else if (j == lst.Items.Count - 1)
                                {
                                    lst.Items.Add(rndNum);
                                }
                            }
                        }
                    }

                    for (int i = 0; i < lst.Items.Count; i++)
                    {
                        listBox1.Items.Add(lst.Items[i]);
                    }
                }


            }
        }
    }
}



این هم تصویر ارور:

Untitled.jpg

----------


## esafb52

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

----------


## amir_87

سلام 
میشه لطفا در مورد connection string توضیح بدین!
توی پروژه شما از server استفاده کردین برای معرفی دیتا بیس . بعضی جاهای دیگه من دیدم از data source  استفاده می کنند . همچنین در مورد بقیه گزینه ها .
پروژه من اصلا به دیتا بیس وصل نمی شه.  :ناراحت: من اسمه دیتا بیسم و یادم نیست و وقتی می خوام وارد خود sql server management  شم و با دیتا بیس conect شم از . (دات) استفاده می کنم و توی کانکشن استرینگ هم فقط از .(دات) استفده می کنم ! دلیلش همینه که به دیتا بیس وصل نمیشه؟ اگه مشکلش اینه راهنماییم کنید باید اسم دیتا بیسمو از کجا پیدا کنم .
ممنون میشم راهنماییم کنید .

----------


## hsdnhd

من قسمت اول رو دانلود موقع اکسترکت رمزمیخواد توی متن هاتون توضیحی درمورد رمزنداده بودید این مشکل را رفع کنید لطفا

----------


## hsdnhd

> من قسمت اول رو دانلود موقع اکسترکت رمزمیخواد توی متن هاتون توضیحی درمورد رمزنداده بودید این مشکل را رفع کنید لطفا


این مشکل رمزبرای بقیه نیست؟من چیکارکنم؟یک نفرجوابی بده بالاخره چیکارکنم؟

----------


## veniz2008

> من قسمت اول رو دانلود موقع اکسترکت رمزمیخواد توی متن هاتون توضیحی درمورد رمزنداده بودید این مشکل را رفع کنید لطفا





> این مشکل رمزبرای بقیه نیست؟من چیکارکنم؟یک نفرجوابی بده بالاخره چیکارکنم؟


ویدئوهایی رو که خودم بر روی پرشین گیگ آپلود کردم، پسورد ندارند ولی در مورد ویدئوهای آپلود شده بر روی سرور جناب FastCode بی خبرم (هر چند تا چند وقت قبل اونها هم پسورد نداشتند. اگر از اونجا دانلود کردید و پسورد دارند با خودشون مکاتبه کنید).
موفق باشید.

----------


## FastCode

> ویدئوهایی رو که خودم بر روی پرشین گیگ آپلود کردم، پسورد ندارند ولی در مورد ویدئوهای آپلود شده بر روی سرور جناب FastCode بی خبرم (هر چند تا چند وقت قبل اونها هم پسورد نداشتند. اگر از اونجا دانلود کردید و پسورد دارند با خودشون مکاتبه کنید).
> موفق باشید.


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

----------


## hsdnhd

باسلام وتشکرفراوان ازشما
ای کاش ازتکنولوژی های جدید مانندlinqتوی این پروژه استفاده می کردید
چون sqlو اینطوری استفاده ازاون تقیربا منسوخ شده وخیلی کم استفاده میشه چون کدنویسی زیادی داره اگرازتکنولوژی های نواستفاده می کردید هم وقت کمتری میگرفت وحجم فیلم ها پایینترمیومدودوستان هم ازهمین صفربا راحتترنوشتن عادت میکردند

----------


## hsdnhd

> سلام.
> فایلهای من هم رمز ندارند.اگر به تاریخ فایلها نگاه کنید میبینید که از زمانی که روی سرور قرار داده شده‌اند تغییر نکردند.
> احتمالا فایل درست دانلود نشده.
> میتونید فایل رو با تورنت تعمیر کنید.البته به یک مقدار تجربه نیاز داره.


فایل شماره 1 رمزداشت 
https://barnamenevis.org
بااین رمزبازشد

----------


## FastCode

اصلا اینقدر با حرف مفت حال میکنم که حساب نداره.

----------


## حميدسي شارپ

سلام.نماز روزه ی همه قبول
ممنون بابت زحمات جناب ونیز و فست کد و همه ی کسایی ک نظر دادن.
خیلی بابت آموزشا ممنون.من این آموزشا رو تموم کردم و البته همون قسمت تولید اعداد تصادفی برای انتخاب رندم سوالات،یه مشکلی بود که سوال آخر هیچ وقت انتخاب نمی شد که البته خدارو شکر تونستم درستش کنم.اون موقع اینترنت نداشتم ک بتونم بیام و این مشکلو بیان کنم...ولی الان خدارو شکر دیگه اینترنت دارم و بیشتر مزاحمتون میشم☺.پروژه رو هم کامل پیاده کردم.با Dev Component و یه سری خلاقیت هایی هم توش دادم.تعریف نباشه☺
حالا باید چیکار کنیم آقای ونیز؟؟؟میدونم شاید با خودتون بگین این دیگه کیه...ما اومدیم اینا رو راه بندازیم ولی دو قورت و نیمشون هم باقیه.ولی باور کنین منظورم اینه که هیچی مثل سردرگمی به یه برنامه نویس تازه کار مثل من ضربه نمیزنه.خواهشی که دارم اینه که بازم مارو کمک کنین.
بریم سراغ برنامه نویسی سه لایه یا Entity یا Linq یا ...
باور کنین بد جوری سر در گمم.خواهشا کمک کنید.شما که تا اینجا زحمت کشیدین،از این به بعد هم ادامه بدین تا اجرتون کامل شه.هر چند که تا الانشم خیلی خیلی محبت کردین ولی از نظر منه مبتدی ، همین Stored Prosedure ها کافیه و دیگه میگم نیازی به بقیه ی چیزا نیست...چرا باید بریم سراغ Linq و Entity و ...
ممنون

----------


## FastCode

> سلام.نماز روزه ی همه قبول
> ممنون بابت زحمات جناب ونیز و فست کد و همه ی کسایی ک نظر دادن.
> خیلی بابت آموزشا ممنون.من این آموزشا رو تموم کردم و البته همون قسمت تولید اعداد تصادفی برای انتخاب رندم سوالات،یه مشکلی بود که سوال آخر هیچ وقت انتخاب نمی شد که البته خدارو شکر تونستم درستش کنم.اون موقع اینترنت نداشتم ک بتونم بیام و این مشکلو بیان کنم...ولی الان خدارو شکر دیگه اینترنت دارم و بیشتر مزاحمتون میشم☺.پروژه رو هم کامل پیاده کردم.با Dev Component و یه سری خلاقیت هایی هم توش دادم.تعریف نباشه☺
> حالا باید چیکار کنیم آقای ونیز؟؟؟میدونم شاید با خودتون بگین این دیگه کیه...ما اومدیم اینا رو راه بندازیم ولی دو قورت و نیمشون هم باقیه.ولی باور کنین منظورم اینه که هیچی مثل سردرگمی به یه برنامه نویس تازه کار مثل من ضربه نمیزنه.خواهشی که دارم اینه که بازم مارو کمک کنین.
> بریم سراغ برنامه نویسی سه لایه یا Entity یا Linq یا ...
> باور کنین بد جوری سر در گمم.خواهشا کمک کنید.شما که تا اینجا زحمت کشیدین،از این به بعد هم ادامه بدین تا اجرتون کامل شه.هر چند که تا الانشم خیلی خیلی محبت کردین ولی از نظر منه مبتدی ، همین Stored Prosedure ها کافیه و دیگه میگم نیازی به بقیه ی چیزا نیست...چرا باید بریم سراغ Linq و Entity و ...
> ممنون


سلام.
اول بهتون خسته نباشید میگم چون میدونم کار ساده ای نبوده.
به نظر من بهتره که در حد ابتدایی با همه این تکنولوژی ها آشنا بشید تا بتونید با توجه به نیازتون تکنولوژی درست رو انتخاب کنید.(البته اون سه تکنولوژی که نام بردید در کنار هم قابل استفاده هستند و استفاده از یکی یه هیچ عنوان به معنی استفاده نکردن از دیگری در یک پروژه نیست)
معماری های خیلی مختلف و زیادی برای پیاده سازی برنامه های دیتابیسی وجود دارد که به نظر بنده خود شما ترتیب خوبی برای یادگیری پرکاربردترینهاشون پیشنهاد دادید. وقتی به حد کافی با این تکنولوژی ها کار کنید مطمئنا در طول مسیر بادگیریتون با تکنولوژی های دیگر هم آشنا خواهید شد و میتوانید راه خودتون رو پیدا کنید.
موفق باشید.

----------


## حميدسي شارپ

خیلی ممنون جناب Fast Code
خب راستش این آموزش بی نظیری رو که شاهد بودیم از جناب Veniz جاهای دیگه نبود.آموزش سی شارپ زیاده ولی هدف خیلیاش خالی کردن جیب مردمه.مخصوصا ما مبتدیا.البته من همینجوریش هم جیبم خالیه و اگه کسایی مثل شما و آقای ونیز نباشن ک ما رو کمک کنن دیگه هیچی.
منظور من اینه که این آموزش دیگه ادامه نداره؟اون دفعه جناب ونیز زحمت فیلما رو کشیدن و خیلی بابت این فیلما ازشون تشکر میکنم.به شخصه خیلی چیزا یاد گرفتم.ایشون واقعا استاد بودن.چون مثلا بعد از دو جلسه کد نویسی میرفتن سراغ دیزاین تا یه کم تنوع بشه و آموزشا کسل کننده نباشه و خیلی نکات ریز دیگه ای که نمیشه همشو گفت.این هنره...بازم ازشون تشکر میکنم
و با این که میدونم خواستم بزرگه ولی خواهش میکنم ادامه بدین.اگه آقای Veniz وقت ندارن،شما کمک کنین جناب Fast Code . در مورد همین تکنولوژیای جدید به سبک پروژه محور.والا من که هر چی میگردم یا کیفیت آموزشا پایینه،یا پولیه،یا خیلی مبتدیه،یا خیلی پیشرفتست،یا خیلی تئوری و هیچکدوم عملی نیست.
بازم ممنون.

----------


## FastCode

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

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

----------


## حميدسي شارپ

سلام خدمت همه.توی سایت sourcebaran دیدم یه پکیج آموزشی گذاشته و با پر رویی تمام فیلمای استاد veniz رو به خودش نسبت داده.شایدم برداشت من اینه.مهم اینه که دارن این آموزش رایگان رو همراه با چند تا آموزش دیگه میفروشن.گفتم که در جریان باشین که زحمات استاد هدر نره...
اینم آدرسش:
http://shop1.sourcebaran.com/?p=254

----------


## FastCode

> سلام خدمت همه.توی سایت sourcebaran دیدم یه پکیج آموزشی گذاشته و با پر رویی تمام فیلمای استاد veniz رو به خودش نسبت داده.شایدم برداشت من اینه.مهم اینه که دارن این آموزش رایگان رو همراه با چند تا آموزش دیگه میفروشن.گفتم که در جریان باشین که زحمات استاد هدر نره...
> اینم آدرسش:
> http://shop1.sourcebaran.com/?p=254


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

ممنون که اطلاع دادید. من سعی میکنم تا یکی دو روز آینده اگر veniz خودش این پست رو ندیده بود بهش اطلاع بدم.

----------


## حميدسي شارپ

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

----------


## veniz2008

> سلام خدمت همه.توی سایت sourcebaran دیدم یه پکیج آموزشی گذاشته و با پر رویی تمام فیلمای استاد veniz رو به خودش نسبت داده.شایدم برداشت من اینه.مهم اینه که دارن این آموزش رایگان رو همراه با چند تا آموزش دیگه میفروشن.گفتم که در جریان باشین که زحمات استاد هدر نره...
> اینم آدرسش:
> http://shop1.sourcebaran.com/?p=254





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


سلام.
واقعیت اینه همه جور آدمی پیدا میشه و با واقعیتی که در جامعه مون سراغ داریم انجام چنین کارهایی کار عجیبی نیست هر چند انسان های زیادی هم هستن که به حقوق دیگران احترام میذارن و یه مجموعه رایگان رو پولی نمی کنن. حالا یه احتمالم این وسط بدیم که اون مجموعه ای که اون وب سایت برای فروش قرار داده با مجموعه رایگان ما یکی نباشه.
من اون چیزی رو که باید انجام میدادم رو سعی کردم انجام بدم دیگه باقی کار چندان اهمیتی نداره.
در مورد معرفی کردن خودم یا قرار دادن یه آرم یا نوشته روی آموزش ها هم واقعا برام هیچ اهمیتی نداشت چون هدف چیز دیگه ای بود.
در مورد چند پست قبلتون (پست 202) به نظر من برید سمت کار کردن با Entity Framework (اونم با Code First اش) و با امکانات و قدرت این تکنولوژی هم آشنا بشید. من خودم الان مدت هاست که به EF کوچ کردم و به ندرت از ADO.Net به شکل سابق استفاده میکنم.
موفق باشید.

----------


## p.mohammad

سلام دوست من تو ویدیو 10 به مشکل برخوردم اینم عکس از ارور و مشکلم اگه میشه لطفا راهنماییم کنید.1.jpg2.jpg

----------


## veniz2008

> سلام دوست من تو ویدیو 10 به مشکل برخوردم اینم عکس از ارور و مشکلم اگه میشه لطفا راهنماییم کنید.1.jpg2.jpg


سلام.
این سوال، بارها توی همین تاپیک پرسیده شده و اگه سوالات همین تاپیک رو نگاه می کردید، نیازی به ایجاد یک پست اضافه و جواب تکراری نبود.
درون foreach باید parent (با p کوچک) بنویسید نه Parent( با P بزرگ).
این مشکل از بی دقتی دوستان نتیجه میشه که به parent(با p کوچک) بعنوان ورودی متد UncheckRadioButton توجه نمی کنن.
موفق باشید.

----------


## p.mohammad

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

----------


## Roya.Rashidi

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

----------


## محمد آشتیانی

سلام
شما پروژتو شروع کن ، هرجا سوالی پیش اومد از امکان جستجوی سایت استفاده کن و نهایتا اگر به راه حل نرسیدی
یه تاپیک جدید با عنوان مناسب و توضیحات کافی ایجاد کن تا دوستان راهنمایی کنن.




موفق باشید.

----------


## p.mohammad

سلام دوست من ، من ویدیو 12 رو دیدم و به مشکلاتی بر خوردم . اول این که وقتی عمل پشتیبان گیری رو متوقف میکنم یک فایل ناقص با اون اسم ایجاد میشه و  باقی میمونه یعنی مثل ویدیو شما خود به خود پاک نمیشه 
دوم اینکه من اون ارور مربوط به کد Asynchronous Processing=true واسم پیش نیومد ولی چون شما نوشتین منم نوشتم اما حس میکنم پیش نیومدنش طبیعی نیست و باید پیش میومد و اصلاح میشد . و اینکه من چون دیتا بیس سنگینی نداشتم نتونستم کل برنامه رو تست کنم تا خیالم راحت شه و خیلی نگرانم که مطلبی رو از دست نداده باشم اون عمل توقف پشتیبان گیری هم با سرعت زیاد بزور تونستم تست کنم چون در یکی دو ثانیه بیشتر طول نمیکشید . من کل کد هایی که نوشتم رو میزارم لطفا شما برسی کنید ببینید مشکلی نداشته باشه و این که من فعلا هیچ تغییری در کد ها و حتی اسم های اشیا انجام ندادم برای اینکه مشکلاتم رو بهتر بتونین پیدا کنین . با تشکر از زحمات شما .1.jpg2.jpg3.jpg4.jpg5.jpg

----------


## p.mohammad

سلام دوست من ، یه مورد دیگه هم که پیش اومده اینه که با فرض این که ما بکاپ هم با موفقیت  بگیریم . حالا اگر جدول ادمین ما پاک بشه  کل برنامه ارور میده اگه هم ارور نده نمیتونیم با مدیریت  وارد بشیم و دسترسی به فرم پشتیبان گیری نداریم  . ایده شما واسه حل این مشکل چی هست  :متفکر:  . با تشکر

----------


## nimak2

بسیار عالی. ولی کاش به جای ADO از LINQ یا EF استفاده میکردین .

----------


## saebgh

با سلام خدمت دوستان گرامی و اساتید محترم.
2 تا سوال  از مشکلم تو نرم افزار آزمون گیردارم ممنون میشم کمکم کنید.
اولیش اینه که تو نرم افزار آموزشی زمان اجرا تو فرم اصلی  تو پنل مربوط به نمایش روز و تاریخ و ساعت  , ساعت رو برعکس نشون میده به این صورت که اگه مثلا 10 صبح باشه 22 نشون  میده و 10 شب رو به جا اینکه بنویسه 22 مینویسه 10.
سوال بعدیم اینه که من تو ویدئو آخر فایل help  رو با نر افزار win chm  ساختم اما فایل رو به  پوشه bin/debug  انتقال میدم بعد از تو سی شارپ اجراش میکنم نوشته هام  نمیاد.که عکسشو تو فایل زمیمه گذاشتم.
اما همین فایل help تو \Documents\WinCHM Projects\Project1_output\HTML Help اجرا میشه.
خواهشا کمکم کنید
لینک عکس : http://upload7.ir/viewer.php?file=23...4835836232.png
ممنون میشم کمکم کنید.
یه کمک دیگم میخواسم  . من دنبال فایل پچ  stimul soft  میگردم.جایی پیداش نکردم.خواسم بگم اگه میشه لینکی چیزی بدبن ممنون میشم.
با تشکر

----------


## veniz2008

> با سلام خدمت دوستان گرامی و اساتید محترم.
> 2 تا سوال  از مشکلم تو نرم افزار آزمون گیردارم ممنون میشم کمکم کنید.
> اولیش اینه که تو نرم افزار آموزشی زمان اجرا تو فرم اصلی  تو پنل مربوط به نمایش روز و تاریخ و ساعت  , ساعت رو برعکس نشون میده به این صورت که اگه مثلا 10 صبح باشه 22 نشون  میده و 10 شب رو به جا اینکه بنویسه 22 مینویسه 10.


سلام.
مطمئنید ساعت سیستمتتون درسته؟
AM برای صبح و PM نشان دهنده ظهر تا شب هست. چیز دیگه ای به ذهنم نمیرسه!.



> سوال بعدیم اینه که من تو ویدئو آخر فایل help  رو با نر افزار win chm  ساختم اما فایل رو به  پوشه bin/debug  انتقال میدم بعد از تو سی شارپ اجراش میکنم نوشته هام  نمیاد.که عکسشو تو فایل زمیمه گذاشتم.
> اما همین فایل help تو \Documents\WinCHM Projects\Project1_output\HTML Help اجرا میشه.
> 
> لینک عکس : http://upload7.ir/viewer.php?file=23...4835836232.png


اگر کلمه winchm رو که مربوط به تهیه فایل help بود جست و جو می کردید، جوابتون رو پیدا می کردید :
https://barnamenevis.org/showthread.p...=1#post1905518




> من دنبال فایل پچ  stimul soft  میگردم.جایی پیداش نکردم.خواسم بگم اگه میشه لینکی چیزی بدبن ممنون میشم.


http://fakhravary.blogfa.com/post-9.aspx
موفق باشید.

----------


## saebgh

اگر کلمه winchm رو که مربوط به تهیه فایل help بود جست و جو می کردید، جوابتون رو پیدا می کردید :
https://barnamenevis.org/showthread.p...=1#post1905518


http://fakhravary.blogfa.com/post-9.aspx
موفق باشید.[/QUOTE]


*راسش مشکلم با winchm اینه که همون فایل help  رو که کپی میکنم تو bin/debug بعدش که روش دابل کلیک میکنم  میبینم مثل همون عکسی که  براتون گذاشتم شده.اما همین فایل help تو \Documents\WinCHM Projects\Project1_output\HTML Help راحت اجرا میشه.*

----------


## saebgh

> سلام وقتی تعداد سوالات رو برابر تعداد سوالات موجود در دیتا بیس در نظر میگیرم برنامه کلا هنگ میکنه. دقیقا تو این حلقه هنگ میکنه:
> http://upload7.ir/viewer.php?file=58...6836036070.jpg


 


> سلام. مشکل بخاطر پارامتر دوم متد رندوم هست. در تابع رندوم ( (rand.next(min,max)  ) همیشه مقدار max رو یکی کمتر در نظر میگیره مثلا اگر min = 1 و max = 10 باشه، یک عدد بین 1 تا 9 برای شما تولید میکنه (اعداد 1 و 9 میتونن جز اعداد تولید شده باشند ولی عدد 10 رو شامل نمیشه). برای رفع این مشکل کافیه به max یکی اضافه کنید یعنی اگر میخواید عدد رندومی بین 1 و 10 تولید کنید که خود اعداد 1 و 10 هم امکان انتخاب شدن داشته باشند بایستی بازه رو بین 1 و 11 انتخاب کنید ( min = 1 و max = 11). 
> بنابراین برای رفع مشکلتون به عدد موجود در آخرین سطر دیتاتیبل یکی اضافه کنید. 
> کدها رو نسبت به قبل بهینه تر کردم که می تونید از کدهای زیر استفاده کنید :
> while (MyListResult.Items.Count < Convert.ToInt32(TxtQuestionNumber.Text.Trim()))
>                   {
>                          Random rand = new Random();
>                         num = rand.Next(Convert.ToInt32(dt.Rows[0][0]), Convert.ToInt32(dt.Rows[dt.Rows.Count - 1][0]) + 1);
>                         //
>                         for (int i = 0; i < dt.Rows.Count ; i++)
> ...



*اگه از همین روشی که میگین که به اضافه 1 کنیم بخوایم تو stored procedure استفاده کنیم دقیقا باید چی بنویسیم؟
ممنون*

----------


## veniz2008

> *راسش مشکلم با winchm اینه که همون فایل help  رو که کپی میکنم تو bin/debug بعدش که روش دابل کلیک میکنم  میبینم مثل همون عکسی که  براتون گذاشتم شده.اما همین فایل help تو \Documents\WinCHM Projects\Project1_output\HTML Help راحت اجرا میشه.*


یا فایل رو اشتباه کپی کردید یا نام فایل رو درست وارد نکردید (همونطور که در تاپیکی هم که واستون گذاشته بودم اون شخص هم دقت نکرده بود و یک نام اشتباه گذاشته بود که وجود خارجی نداشت).



> *اگه از همین روشی که میگین که به اضافه 1 کنیم بخوایم تو stored procedure استفاده کنیم دقیقا باید چی بنویسیم؟
> ممنون*


خدایا یا به من صبر فراوان بده یا به این دوستان کمی دقت.
متاسفانه بعضی از دوستان، وحشتناک اذیت می کنن. اذیت کردن نه بخاطر سوال پرسیدن بلکه بخاطر بی توجهی، بخاطر کم دقتی.
نمیشه یک سوال رو 100 بار توضیح داد.
دوست عزیز من توی پیام خصوصی اون همه وقت گذاشتم و این مطلب رو براتون توضیح دادم نتیجش چی شد؟ واقعا این برای من سوال شده که اون همه توضیح دادم واقعا چی شد؟
لطفا به اون جوابی که در پیام خصوصی براتون فرستاده بودم رجوع کنید.
یه درخواستی هم که از دوستان داشتم اینه که برای پرسیدن سوالات این تاپیک از پیام خصوصی استفاده نکنن چون جوابی داده نمیشه.
موفق باشید.

----------


## saebgh

> *راسش مشکلم با winchm اینه که همون فایل help  رو که کپی میکنم تو  bin/debug بعدش که روش دابل کلیک میکنم  میبینم مثل همون عکسی که  براتون  گذاشتم شده.اما همین فایل help تو \Documents\WinCHM  Projects\Project1_output\HTML Help راحت اجرا میشه.*





> یا فایل رو اشتباه کپی کردید یا نام فایل رو درست وارد نکردید (همونطور که  در تاپیکی هم که واستون گذاشته بودم اون شخص هم دقت نکرده بود و یک نام  اشتباه گذاشته بود که وجود خارجی نداشت).


با سلام
مشکلم رو متوجه شدم .من پروژه رو تو آدرس : D:\Application\Project\C#‎‎‎‎‎‎‎\MyAzmo  on\MyAzmoon\MyAzmoon\bin\Debug ساخته بودم و وقتی فایل help.chm رو اینجا کپی میکنم اجرا نمیشه.مشکلم دقیقا از اسم پوشه #C  بود. و اسم پوشه رو به C_sharp تغییر دادم و آدرسش این شد : D:\Application\Project\C-Sharp\MyAzmoon\MyAzmoon\MyAzmoon\bin\Debug خیلی راحت فایل راهنمام اجرا شد.

----------


## magical.boy47

سلام استاد Veniz من داشتم کدهای شما رو تمرین می کردم به یه مشکل بر خوردم. 
Azmoon.jpg
Column Question text does not belong to table. در صورتی که این ستون تو جدول من وجود داره. ممنون می شم اگه راهنماییم کنید

----------


## veniz2008

> سلام.  من داشتم کدهای شما رو تمرین می کردم به یه مشکل بر خوردم. 
> Azmoon.jpg
> Column Question text does not belong to table. در صورتی که این ستون تو جدول من وجود داره. ممنون می شم اگه راهنماییم کنید


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

----------


## magical.boy47

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


سلام مجدد به شما ممنون از پاسختون
ستون مورد نظر داخل جدول وجود داره ولی بازم این پیغامو میده. این قسمت تمرین من مربوط به ویدیو 10 وقتی نمایش سوالاتو می زنم سوال اول به خوبی از دیتا بیس و از ستون Question Text خونده می شه ولی وقتی روی دکمه بعدی کلیک می کنم تا سوال بعدی نمایش داده بشه ای پیغامو میده.
Data.jpg

----------


## veniz2008

> سلام مجدد به شما ممنون از پاسختون
> ستون مورد نظر داخل جدول وجود داره ولی بازم این پیغامو میده. این قسمت تمرین من مربوط به ویدیو 10 وقتی نمایش سوالاتو می زنم سوال اول به خوبی از دیتا بیس و از ستون Question Text خونده می شه ولی وقتی روی دکمه بعدی کلیک می کنم تا سوال بعدی نمایش داده بشه ای پیغامو میده.
> Data.jpg


دیتاتیبل رو جهت تست درون یه گرید بریزید و ستون های گرید رو مشاهده کنید ببینید ستونی به نام QuestionText موجود هست یا نه. همچنین می تونید به جای نام ستون از شماره ستون معادل در دیتاتیبل (شماره عددی) هم استفاده کنید.

----------


## systam

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

یا علی

----------


## b61_zeus

تشکر بابت آموزش عالی و بی نقصتون
یه سوال داشتم اونم اینه که اگه من بخوام برای پروژه ستاپ درست کنم باید این کانکشن ها رو تغییر بدم یا بدون دستکاری کانکشنها این برنامه روی سیستم مقصد کار میکنه؟
کلا برای ستاپ سازی پروژه ای که از sql server در اون استفاده شده باید روی سیستم هدف هم sql server یا برنامه خاصی نصب بشه؟

----------


## mehdinoorani

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

ویژوال استودیونت 2008 در ویندوز 8.1 کار میکنم.

لطفا راهنمایی فرماید.   با تشکر

----------


## b0mrang

دوستان عزیز سلام
یه سوال دارم اگه بتونید کمکم کنید ممنون میشم 
توو پروژه ام یه جک باکس به دیتاگریدویو اضافه کردم حالا می خوام تیک دار بودن یا نبودنش رو چک کنم چجوری باید اینکار رو کنم!!؟ راههای مختلف رو تست کردم جواب نمیده نمیدونم چرا!؟

----------


## tdodangeh

سلام، من به اين ويدئو ها نياز دارم اما ظاهرن از سايت پرشين برداشته شده و امكان دانلود نيست، ممنون ميشم اگر كسي داره دوباره بذاره، خيلييييي لطف بزرگي مي كنه

----------


## juza66

سلام

در سایت سورس باران و سورس گذر این آموزش ها وجود داره (مدیران عزیز تبلیغ نیست فقط جهت راهنمایی برای دانلود آموزش ها به دوستمون هستش)

----------


## tdodangeh

سلام، ممنون از پاسختون، من هر دو سايت رو بررسي كردم ،چيزي كه من متوجه شدم اين بود كه بايد دي وي دي هاي آموزشي خريداري بشه البته من مشكلي با خريدش ندارم فقط چون بسيار زياد هستن (حدود 6 دي وي دي )مي خواستم مشخصن همين فيلم هاي آموزشي مورد بحث در اين تاپيك رو ببينم خواهش كردم دوستان اگر دارن مجددن آپلود كنن تا ما كه تازه وارد هستم استفاده كنيم ممنون از لطفتون

----------


## rahmatipoor

دوست خوب لینکها سالم هستن
من یکی رو چک کردم

----------


## YASAMAN95

با سلام و تشکر از دوست عزیزی که این ویدویو رو تهیه کرده است. آموزش ها ی قسمت اول رو قدم به قدم انجام دادم ولی نام سرور sql را خطا میده نمیتونه کانکت بشه.عکس صفحه sql و کد برنامه رو میزارم لطفا راهنمایی کنید.SQL.PNGC#‎.jpg
ممنون از راهنمایی هاتون.

----------


## مریم فاضل

سلام دوست 
چرا دانلود نمیشه ویدیو ها 
چه کنم
 :گریه:  :گریه:  :گریه:  :گریه:  :گریه:  :گریه:  :گریه:  :گریه:

----------

