درخواست های ارتباط
جستجو
    لیست دوستان من
    صندوق پیام
    همه را دیدم
    • در حال دریافت لیست پیام ها
    صندوق پیام
    رویدادها
    همه را دیدم
    • در حال دریافت لیست رویدادها
    همه رویدادهای من
    اطلاعات مطلب
      مدرس/نویسنده
      عادل حسین پور
      امتیاز: 2881
      رتبه:541
      0
      1
      14
      73
      دوره های مرتبط
      دوره های توسینسو دوره آموزشی مقدماتی برنامه نویسی جاوا به زبان ساده
      دوره آموزشی مقدماتی برنامه نویسی جاوا به زبان ساده
      مدرس: مهدی عادلی فر
      این دوره را در 17 قسط خریداری کنید
      با خرید این دوره مبلغ 5,445 تومان هدیه بگیرید
      دوره آموزشی اسکریپت نویسی Batch یا Batch Scripting در ویندوز به زبان ساده
      دوره آموزشی اسکریپت نویسی Batch یا Batch Scripting در ویندوز به زبان ساده
      مدرس: حسین احمدی
      این دوره را در 11 قسط خریداری کنید
      دوره آموزشی مقدماتی برنامه نویسی به زبان سی شارپ
      دوره آموزشی مقدماتی برنامه نویسی به زبان سی شارپ
      مدرس: حسین احمدی
      این دوره را در 17 قسط خریداری کنید
      با خرید این دوره مبلغ 8,470 تومان هدیه بگیرید
      دوره آموزشی برنامه نویسی به زبان پرل بصورت پروژه محور
      دوره آموزشی برنامه نویسی به زبان پرل بصورت پروژه محور
      مدرس: ایمان جوادی
      این دوره را در 13 قسط خریداری کنید
      ساخت و مدیریت ربات تلگرام از صفر با زبان سی شارپ
      ساخت و مدیریت ربات تلگرام از صفر با زبان سی شارپ
      مدرس: مهدی عادلی فر
      این دوره را در 2 قسط خریداری کنید
      دوره آموزشی برنامه نویسی WPF در ویژوال استودیو
      دوره آموزشی برنامه نویسی WPF در ویژوال استودیو
      مدرس: امیر حسین فضلیخانی
      این دوره را در 12 قسط خریداری کنید
      دوره آموزشی برنامه نویسی اندروید با زبان جاوا به زبان ساده
      دوره آموزشی برنامه نویسی اندروید با زبان جاوا به زبان ساده
      مدرس: مهدی عادلی فر
      این دوره را در 27 قسط خریداری کنید
      با خرید این دوره مبلغ 8,110 تومان هدیه بگیرید
      دوره آموزشی برنامه نویسی حرفه ای پایتون به زبان ساده
      دوره آموزشی برنامه نویسی حرفه ای پایتون به زبان ساده
      مدرس: حسین احمدی
      این دوره را در 23 قسط خریداری کنید
      با خرید این دوره مبلغ 7,425 تومان هدیه بگیرید
      دوره آموزشی برنامه نویسی پیشرفته زبان سی شارپ
      دوره آموزشی برنامه نویسی پیشرفته زبان سی شارپ
      مدرس: حسین احمدی
      این دوره را در 78 قسط خریداری کنید
      با خرید این دوره مبلغ 82,245 تومان هدیه بگیرید
      دوره آموزشی پردازش متن با زبان برنامه نویسی پایتون
      دوره آموزشی پردازش متن با زبان برنامه نویسی پایتون
      مدرس: کاظم تقندیکی
      این دوره را در 20 قسط خریداری کنید
      با خرید این دوره مبلغ 7,040 تومان هدیه بگیرید
      دوره آموزشی ساخت ربات تلگرام
      دوره آموزشی ساخت ربات تلگرام
      مدرس: کاظم تقندیکی
      این دوره را در 8 قسط خریداری کنید
      دوره آموزشی طراحی رابط کاربری با JavaFX
      دوره آموزشی طراحی رابط کاربری با JavaFX
      مدرس: حسام رسولیان
      این دوره را در 13 قسط خریداری کنید
      دوره آموزشی Exploit نویسی به زبان Perl
      دوره آموزشی Exploit نویسی به زبان Perl
      مدرس: ایمان جوادی
      این دوره را در 7 قسط خریداری کنید
      دوره تخصصی آموزش متن کاوی با ابزار NLTK
      دوره تخصصی آموزش متن کاوی با ابزار NLTK
      مدرس: کاظم تقندیکی
      این دوره را در 11 قسط خریداری کنید

      ذخیره سازی فایل ها در بانک های اطلاعاتی : استفاده از FileStream در سی شارپ (بخـــــش اول)

      تاریخ 16 ماه قبل
      نظرات 1
      بازدیدها 1540
      با سلام خدمت همه ی دوستان و همکاران
      یکی از دغدغه ی اصلی برنامه نویسان ذخیره کردن فایل ها در بانک های اطلاعاتی هست .
      FileStream چیست ؟ نوع داده ایی جدید است که به ما این امکان را می دهد که به جای ذخیره سازی کل فایل در فایل داده ایی فایل را با File Group جدیدی جدایی از بخش داده ایی بانک اطلاعاتی خود ذخیره کنیم .
      فعال سازی File Stream :
      برای فعال سازی File Stream ابتدا باید وارد بخش مدیریت Sql server بشیم :

      ذخیره سازی فایل ها در بانک های اطلاعاتی : استفاده از FileStream در سی شارپ (بخـــــش اول)

      بعد بروی Sql Server Services کلیک کنیم و بعد در پنل سمت راست نمونه یا Instance خودمون و انتخاب کنیم و با راست کلیک و انتخاب Properties وارد بخش تنظیمات بشیم

      ذخیره سازی فایل ها در بانک های اطلاعاتی : استفاده از FileStream در سی شارپ (بخـــــش اول)

      بعد از پنجره ی ظاهر شده :
      سربرگ File Stream و انتخاب می کنیم تمام چک باکس ها رو مارک دار می کنیم :

      ذخیره سازی فایل ها در بانک های اطلاعاتی : استفاده از FileStream در سی شارپ (بخـــــش اول)

      بعدش باید سرویس سرورمومن رو یکبار راه اندازی مجدد یا Restart کنیم :

      ذخیره سازی فایل ها در بانک های اطلاعاتی : استفاده از FileStream در سی شارپ (بخـــــش اول)

      منتظر می مونیم سرورمون را اندازی مجدد بشه :

      ذخیره سازی فایل ها در بانک های اطلاعاتی : استفاده از FileStream در سی شارپ (بخـــــش اول)

      دقیقا برای سرور ما میاد و یک Windows Share Name ایجاد می کنه ولی مثل فولدرهای که در شبکه به اشتراک گذاشتیم قابل دسترس نخواهد بود در اواسط مقاله اشاره خواهیم کرد که چگونه دقیقا باید به محل ذخیره ی فایل هایی که توسط فایل استریم ذخیره می شوند دسترسی داشته باشم

      بعدش باید فایل استریم رو هم در SQL SERVER فعال کنیم که با استفاده از کوئری پایین این کار رو انجام خواهیم داد :

      ذخیره سازی فایل ها در بانک های اطلاعاتی : استفاده از FileStream در سی شارپ (بخـــــش اول)

      اون 2 سطح دسترسی و تعیین می کنه 2 به معنی اینکه یک برنامه از بیرون یا اصطلاحا یک کلاینت هم بتونه به فایل استریم ما دسترسی داشته باشه .
      خوب الان وقت اون رسیده که سناریووی تعریف کنیم :
      سناریو : بانک اطلاعاتی ایجاد خواهیم کرد که نیاز داریم در اون اطلاعات برنامه نویس ها رو ذخیره کنیم
      هر برنامه نویس باید نام و یک عکس و یک فایل PDF به عنوان رزومه و یک فیلم از معرفی کارهاش داشته باشه .
      خوب بانک اطلاعاتیمون و به این شکل ایجاد می کنیم :
      با راست کلیک بروی Database و انتخاب New Database با پنجره ی زیر مواجه خواهیم شد

      ذخیره سازی فایل ها در بانک های اطلاعاتی : استفاده از FileStream در سی شارپ (بخـــــش اول)

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

      ذخیره سازی فایل ها در بانک های اطلاعاتی : استفاده از FileStream در سی شارپ (بخـــــش اول)

      در بخش پایینی پنجره یعنی FileStream در پایین پنجره بروی Add کلیک می کنیم :
      اسم فایل استریم و FSTREAM گذاشته و تیک Default رو هم فعال می کنیم :

      ذخیره سازی فایل ها در بانک های اطلاعاتی : استفاده از FileStream در سی شارپ (بخـــــش اول)

      به بخش General باز میگردیم و بروی Add پایین پنجره کلیک می کنیم :

      ذخیره سازی فایل ها در بانک های اطلاعاتی : استفاده از FileStream در سی شارپ (بخـــــش اول)

      خوب پس از کلیک بروی ADD سطری جدید اضافه میشه :
      ستون FileGroup رو بروی FileStream میزاریم به محض انجام این کار فایل استریمی که تعریف کردیم رو در بخش Filegroup ظاهر می کنه که ما اسم فایل استریممون و گذاشتیم : FSTREAM
      در بخش آخر هم مسیری برای ذخیره سازی FileStream در نظر می گیریم :
      LogicName هم یه اسم هست که من اسم : DB_FILESTREAMدر نظر گرفتم :

      ذخیره سازی فایل ها در بانک های اطلاعاتی : استفاده از FileStream در سی شارپ (بخـــــش اول)

      ذخیره سازی فایل ها در بانک های اطلاعاتی : استفاده از FileStream در سی شارپ (بخـــــش اول)

      در آخر یک نام هم برای بانک اطلاعاتیمون تخصیص خواهیم داد من اسم Programmers رو انتخاب می کنم و بروی ok کلیک می کنیم :

      ذخیره سازی فایل ها در بانک های اطلاعاتی : استفاده از FileStream در سی شارپ (بخـــــش اول)

      خوب بعد از ساخت دیتابیسمون باید جدول بسازیم :
      جدولمون و با استفاده از اسکریپت میسازیم چرا ؟ چون که برای تعریف ستون هایی از نوع varbinary که بتونن اطلاعات رو به صورت استریم ذخیره سازی کنند توی رابط کاربری SQL SERVER هنوز چیزی اضافه نشده یا بهتر بگم واسه خاطر کلمه ی کلیدی FILESTREAM :
      خوب پس با این اسکریپت جدولمون رو هم میسازیم :

      ذخیره سازی فایل ها در بانک های اطلاعاتی : استفاده از FileStream در سی شارپ (بخـــــش اول)

      *** حتما حتما باید توی جدولمون یک ستون با نوع داده ی : uniqueidentifier داشته باشیم .

      همون طور که از اسمش مشخصه ترجمه اش میشه شناسایی منحصر به فرد ببینید ما برای اینکه در سطح جدول یک سطر و از بقیه متمایز کنیم از کلید اصلی استفاده می کنیم . اما اگر بخوایم یک سطر رو در سطح کل دیتابیس و کل SQL SERVER های جهان به صورت منحصر به فرد ایجاد کنیم از این نوع استفاده منی کنیم . توضیحش مفصله که SQL سرور با استفاده از چه چیزهایی و ترکیب اونها باهم میاد واسه ما تضمین می کنه که این سطر با استفاده از ROWGUID کاملا متمایز خواهد شد .
      New id هم یک تابع کاربردی برای ایجاد یک شناسه ی منحصر به فرده خوب چون قبلی Default قرار دادیم منظورمون اینه که مقدار پیش فرض این ستون یک id منحصر به فرد باشه .

      هر سطر و که وارد می کنیم خود SQL SERVER با تابع newid() واسه ما یک آیدی کاملا منحصر به فرد ایجاد می کنه .

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

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

      خوب ستون بعدی ستون نام هست که هر برنامه نویس یک نام باید داشته باشه .
      و دقت کنید به سه ستون بعدی که با سرکلمه ی File شروع می شن : اول فایل عکس دوم فایل رزومه یا فایل PDF و سوم فایل ویدیویی .
      خوب واسه اینکه این نوع ستون ها به صورت فایل استریم بروی دیسک ذخیره شوند دو شرط باید داشته باشند 1- نوعشون باینری با اندازه ی MAX تعریف بشه 2- و بعد از نوع ستون کلمه ی کلیدی FILESTREAM ذکر بشه .
      خوب الان همه چیز اماده ی شروع برنامه نویسی هست ولی قبلش :
      اجازه بدین فایل استریمی که ساختیم و توی خود محیط SQL SERVER تست کنیم .
      تستمون شامل وارد کردن داده ی جدید در جدلی هست که ساختییم :
      با دستور Insert Into اطلاعات زیر و وارد جدول می کنیم :

      ذخیره سازی فایل ها در بانک های اطلاعاتی : استفاده از FileStream در سی شارپ (بخـــــش اول)

      چون ستون اول id در تعریف جدول واسش مقدار پیش فرض یا Default در نظر گرفتیم نیازی نیست در دستور Insert ذکرش کنیم .
      ستون های دوم و سوم و چهارم در جدول چون مقدار binary میگیرند من واسه تست اومدم دادهی رشته ایی رو Cast یا تبدیل نوع کردم به نوع داده ی binary و در دستور Insert ازش استفاده کردم .
      خوب پس از اجرای دستور بالا اگر از جدلمون خروجی بگیریم منظورم همون Select هست با خروجی پایین مواجه میشیم :

      ذخیره سازی فایل ها در بانک های اطلاعاتی : استفاده از FileStream در سی شارپ (بخـــــش اول)

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

      ذخیره سازی فایل ها در بانک های اطلاعاتی : استفاده از FileStream در سی شارپ (بخـــــش اول)

      خوب با مراجعه به مسیری که در موقع ایجاد فایل استریم معرفی کردیم با پوشه یی مواجه خواهیم شد که هم نام هست با Logicalname که موقع اضافه کردن فایل گروپ به دیتابیسمون انتخاب کردیم .
      دقیقا DB_FileStream همون Logical name هست که در ایجاد بانک اطلاعاتیمون برای فایل استریم تعریف کردیم .
      خوب با ورود به پوشه ایی که فایل استریم در اون ذخیره میشه :

      ذخیره سازی فایل ها در بانک های اطلاعاتی : استفاده از FileStream در سی شارپ (بخـــــش اول)

      یک پوشه ی دیگه هست که این و به عنوان جدولی در نظر بگیرید که حاوی فایل استریم هست .
      کلا SQL SERVER هر جدولی و که شامل نوع فایل استریم باشه رو با همچین نامی که قطعا منحصر به فرد هست ذخیره می کنه .
      در هر پوشه در فایل استریم که برابر جدول هست : یعنی با ورود به جدول بالا سه پوشه ی دیگه می بینیم که اطلاعات سه ستون عکسمون و فایل PDF و فایل ویدیو در اون ذخیره میشه .
      اینم جدولی که ستون های اون که 3 ستون داشتیم که حاوی فایل استریم بود پس سه تا پوشه ی جداگانه برای ذخیره و نگهداری هر ستون جدول ایجاد می کنه :

      ذخیره سازی فایل ها در بانک های اطلاعاتی : استفاده از FileStream در سی شارپ (بخـــــش اول)

      داخل هر ستون به ازای هر سطر یک فایل با پسوندی خاص که اطلاعات توی اون ذخیره میشه ایجاد خواهد شد :
      با ورود به هر پوشه و DRAG and DROP اون توی Notepad می تونیم اطلاعاتی رو که در هر ستون وارد کردیم ببینیم :
      وارد پوشه ی اول میشیم و محتویات فایل اون رو در نت پد مشاهده می کنیم :

      ذخیره سازی فایل ها در بانک های اطلاعاتی : استفاده از FileStream در سی شارپ (بخـــــش اول)

      وارد پوشه ی دوم میشیم و همین کار رو تکرار می کنیم :

      ذخیره سازی فایل ها در بانک های اطلاعاتی : استفاده از FileStream در سی شارپ (بخـــــش اول)

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

      ذخیره سازی فایل ها در بانک های اطلاعاتی : استفاده از FileStream در سی شارپ (بخـــــش اول)

      خوب در آخر هم در بخش بانک اطلاعاتی از جدول خروجی میگیریم و توسط Cast دادهی ذخیره شده در هر ستون رو به صورت متنی نمایش می دهیم :
      با استفاده از این کوئری :
      پس از هر ستون مقدار همون ستون با استفاده از تابع CAST تبدیل با داده ی nvarchar کردیم که داده ها واستون قابل خوندن باشه :

      ذخیره سازی فایل ها در بانک های اطلاعاتی : استفاده از FileStream در سی شارپ (بخـــــش اول)

      و اینم خروجی کوئری بالا :

      ذخیره سازی فایل ها در بانک های اطلاعاتی : استفاده از FileStream در سی شارپ (بخـــــش اول)

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

      ذخیره سازی فایل ها در بانک های اطلاعاتی : استفاده از FileStream در سی شارپ (بخـــــش اول)

      بعد با تغیر اندازه ی فرم و اضافه کردن کنترل های زیر ادامه خواهیم داد :
      1-ابتدا یک کنترل TAB به فرم اضافه می کنیم برای اینکه همین فرم را به چندین بخش با سربرگ های مختلف تقسیم کنیم و نیازی به ساخت فرم جدید نداشته باشیم .
      2- 4 تا دکمه و سه تا لیبل و یک پیکچر باکس اضافه می کنیم : پیکچر باکس برای پیش نمایش عکسی که برنامه نویس قرار هست بارگذاری کنه . 4 تا دکمه به ترتیب برای بارگذاری فایل عکس و فایل PDF و فایل ویدیویی و دکمه ی چهارم برای ثبت نام نهایی . و 3 عدد TextBox هم به فرم برای زمانی که کاربر فایل مورد نظر را انتخاب کرد آدرس فایل را در کادر متن روبه روی خودش نمایش دهیم .
      این شکل فرمی که طراحی کردم :

      ذخیره سازی فایل ها در بانک های اطلاعاتی : استفاده از FileStream در سی شارپ (بخـــــش اول)

      دقت کنید که پیش نمایش رزرومه یا همون فایل PDF و پیش نمایش فایل ویدیویی MP4 اونها رو باید یا در رویداد Form_Load از کنترل Tab حذف خواهیم کرد چرا ؟ برای اینکه این دو تب زمانی است که برنامه نویسی که ثبت نام کرده پس از ورود اطلاعات خودش بتونه فیلم و رزومه خودش و ببینه همچنین عکسی که بارگذاری کرده . برای فیلم و رزومه سربرگی جدا تشکیل دادم به این دلیل که کنترل اونها مقداری بزرگ بود و خواستم کاملا مشخص و واضح باشه .
      ضمنا یاد آوری می کنم که من خاصیت Windowsstate را به Maximized تغییر داده ام که در زمان اجرا پنجره ی اصلی به صورت تمام صفحه یا فول اسکرین دیده شود .
      خوب این کدها رو برای مقاصد بالا در رویداد Form_Load فرم 1 تایپ می کنیم :

      ذخیره سازی فایل ها در بانک های اطلاعاتی : استفاده از FileStream در سی شارپ (بخـــــش اول)

      کنترل tabpage همون طور که اطلاع دارید برای مخفی کردنش از کاربر و نمایش دوباره از متدهای Remove و Insert استفاده خواهیم کرد .
      خوب تکست باکس اول برای گرفتن نام برنامه نویس استفاده میشه . که رنگ BackColor اون رو من تغییر دادم واسه اینکه مشخص تر بشه .
      خوب برای کلیدهای بارگذاری کننده هم از کنترل OpenFileDialog استفاده کردم .
      برای کلید بار گذاری تصویر از کدهای پایین استفاده خواهیم کرد :

      ذخیره سازی فایل ها در بانک های اطلاعاتی : استفاده از FileStream در سی شارپ (بخـــــش اول)

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

      ذخیره سازی فایل ها در بانک های اطلاعاتی : استفاده از FileStream در سی شارپ (بخـــــش اول)

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

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


      خوب برای دکمه ی بارگذاری رزومه یا همون فایل PDF هم این و می نویسیم :

      ذخیره سازی فایل ها در بانک های اطلاعاتی : استفاده از FileStream در سی شارپ (بخـــــش اول)

      دقیقا مثل قبله با 2 تفاوت کوچیک : 1- محدودیت حجم فایل به 5 مگ ارتقا پیدا کرد 2- در صورتی که کاربر فایل مناسب را انتخاب کرده باشد و نتیجه ی دیالوگ قابل قبول باشد و بدون خطا پیام مناسبی به کاربر شامل آدرس فایل انتخابی نمایش می دهیم .

      برای دکمه ی بارگذاری فایل ویدیویی هم مثل دو دکمه ی قبل فقط با تفاوت حجی 9 مگ کدهای بالا رو باز نویسی می کنیم :

      ذخیره سازی فایل ها در بانک های اطلاعاتی : استفاده از FileStream در سی شارپ (بخـــــش اول)

      دقت کنید که کلاس FileInfo ویژگی Length اندازه ی فایل و به بایت برمیگردونه پس ما هم باید محدودیت حجمیمون رو به صورت بایت در شرط قرار بدیم .

      خوب میرسیم به بخش تبدیل هر سه فایل به بیت ها و اماده کردن هر سه فایل برای نوشتن اونها در دیتابیس از طریق فایل استریم .
      دقت کنید که برای وارد کردن برنامه نویس جدید من از این تکنیک ویا منطق استفاده می کنم :
      ابتدا نام کاربری و فقط در دیتا بیس وارد میکنیم و به ازای سه ستون که حاوی سه فایل هستند مقدار یک کاراکتر فاصله ‘’ وارد می کنیم چرا ب؟ برای اینکه سه ستون مورد نظر فایل هاشون بروی دیسک ایجاد شود .
      سپس با استفاده از نام ستونی که فایل استریم روی اون فعال هست و با استفاده از تابع PathName() مسیر فایل هر سه ستون و بدست خواهیم اورد سپس فایل ها را به ارایه ایی از بایت ها تبدیل می کنیم و در فایل مخصوص هر ستون می نویسیم دقت کنید در هر فایل مخصوص همون ستون . رکورد که ایجاد بشه ستون هایی که فایل استریم هستن یک فایل فیزیکی بروی دیسک تشکیل می دهند به ازای هر سطر سپس با استفاده از کلاس SqlFileStream در فایل مربوط به همان ستون فایلی که تبدیل کردیم به ارایه ایی از بایت ها را می نویسیم .
      اول از همه نیاز به تابعی داریک که بتونه فایل ما رو بخونه و تبدیل کنه به ارایه ایی از بایت ها :

      ذخیره سازی فایل ها در بانک های اطلاعاتی : استفاده از FileStream در سی شارپ (بخـــــش اول)

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

      ذخیره سازی فایل ها در بانک های اطلاعاتی : استفاده از FileStream در سی شارپ (بخـــــش اول)

      خوب حالا نوبت به بخش اصلی رسیده :
      در همون ابتدا تشکیل یک Transaction Scope می دیم . دقیقا کار این Transaction Scope همون کاریه و انجام میده که تراکنش ها در sql server انجام می دهند . تعریف تراکنش : مجموعه ایی از دستورات که باید همه ی آنها تا اخر اجرا شوند تا تراکنش تثبیت شود در صورتی که یکی از دستورات موجود در تراکنش به هردلیلی اجرا نشود و یا با خطا همراه شود دستوراتی که قبل از خطا هم اجرا شدند منتفی می شوند و به حالت قبل بر می گردنند . اصطلاحا تراکنش ها اتمیک بودن یک عمل رو تضمین خواهند کردند . اتمیک هم به معنی غیر قابل تجزیه پس یا 100 درصد دستورات باید موفقیت آمیز اجرا شوند و یا به هر دلیلی تنها در بخشی از کد هم دچار مشکل شود کل دستورات اجرا شده نادیده در نظر گرفته خواهد شد و اصطلاحا Rollback می شوند .
      برای اضافه کردن مرجع مربوط به کلاس TransactionScope باید ابتدا Reference اون رو به رفرنس های پروژمون اضافه کنیم برای این کار :

      ذخیره سازی فایل ها در بانک های اطلاعاتی : استفاده از FileStream در سی شارپ (بخـــــش اول)

      و بعد از پنجره ی ظاهر شده مسیر زیر و طی می کنیم و System. Transaction رو انتخاب میکنیم :

      ذخیره سازی فایل ها در بانک های اطلاعاتی : استفاده از FileStream در سی شارپ (بخـــــش اول)

      خوب نوبت تعریف Connection String یا رشته ی اتصال هست بنده اغلب رشته ی اتصال و به صورت یک Properties در پروژه اضافه می کنم :

      ذخیره سازی فایل ها در بانک های اطلاعاتی : استفاده از FileStream در سی شارپ (بخـــــش اول)

      از پنجره ی ظاهر شده در بخش Settings یک ردیف که در اصل همون رشته ی اتصالمون هست رو با نام ConnectionStr اضافه می کنیم :

      ذخیره سازی فایل ها در بانک های اطلاعاتی : استفاده از FileStream در سی شارپ (بخـــــش اول)

      بعد در پروژه برای دسترسی به اون اینطوری ازش استفاده می کنیم :

      ذخیره سازی فایل ها در بانک های اطلاعاتی : استفاده از FileStream در سی شارپ (بخـــــش اول)

      خوب متغیر رشته ایی بالا رو به صورت Global یا همون سراسری تعریفش می کنیم همون طور که می دونید تعریف متغیر سراسری در سی شارپ در کلاس خود Form و قبل از تمامی توابع ها باید صورت بگیره تا در تمامی توابع بهش دسترسی داشته باشیم .
      خوب حالا Store Procedure هایی که لازم داریم رو در sql server تعریف می کنیم و توی برنامه نویسی ازشون استفاده خواهیم کرد :
      این تابعی که در زیر مشاهده می کنید با نام InsertToInformation ابتدا عملیات Insert رو با نام برنامه نویس که به عنوان پارامتر ورودی به سمتش ارسال میشه انجام میده و سه ستون بعدی رو به یک کاراکتر خالی ایجاد می کنه :

      ذخیره سازی فایل ها در بانک های اطلاعاتی : استفاده از FileStream در سی شارپ (بخـــــش اول)

      در دل فرمان Insert یک فرمان تحت عنوان OUTPUT وجود داره که پس از عملیات Insert , Update به جداول inserted و updated رو برای ما فراهم می کنه ما هم برای انکه id رکوردی که Insert میشه رو بدست بیاریم با کلمه ی کلیدی OutPut که خروجی ان حتما باید متغیری از نوع جدول باشه . پس ما هم متغیر جدولی با یک ستون که id هست ایجلد می کنیم و پس از Insert ای دی اون و به این طریق در متغیر جدولی میریزیم .
      اما اگر به کوئری دقت کنید تابعی جدید با نام PathName() مشاهده می کنید : کار این تابع اینه که آدرس ستونی که به صورت فایل استریم ذخیره می شود را برای ما برگردونه آدرس ستون یک ادرس UNC هست که به فایلی بروی دیسک اشاره می کند .
      پس در نهایت با اجرای کوئری بالا ادرس سه ستون تصویر و PDF و فایل ویدیو رو بدست میاریم .
      در بخش آخر کوئری در خط اخر هم از کوئری دیگری در بخش شرط کوئری بیرونی استفاده کردیم که دقیقا همان سطری که اضافه شده رو بگیریم آدرس سه ستون مورد نظر رو برای سطری که اضافه شده .
      برای روشن شدن نحوه ی کارکردن تابع PathName به کوئری زیر و نتیجه ی آن دقت کنید :

      *** توجه کنید که کلمه ی کلیدی PathName برای ستون هایی کاربرد خواهد داشت که فایل استریم بروی آنها فعال باشد و آن ستون به صورت فیزیکی بروی دیسک ذخیره شده باشد .

      *** دقت کنید که در بخش تکیل خودکار نام توابع ، تابع PathName به صورت خودکار توسط IntelliSense شناسایی نخواهد شد و در تایپ اون دقت لازم و انجام بدین .

      خوب کوئری پایین و برای بدست آوردن آدرس فیزیکی بر اساس استاندارد UNC استفاده خواهیم کرد :

      ذخیره سازی فایل ها در بانک های اطلاعاتی : استفاده از FileStream در سی شارپ (بخـــــش اول)

      خوب می بینید که با استفاده از کوئری بالا تمامی آدرس فایل های ذخیره شده در سه ستون جدلمون و بدست میاریم .
      تا اینجا ما این کدها رو نوشتیم در Visual Studio :

      ذخیره سازی فایل ها در بانک های اطلاعاتی : استفاده از FileStream در سی شارپ (بخـــــش اول)

      چون در Store Procedure ی که در sql server تعریف کرردیم دستور Select استفاده شده در سی شارپ با استفاده از SqlDataReader که می تونه خروجی یک دستور Select که یک دیتاست محسوب میشه رو بخونه .
      با استفاده از خاصیت اندیس پذیر SqlDataReader می تونیم بگیم مقدار کدوم ستون و می خوایم .
      من هم مطابق هر ستون یک متغیر رشته ایی برای نگهداری ادرس فیزیکی هر ستون تعریف کردم و مقداری که از دیتابس با اخرین دستور select موجود در تابع InsertToInformation برگشت داده شده را در متغیر مربوطه ذخیره کردم .
      تابعی بعدی که در SqlServer تعریف می کنیم GetTransactionContext .
      این تابع برای دریافت دسترسی به فایل سیستم استفاده میشه و در اصل در اون از تابع GETFILESTREAMTRANSACTION_CONTEXT() استفاده کرده ایم . بهتر بگم که در حین انجام یک تراکنش این تابع به ما یک توکن خواهد داد که مجوز دسترسی به فایل سیستم محسوب میشه .

      ذخیره سازی فایل ها در بانک های اطلاعاتی : استفاده از FileStream در سی شارپ (بخـــــش اول)

      خوب دوباره چون داریم از Select در تابع sql ی خودمون استفاده می کنیم در سی شارپ با استفاده از SqlDataReader اقدام به خوندن نتیجه ی این کوئری خواهیم کرد .

      ذخیره سازی فایل ها در بانک های اطلاعاتی : استفاده از FileStream در سی شارپ (بخـــــش اول)

      دقیقا مثل کدهای بالا داریم از یک تابع تعریف شده در sql server در زبان سی شارپ استفاده می کنیم و باز هم نتیجه ی تابع رو با استفاده از یک SqlDataReader می خونیم .
      فقط نکته ی که توجه می کنیم اینه که من از TypeCast یا تغییر نوع استفاده کردم چون اطلاع دارم که Token برگردانده شده از تابع GetTransactionContext به صورت بات هست من هم مستقبما از TypeCast استفاده کردم و در یک متغیر از نوع بایت توکن و نگه داشتم تا به موقع ازش استفاده کنم .
      خول حالا با استفاده از کلاس SqlFileStream به آدرس های ذخیره شده دسترسی پیدا می کنیم و توی اون فایل ها اطلاعات و Write می کنیم یا می نویسیم
      توی کوئری ها قبلی مشاهده کردین که چطوری با استفاده از تابع PathName ما آدرس فایل های ذخیره شده مربوط به همون سطر و نگه داری کردیم و باید با استفاده از کلاس SqlFileStream توی این فایل ها بنویسیم.
      خوب ما هر فایلمون برای تبدیل به ارایه ایی از بایت ها با استفاده از تابعی که نوشتیم (FileToByteArray) هر نوع فایلی رو تبدیل به باینری میکنیم .

      ذخیره سازی فایل ها در بانک های اطلاعاتی : استفاده از FileStream در سی شارپ (بخـــــش اول)

      قابل ذکر هست که برای دسترسی به فایل ها یی که خود SQL می خونه و مینویسه نیاز به استفاده از کلاس SqlFileStream داریم بنده هم سه نمونه از اون و ایجاد کردم و در حالت دسترسی File.Write توی اون فایل ها که آدرسشون از قبل به دست آوردیم نوشتیم و در آخر پس از اتمام عملیات نوشتن در استریم و با متد Close بستیم .
      بخش برنامه نویسی کلید ثبت نام رو دوباره با توضیحات بررسی میکنیم :
      بخش اول :

      ذخیره سازی فایل ها در بانک های اطلاعاتی : استفاده از FileStream در سی شارپ (بخـــــش اول)

      بخش دوم :

      ذخیره سازی فایل ها در بانک های اطلاعاتی : استفاده از FileStream در سی شارپ (بخـــــش اول)

      بخش سوم :

      ذخیره سازی فایل ها در بانک های اطلاعاتی : استفاده از FileStream در سی شارپ (بخـــــش اول)

      *** دقت کنید که بخش چهارم و باید خارج از TransactionScope یا ناحیه ی Using تراکنش بنویسید چرا که بعد از خاتمه ی تراکنش اگر دستور دیگری اجرا بشه بروی نتیجه ی موفقیت آمیز بودن تراکنش تاثیر خواهد داشت و تراکنش اصطلاحا Abort خواهد شد .
      بخش چهارم : خالی کردن TextBox ها و نال کردن خاصیت Image کنترل PictureBox برای اینکه تصویری که نمایش می داد رو نمایش نده و نمایش پیغام موفقیت آمیز بودن عملیات :

      ذخیره سازی فایل ها در بانک های اطلاعاتی : استفاده از FileStream در سی شارپ (بخـــــش اول)

      ساختار کلی چیزی که تا الان نوشتیم :

      ذخیره سازی فایل ها در بانک های اطلاعاتی : استفاده از FileStream در سی شارپ (بخـــــش اول)

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

      ذخیره سازی فایل ها در بانک های اطلاعاتی : استفاده از FileStream در سی شارپ (بخـــــش اول)

      و نتیجه ی عملیات ثبت نام :

      ذخیره سازی فایل ها در بانک های اطلاعاتی : استفاده از FileStream در سی شارپ (بخـــــش اول)

      داخل دیتابیس بررسی می کنیم که آیا واقعا رکوردی با نام علی حسین پور ثبت شده است یا خیر :

      ذخیره سازی فایل ها در بانک های اطلاعاتی : استفاده از FileStream در سی شارپ (بخـــــش اول)

      خوب پس با خوبی و خوشی اطلاعات برنامه نویس از جمله اسمش ، عکسش ، رزومه اش که فایل PDF هست ، و در نهایت فیلم که با فرمت MP4 هست .
      الان وقت اون رسیده که هر برنامه نویس پس از ورود اطلاعاتش بتونه فایل هایی که توی دیتابیس مربوط به خودش هست رو بخونه و در ضمن ID یا شماره شناساییش رو هم که سیستم به صورت خودکار بهش اختصاص داده بتونه ببینه :
      سربرگ پیش نمایش رزومه باید از کنترلی استفاده کنیم که بتونه فایل پی دی اف کاربر و نشون بده بهمون .
      من از کنترل یا همون ActiveX شرکت Foxit Reader رایگان استفاده کردم که خیلی راحته کارکردن باهاش .
      حوب برای اضافه کردن این ActiveX اول باید خود نرم افزار FoxitReader نسخه ی رایگانش بروی سیستم ما نصب باشه می تونید این نرم افزار رو از سایت خودش به ادرس پایین دانلود کنید :
      دانلود از سایت FoxitReader
      خوب بعد از اینکه نصبش کردین باید بتونید که اون رو به بخش جعبه ابزار ToolBox محیط Visual Studio طی مراحل زیر اضافه اش کنید :
      روی جعبه ابزار راست کلیک کنید و Choose Item و انتخاب کنید :

      ذخیره سازی فایل ها در بانک های اطلاعاتی : استفاده از FileStream در سی شارپ (بخـــــش اول)

      پس از نمایان شدن پنجره ی پایین منتظر بمونید که تمامی کتابخانه ها و تمامی کامپوننت های موجود بروی سیستم بارگذاری شوند :

      ذخیره سازی فایل ها در بانک های اطلاعاتی : استفاده از FileStream در سی شارپ (بخـــــش اول)

      خوب وقتی که تمامی کامپوننت ها بارگذاری شدن و نوار پیشرفت تکمیل شد بروی سربرگ COM COMPONENT کلیک کنید و در بین کامپوننت ها به دنبال کامپوننت FoxitReader Control باشین وقتی پیداش کردن تیک چکس باکش و بزنید یعنی انتخابش کنید و بعد بروی OK کلیک کنید تا به جعبه ابزار اضافه شود .
      بعد از اینکه به جعبه ابزار اضافه شد فرم خودتون رو در حالت Designer وارد سربرگ پیش نمایش رزومه بشین و این کنترل و رو با اندازه ی مناسب در اون سربرگ قرار بدین :

      ذخیره سازی فایل ها در بانک های اطلاعاتی : استفاده از FileStream در سی شارپ (بخـــــش اول)

      ذخیره سازی فایل ها در بانک های اطلاعاتی : استفاده از FileStream در سی شارپ (بخـــــش اول)

      ذخیره سازی فایل ها در بانک های اطلاعاتی : استفاده از FileStream در سی شارپ (بخـــــش اول)

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

      ذخیره سازی فایل ها در بانک های اطلاعاتی : استفاده از FileStream در سی شارپ (بخـــــش اول)

      خوب حالا نوبت سربرگ پیش نمایش فایل ویدویی است برای ان بخش هم از کامپوننت شرکت VLC استفاده کردم دقیقا مثل مراحل بالا کار و انجام می دهیم فقط با این تفاوت که کامپوننت VLC رو با نام VLC ActiveX PLUGIN and IE WEB PLUGIN انتخاب می کنیم :

      ذخیره سازی فایل ها در بانک های اطلاعاتی : استفاده از FileStream در سی شارپ (بخـــــش اول)

      بعد که به جعبه ابزارمون اضافه شد :

      ذخیره سازی فایل ها در بانک های اطلاعاتی : استفاده از FileStream در سی شارپ (بخـــــش اول)

      فرم خودمون رو در حالت Desginer باز می کنیم وارد سربرگ پیش نمایش فایل ویدیویی مشیم و کامپوننت VLC رو اونجا با ابعاد مناسب قرار میدیم :

      ذخیره سازی فایل ها در بانک های اطلاعاتی : استفاده از FileStream در سی شارپ (بخـــــش اول)

      خوب فقط باید به این تب یک کلید جهت اجرای فایل ویدویی اضافه کنیم :

      ذخیره سازی فایل ها در بانک های اطلاعاتی : استفاده از FileStream در سی شارپ (بخـــــش اول)

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

      ذخیره سازی فایل ها در بانک های اطلاعاتی : استفاده از FileStream در سی شارپ (بخـــــش اول)

      *** خوب اگه یادتون باشه موقع لود شدن فرممون یعنی در رویداد form_load فرممون خودمون کاری کردیم که تب های پیش نمایش رزومه و پیش نمایش فایل ویدیویی مخفی بشن خوب حالا اگه کاربر بروی سربرگ مشاهدهی اطلاعات کاربر کلیک کرد باید اون دو سربرگ اضافه بشن به TABCONTROL و زمانی که بروی سربرگ ثبت نام کاربران کلیک می کنه دوباره اون دو سربرگ حذف بشن
      برای انجام این عملیات در رویداد SelectedIndexChanged باید کدهای پایین و جهت کنترل کردن این موارد اضافه کنیم :

      ذخیره سازی فایل ها در بانک های اطلاعاتی : استفاده از FileStream در سی شارپ (بخـــــش اول)

      و این کدها رو در بخش رویداد SelectedIndexChanged ، که رویدادی است که زمانی اندیس TabPage کنترل ،TabConrol عوض میشه فراخوانی خواهد شد :

      ذخیره سازی فایل ها در بانک های اطلاعاتی : استفاده از FileStream در سی شارپ (بخـــــش اول)

      در حالت اجرا پروژه تست می کنیم : (وقتی که کاربر تب اول و انتخاب کرده باشه یعنی قصد ثبت کاربر رو داشته باشه):
      زمانی که کاربر بروی تب اول کلیک کند :

      ذخیره سازی فایل ها در بانک های اطلاعاتی : استفاده از FileStream در سی شارپ (بخـــــش اول)

      زمانی که کاربر بروی تب دوم کلیک کند :

      ذخیره سازی فایل ها در بانک های اطلاعاتی : استفاده از FileStream در سی شارپ (بخـــــش اول)

      اون if ی که در بخش else قرار دادم واسه خاطر اینه که ممکنه کاربر چندین مرتبه بین تب مثلا دوم و سئم سوییچ کنه اونوقت به ازای هر بار رفتن و برگشن به تب دوم تب های سوم و چهارم اضافه خواهد شد پس من تب ها رو شمردم که وقتی 4 تا تب داریم در صورت تغییر اندیس تب پیسج دیگه نیاز نیست تبی اضافه شود .

      ادمه در بخش دوم ...
      برچسب ها
      مطالب مرتبط

      در حال دریافت اطلاعات

      نظرات
      • سلام
        الف) این روش نسبت به ذخیره سازی فایلها در یک فولدر سرور چه میزیتی دارد
        ب)تا چه حجمی می توان داده در این روش ذخیره سازی کرد(حداکثرحجم هرفایل)
        ج)امنیت ان چگونه است
        د)بکاپ گیری ان چگونه است
        باتشکر

      برای ارسال نظر ابتدا به سایت وارد شوید

      arrow