1397-11-19 19:28 راهنمایی در ساخت بانک اطلاعاتی SqlServer
booysusa

 
با درود خدمت همگی

تا قبل از امروز، من برای برنامه هام از بانک اطلاعاتی SqlCompact استفاده می کردم ولی میخوام برای یکی از برنامه هام از Sql Server استفاده کنم، وارد محیط Microsoft SQL Server Management Studio 17 شدم و دیتابیس خودم رو طراحی کردم ولی شیوه فراخونی اون را در برنامه ویژال استودیو نمی دونم
توی نت هم گشتم، هرچی بیشتر می گشتم، کمتر می یافتم (احتمالا شیوه جستجوی من مناسب نبوده)

1. امکانش هست بگید اشکال من کجاست؟

2. و اینکه کوئری آدرس دیتابیس رو چطوری از برنامه اس کیو ال منیجمنت دریافت کنم و چطوری در ویژال استودیو بنویسیم؟ (مبتدی وار باشد لطفا)


3. و اینکه ذخیره کردن عکس ها و اسناد در دیتابیس مناسب هست یا آدرس آنها در دیتابیس ذخیره بشود بهتر است؟ ( این سوال واقعا جوابش سخت هست، موافق و مخالف های زیادی دارد، مثلا ممکن است برنامه من بیش از 5 هزار عکس و حجم بیش از 5 گیگ عکس داشته باشد.



مشخصات برنامه من:
ویژال استودیو
زبان سی شارپ
ویندوز فرم
بانک اطلاعاتی: Sql Server
اینکه چرا از اس کیو ال سرور میخوام استفاده کنم (دلیل خاصی ندارد فقط نمیخوام برنامم بعدا بخاطر محدودیت های SqlCompact و یا محدودیت های SqlExpress به مشکل بر بخورد)

لطفا تصاویر را ببینید، مربوط به برنامه هست
این تصویر مربوط هست به برنامه اس کیو ال منیجمنت دیتابیس من با مشخصات زیر ساخته شده ولی نمیدونم چطوری آدرس کوئری رو به دست بیارم



این تصویر مربوط به به بخش دیتابیس برنامه من در ویژال استودیو ، شیوه نوشتن کوئری بانک اطلاعاتی که در اس کیو ال منیجمنت ساختم رو نمیدونم



ولی این خطا رو میده





شاید بخاطر این هست که بانک اطلاعاتی را تغییر دادم و از اس کیو ال کامپکت به اس کیو ال سرور نقل مکان کردم ، خطا میده، بنظرم بخاطر اینه که من توی رفرنسم Sql Server را ندارم




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



الان که با Microsoft SQL Server Management Studio درست کردم اینجوری هست






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




با عرض معذرت فراوان بابت این زحمت، میدونم زحمت زیادی هست ببخشید
1397-11-21 10:15
booysusa

 
موفق به وارد کردن دیتابیس به برنامه visual Studio شدم
ولی پس از لود شدن برنامه، با اینکه کانکشن استرینگ رو ست کردم چیزی ظاهر نمیشه و امکان انجام عملیات Crud مانند Insert نیست!!

تصاویر زیر مروبط به خطای قسمت افزودن مخاطب جدید هست (به نظرم نام جدول در قسمت Insert را درست وارد کردم ولی خطا می دهد)



تصاویر زیر مروبط به ست کردن آدرس کانکش استرینگ هست



تصاویر زیر مروبط به قسمت Insert یکی از بخش های Crud هست



این هم تصویر دیتابیس و جدول های من در برنامه Visual Studio است
1397-11-22 04:57
حاجی شریفی
مؤسس سایت
 
سلام
در ذات کارکردن با نسخه های عادی SqlServer میتوانید همانند تجربه تان در SqlCompact عمل کنید ومستقیم از دستورات SQL استفاده کنید.
باید ConnectionString را تنظیم کنید و با فرامین SQL از دیتابیس استفاده کنید.

و چند نکته برای موارد دیگر وجود دارد:

اول) اینکه خطای Null-Reference دریافت میکنید، مربوط به کد خودتان و جایی از کدتان ایراد دارد.
این یک خطای رایج است و البته دلیل آن خیلی راحت در چند ثانیه قابل کشف است.
اما بدون دیدن سورس کد نمیتوان گفت، چه چیز را Null رها کرده اید.

دوم) در یک پروژه واقعی از دستورات SQL استفاده میشود ولی برای اعمال ساده CRUD تلاش میشود تا از ابزار کمکی استفاده شود.
این ابزار با نام ORM شناخته میشود که مخفف Object Relational Mapping است.
یعنی ابزاری که میتواند اشیا دیتابیس (جدول، سطر، ستون و...) را به اشیا برنامه نگاشت کند.
در دات نت EntityFramework و NHibernate و با اغماض Dapper و... از نمونه های معروف این حوزه هستند.

درحال حاضر EF و نسخه جدید آن EFCore به شدت در پروژه های ویندوزی و وبی استفاده میشود.
این ابزار کار شما را در خواندن و تغییر دیتابیس بسیار ساده میکند.

در همین سایت هم یک تاپیک آموزش EF زدم که بدلیل مشغله کاری، هیچگاه تکمیل نشد:
/Forum/Home/Topic/10-EntityFramework-Education
نگاهی بیاندازید، شاید علاقه مندی شما، بهانه ای بر تکمیل تاپیک فوق شود!

سوم) در خصوص ذخیره فایل ، نظر شخصی ام ذخیره متادیتا فایل درون دیتابیس (نام،حجم،تاریخ،کاربرو...) و ذخیره خود فایل در هارد دیسک محلی و یا DAS و NAS و... است.
در برنامه های وبی که بسیار راحت قابل پیاده سازی است و برای برنامه های ویندوزی تحت شبکه، نیاز به ایجاد به سرویس RESTful اضافه برای خدمات دهی در شبکه وجود خواهد داشت.

( ولی
اول آنکه برای موارد ساده ،آزمایشی یا کوچک استفاده از فیلدهای دیتابیس برای ذخیره سازی ، باعث میشود کدنویسی کوتاه و ساده شود.
و
دوم آنکه خود SQLServer یک ویژگی مخصوص ذخیره سازی سازی فایل درون دیتابیس دارد که مخصوص خودش است و با نام FileStream شناخته میشود که به عنوان یک گذینه قابل بررسی است. )


شب خوش.
1397-11-22 21:26
booysusa

 
م
نقل قول
در ذات کارکردن با نسخه های عادی SqlServer میتوانید همانند تجربه تان در SqlCompact عمل کنید ومستقیم از دستورات SQL استفاده کنید.
باید ConnectionString را تنظیم کنید و با فرامین SQL از دیتابیس استفاده کنید.

بله شما درست می گویید آدرس کوئری را اصلاح کردم و همچنین تمام SqlCe ها را به Sql تبدیل کردم (مثلا SqlCeParameter را به SqlParameter تغییر دادم ) و using System.Data.SqlClient; را در فرم ادد کردم درست شد




نقل قول
اول) اینکه خطای Null-Reference دریافت میکنید، مربوط به کد خودتان و جایی از کدتان ایراد دارد.
این یک خطای رایج است و البته دلیل آن خیلی راحت در چند ثانیه قابل کشف است.
اما بدون دیدن سورس کد نمیتوان گفت، چه چیز را Null رها کرده اید.



من متوجه شدم تا وقتی بانک اطلاعاتی من به برنامه sql mangmanet وصل هست، من برای اجرای برنامه ام مشکلی ندارم، به محض deatach کردن بانک اطلاعاتی ام در برنامه sql mangmanet ، برنامه من دیگر در ویژال استودیو لود نمی شود و خطای زیر را می دهد

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




نقل قول
در همین سایت هم یک تاپیک آموزش EF زدم که بدلیل مشغله کاری، هیچگاه تکمیل نشد:
/Forum/Home/Topic/10-EntityFramework-Education
نگاهی بیاندازید، شاید علاقه مندی شما، بهانه ای بر تکمیل تاپیک فوق شود!

چقدر خوب میشود، چشم





نقل قول
سوم) در خصوص ذخیره فایل ، نظر شخصی ام ذخیره متادیتا فایل درون دیتابیس (نام،حجم،تاریخ،کاربرو...) و ذخیره خود فایل در هارد دیسک محلی و یا DAS و NAS و... است.
در برنامه های وبی که بسیار راحت قابل پیاده سازی است و برای برنامه های ویندوزی تحت شبکه، نیاز به ایجاد به سرویس RESTful اضافه برای خدمات دهی در شبکه وجود خواهد داشت.

( ولی
اول آنکه برای موارد ساده ،آزمایشی یا کوچک استفاده از فیلدهای دیتابیس برای ذخیره سازی ، باعث میشود کدنویسی کوتاه و ساده شود.
و
دوم آنکه خود SQLServer یک ویژگی مخصوص ذخیره سازی سازی فایل درون دیتابیس دارد که مخصوص خودش است و با نام FileStream شناخته میشود که به عنوان یک گذینه قابل بررسی است. )



کمی گیج شدم
بنظر شما من با آدرس فایل ها عکس هارو ذخیره کنم، یا خود عکس و اسناد را ذخیره کنم؟(ممکن است حجم داده های من به بیش از 20 گیگ برسد )
1397-11-22 22:19
booysusa

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


نقل قول
در ذات کارکردن با نسخه های عادی SqlServer میتوانید همانند تجربه تان در SqlCompact عمل کنید ومستقیم از دستورات SQL استفاده کنید.
باید ConnectionString را تنظیم کنید و با فرامین SQL از دیتابیس استفاده کنید.

بله شما درست می گویید آدرس کوئری را اصلاح کردم و همچنین تمام SqlCe ها را به Sql تبدیل کردم (مثلا SqlCeParameter را به SqlParameter تغییر دادم ) و using System.Data.SqlClient; را در فرم ادد کردم درست شد









نقل قول
اول) اینکه خطای Null-Reference دریافت میکنید، مربوط به کد خودتان و جایی از کدتان ایراد دارد.
این یک خطای رایج است و البته دلیل آن خیلی راحت در چند ثانیه قابل کشف است.
اما بدون دیدن سورس کد نمیتوان گفت، چه چیز را Null رها کرده اید.

من متوجه شدم تا وقتی بانک اطلاعاتی من به برنامه sql mangmanet وصل هست، من برای اجرای برنامه ام مشکلی ندارم، به محض deatach کردن بانک اطلاعاتی ام در برنامه sql mangmanet ، برنامه من دیگر در ویژال استودیو لود نمی شود و خطای زیر را می دهد



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

حال اگر پروژه من به مراحل پایانی رسید باید چطور deatach کنم که دیگر این خطا را ندهد









نقل قول
در همین سایت هم یک تاپیک آموزش EF زدم که بدلیل مشغله کاری، هیچگاه تکمیل نشد:
/Forum/Home/Topic/10-EntityFramework-Education
نگاهی بیاندازید، شاید علاقه مندی شما، بهانه ای بر تکمیل تاپیک فوق شود!

چقدر خوب میشود، چشم








نقل قول
سوم) در خصوص ذخیره فایل ، نظر شخصی ام ذخیره متادیتا فایل درون دیتابیس (نام،حجم،تاریخ،کاربرو...) و ذخیره خود فایل در هارد دیسک محلی و یا DAS و NAS و... است.
در برنامه های وبی که بسیار راحت قابل پیاده سازی است و برای برنامه های ویندوزی تحت شبکه، نیاز به ایجاد به سرویس RESTful اضافه برای خدمات دهی در شبکه وجود خواهد داشت.

( ولی
اول آنکه برای موارد ساده ،آزمایشی یا کوچک استفاده از فیلدهای دیتابیس برای ذخیره سازی ، باعث میشود کدنویسی کوتاه و ساده شود.
و
دوم آنکه خود SQLServer یک ویژگی مخصوص ذخیره سازی سازی فایل درون دیتابیس دارد که مخصوص خودش است و با نام FileStream شناخته میشود که به عنوان یک گذینه قابل بررسی است. )

کمی گیج شدم

بنظر شما من با آدرس فایل ها عکس هارو ذخیره کنم، یا خود عکس و اسناد را ذخیره کنم؟(ممکن است حجم داده های من به بیش از 20 گیگ برسد )
1397-11-26 14:07
حاجی شریفی
مؤسس سایت
 
سلام
میبخشید کمی گرفتاری داشتم و نتوانستم زودتر پاسخ دهم...

اصول کار دیتابیس ها بر مبنای پروتکل های شبکه است.
دیتابیس هایی مانند SQL Server, Oracle, My SQL, Postgre SQL و...

اینطور نیستند که شما یک فایل بدهید و برنامه به آن فایل متصل شود و کار کند.
بلکه دیتابیس در سرور تعریف شده و حدود امنیتی آن مشخص میشود.
سپس کلاینت ها با نام یا IP سرور و نام دیتابیس و یک جفت User, Pass متصل شده و تراکنش انجام میدهند.

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

در نهایت در نسخه های اصلی SQL Server شما نمیتوانید با فایل کار کنید.
به قول خودتان دیتابیس باید Attach باشد تا بتوان با آن کار کرد.

حتی شما سایت هم طراحی کنید، و یک Host اشتراکی اجاره کنید، اینطور نیست که فایلی از دیتابیس ببینید یا کپی کنید.
یک پنل FTP برای کپی همه فایل ها میدهند و یک پنل مخصوص هم برای ساخت دیتابیس و جداول و... در سرور تان.
یعنی نمیتوانید فایل mdf دیتابیس تان کپی کنید به سرور و با آن کار کنید.

منظورم آن است که کلا مفهوم فایل محور را در کار با دیتابیس ها وپروژه های واقعی باید فراموش کنید.

اما...!

در این بین SQL Server برای پروژه های کوچک و آزمایشی هم فکر هایی کرده.
چندین نسخه از SQL Server وجود دارد:
1) نسخه Compact که تقریبا هیچ امکاناتی از SQL Server را نداشت! و حتی فایل sdf آن هم با سایر نسخه های SQL Server سازگار و قابل استفاده نبود و تولید آن هم متوقف شد.
2) نسخه LocalDB که خیلی خلاصه شده است و شاید بتوان آن را جایگزینی بر Compact دانست و امکان کار با فایل mdf بدون Attach را هم دارد. (و سرویسی که باید Start باشد هم ندارد.)
3) نسخه Express که ویژگی های جالب و خاص خود را دارد (که به نوعی بین بند قبلی و بعدی قرار میگیرد ...)
4) نسخه های اصلی مانند Workgroup و Web و Standard و Azure و Developer و Enterprise که بیشترین حد امکانات را دارند و عملا در سایت ها و شرکت ها و شبکه ها و... استفاده میشوند و هیچ کدام با دادن فایل mdf کار نمیکنند.


اگر برنامه تان کوچک است و تحت شبکه و از چند رایانه نمیخواهد کار کند و میخواهید برنامه تان بدون Attach و مانند تجربه تان در Compact با دادن مسیر فایل کار کند، به گمانم بهترین گذینه نصب و استفاده از SQL Server LocalDB است.
LocalDB امکانات بسیار بیشتر از Compact دارد و ساختار دیتابیس و جداول و... در LocalDB بطور کامل با نسخه صنعتی Enterprise هماهنگ است.
یعنی شما میتوانید برنامه را در LocalDB بسازید و آزمایش کنید و حتی سالها با آن کار کنید و بعد تصمیم بگیرید دیتابیس را ببرید در Enterprise و Attach کنید و در شبکه کار کنید.

با Connection String ای شبیه این میتوانید از LocalDB استفاده کنید:

"Data Source=(LocalDb)\MSSQLLocalDB;Initial Catalog=DBNAME;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|\DBFILE.mdf"


در ضمن VS2017 در زمان نصب، خودکار نسخه ای از LocalDB را هم برایتان نصب میکند.
برای دانلود مستقل LocalDB و نصب در رایانه مقصد/مشتری هم میتوانید به سایت مایکروسافت مراجعه کنید و بسته SQL-Express را دانلود کنید که شامل یک فایل Setup مستقل برای LocalDB هم خواهد بود.

نسخه SQL Server 2017 Express + LocalDB را میتوانید از تاپیک زیر دانلود کنید:
/Forum/Home/Topic/66-SQL-Server-2017

مجدد تاکید میکنم که اگر VS2017 نصب کرده اید، رایانه خودتان LocalDB را دارد.
1397-11-26 15:04
حاجی شریفی
مؤسس سایت
 
و سوال دوم تان
نقل قول نوشته شده توسط: booysusa
بنظر شما من با آدرس فایل ها عکس هارو ذخیره کنم، یا خود عکس و اسناد را ذخیره کنم؟(ممکن است حجم داده های من به بیش از 20 گیگ برسد )

این حجم خیلی زیاد نیست و شاید در مرز قرار داشته باشد ولی از حد عادی SQL Server Express, LocalDB هم خارج است.
یعنی برای این حجم باید نسخه Standard یا Enterprise و... را استفاده کنید.

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


در آن پروژه ما از این کتابخانه استفاده کردیم:
https://www.nuget.org/packages/Diamond.FileStorage
برای آرشیو فایل های همین سایت فعلی هم از همین مکانیزم استفاده شده.

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


یعنی هر فایل یک عدد ID-64bit دارد (+یک نام استریم کوچک اختیاری...) که خود عدد فایل معرف مسیر/Path فایل هم است.
(18,446,744,073,709,551,615 فایل بدون در نظر گرفتن نام استریم اختیاری)

نمونه پروژه بر مبنای این کتابخانه را میتوانید از لینک زیر دانلود کنید:
https://github.com/Hajisharifi/Diamond-Samples/tree/master/FileStorage
البته پروژه وبی است ولی تفاوتی خیلی خاصی در WinForm و Wpf هم ندارد.

یعنی شما یک جدول در دیتابیس می سازید با کلید int یا bigint و نام فایل و تاریخ و سایز و توضیحات و... را ذخیره میکند.
همان کلید int/bigint را به dll فوق میدهید تا فایل را read/write کنید.

ولی همچنان برای 20GB میتوانید از همان SQL Server هم استفاده کنید.
گمانم Express و LocalDB هر کدام تا حجم 10GB را رایگان پشتیبانی میکنند.
و نسخه های Standard و Enterprise و... محدودیت خاصی ندارند. ( محدودیت دارند ولی اعدادبسیار نجومی است گمانم چیزی بیش از 500PB ... ! )