سئوالاتی درباره sql

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
سلامی مجدد
ممنون از تمامی جواب تون (چه توی این تاپیک چه توی تاپیک های دیگه) استاد علی
یه سئوال همیشه توی ذهنم بود اینکه چرا sql server را مثل آرایه ی 3 بعدی (یا مثلا مثلا آرایه هایی از Dictionary) طراحی نکردن که نیاز نباشه وقتی یه فیلد وقتی تکراری میشه ، یه عالمه وقت گذاشت تا اون فیلد را توی یه جدول دیگه نوشت و بعدش وقت گذاشت تا ارتباط بین دو جدول برقرار کرد؟
 

the_king

مدیرکل انجمن
سلامی مجدد
ممنون از تمامی جواب تون (چه توی این تاپیک چه توی تاپیک های دیگه) استاد علی
یه سئوال همیشه توی ذهنم بود اینکه چرا sql server را مثل آرایه ی 3 بعدی (یا مثلا مثلا آرایه هایی از Dictionary) طراحی نکردن که نیاز نباشه وقتی یه فیلد وقتی تکراری میشه ، یه عالمه وقت گذاشت تا اون فیلد را توی یه جدول دیگه نوشت و بعدش وقت گذاشت تا ارتباط بین دو جدول برقرار کرد؟
اگر قرار باشه بر اساس هر عملیاتی که وقت بیشتری میگیره ساختار زبانی تغییر کنه که دیگه ساده و همه منظوره نخواهد موند.
ربطی هم به SQL Server نداره، در زبان SQL آرایه سه بعدی و Dictionary معنی نداره که در SQL Server باشه. زبان SQL بر اساس دسترسی همزمان و چند جانبه به اطلاعات پایگاه داده پایدار و ماندگار طراحی شده، در ساده ترین و همه منظوره ترین شکل ممکن. و نه داده های داخل حافظه RAM، الزاما مثل Dictionary امکان قرار گیری کلیه داده ها در حافظه نیست و هر لحظه امکان از میان رفتن سازگاری داده ای هم هست. جدول در پایگاه داده که مثل Dictionary یا آرایه نیست، ممکنه یک بخش داده از سرور اتاوا کانادا بیاد و بخشی اش از سرور کیوتو ژاپن، صد کاربر آنلاین هم در حال ویرایش اش باشند. این اصلا شباهتی به شرایط Dictionary نداره که همه داده ها یکجا در RAM در دسترس شما است. پیاده سازی سیستم مدیریت سرور به مراتب پیچیده تر از اون زبان SQL ای است که برای دسترسی به داده ها طراحی شده. به همین راحتی هم نمیشه ساختار زبانی رو تغییر داد که چهل ساله استفاده میشه.
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
سلامی مجدد
استاد علی ، الان وقتی برنامه ی بکاپ ام هر بار که اجرا میشه (این اجراهای مختلف میتونه بعد از هر بار ریست کردن کامپیوتر و در زمان های مختلف در بازه ی زمانی زیاد انجام بشه) ، بهتره که هر بار لیست بکاپ ها را از طریق جستجو در کدهای vss بدست بیارم یا اینکه فقط یکبار از این طریق برم و در دفعات بعد که توی دیتابیس ذخیره کردم ، از دیتابیس لیست بکاپ ها را لود کنم؟
کلا روش اصولی کدوم هه؟
 

the_king

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

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
سلامی مجدد
خیلی ممنون استاد علی
میگم برای جدول در sqlite (برای این برنامه ی بکاپ) ، بهتره index بذارم؟ دقیق هم هنوز نمیدونم چیه.
یا trigger (که میخوام مطالعه اش کنم و هنوز اصلا نمیدونم چیه) ، لازم میشه؟
 

the_king

مدیرکل انجمن
سلامی مجدد
خیلی ممنون استاد علی
میگم برای جدول در sqlite (برای این برنامه ی بکاپ) ، بهتره index بذارم؟ دقیق هم هنوز نمیدونم چیه.
یا trigger (که میخوام مطالعه اش کنم و هنوز اصلا نمیدونم چیه) ، لازم میشه؟
من نمیدونم شما در جداول تون چی نگهداری می کنید. index در واقع کلید (key) ئه، بله اصولا جداول پایگاه داده باید کلید داشته باشند تا ارتباط بین جداول رو بر اساس اونها تعریف کنید، مختص sqlite هم نیست.
trigger مربوط به بحث اجرا است، مثل اینکه تصمیم بگیرید در باک ماشین بنزین سوپر بریزید یا بنزین معمولی. اگر ماشین تون رو هنوز طراحی نکردید روی چه معیاری تصمیم بگیرید بنزین سوپر میخواد یا نه؟
شما وقتی هنوز ساختار داده ای تون بصورت جداول مشخص نباشه عملیات هایی که باید روی اون جداول انجام بدید هم نامعلومه. وقتی عملیات ها نامعلوم باشه روی چه چیزی تصمیم بگیرید که trigger میخواد یا نمیخواد.
شما اول باید ساختار داده ای تون رو روی کاغذ تعریف کنید تا نیاز هاتون معلوم بشه و بعد اگه نیازی به عملیاتی پیدا کنید که اجراش چالش شده به دنبال راه حل برایش باشید که اونوقت ببینید trigger برایش مفید ئه یا نه.
وگرنه وقتی ساختار داده ای تون کامل نیست رو هوا نمیتوانید تصمیم بگیرید.
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
خیلی ممنون استاد علی
این schema name در دیتابیس که اینجا نوشته چیه ؟:

https://www.sqlite.org/lang_createtable.html

برای دسته بندی تیبل ها نیست؟
من یه اسمی را میدم ، ارور میده. مثلا این Folder1 را میدم :

کد:
string commandText = "CREATE TABLE Folder1.tblPerson (ID INTEGER PRIMARY KEY , Name TEXT NOT NULL, LastName TEXT)";

--------------------------------------------------------------

یه مسئله ی مهم اینه که پروژه ی من باید روی any cpu باشه . چون alphavss باید طبق تشخیص ویندوز ، در ویندوزهای 32 بیتی ، از یه dll و در ویندوزهای 64 بیتی از یه dll دیگه استفاده کنه که به طبع اون ویندوز و alphavss ، پروژه ی منم باید 32 یا 64 بیتی بشه وگرنه alphavss ارور میده. که این تشخیص و استفاده از dll خاص ، اتوماتیک (با فراخونی متد VssUtils.LoadImplementation) انجام میده.

حالا مشکل اینه که sqlite هم به 32 بیت یا 64 بیت بودن پروژه بستگی داره منتها مشکلش اینه که اتوماتیک این کار را انجام نمیده . از طرفی هم من نمیتونم هر دوی dll های sqlite مربوط به پروژه های 32 و 64 بیتی را با هم توی پروژه لود کنم . البته یکی را rename کردم و به این شیوه ، هر دو dll را وارد reference کردم اما روی اونی که rename نکردم (dll برای پروژه ی 32 بیتی را rename نکردم) ، توی قسمت reference ، هم علامت زرد رنگ میزنه و ارور میده که در دسترس نیست و دوما پروژه را که 32 بیت میکنم ، موقع کدهای دیتابیس ارور میده .
ارور زیر را میده :


کد:
System.IO.FileNotFoundException: 'Could not load file or assembly 'System.Data.SQLite, Version=1.0.110.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139' or one of its dependencies. The system cannot find the file specified.'

پروپرتی Copy Local مربوط به این dll هم true هست.


حالا کلا با چه روشی میشه در هر دو ویندوز ، از دیتابیس sqlite استفاده کرد و کلا این مشکل را برطرف کرد؟
و اینکه آیا sql express هم همین محدودیت را داره؟ یعنی یا باید توی ویندوز 32 بیتی کار کنه یا باید توی ویندوز 64 بیتی؟ و اینکه اصلا sql express هم مثل sql server نیاز داره تا موتورش توی سیستم کاربر نصب بشه؟ اگه آره ، حجمش چقدر میشه؟
ممنون
 
آخرین ویرایش:

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
خیلی ممنون استاد علی

--------------------------------------------------------------

یه مسئله ی مهم اینه که پروژه ی من باید روی any cpu باشه . چون alphavss باید طبق تشخیص ویندوز ، در ویندوزهای 32 بیتی ، از یه dll و در ویندوزهای 64 بیتی از یه dll دیگه استفاده کنه که به طبع اون ویندوز و alphavss ، پروژه ی منم باید 32 یا 64 بیتی بشه وگرنه alphavss ارور میده. که این تشخیص و استفاده از dll خاص ، اتوماتیک (با فراخونی متد VssUtils.LoadImplementation) انجام میده.

حالا مشکل اینه که sqlite هم به 32 بیت یا 64 بیت بودن پروژه بستگی داره منتها مشکلش اینه که اتوماتیک این کار را انجام نمیده . از طرفی هم من نمیتونم هر دوی dll های sqlite مربوط به پروژه های 32 و 64 بیتی را با هم توی پروژه لود کنم . البته یکی را rename کردم و به این شیوه ، هر دو dll را وارد reference کردم اما روی اونی که rename نکردم (dll برای پروژه ی 32 بیتی را rename نکردم) ، توی قسمت reference ، هم علامت زرد رنگ میزنه و ارور میده که در دسترس نیست و دوما پروژه را که 32 بیت میکنم ، موقع کدهای دیتابیس ارور میده .
ارور زیر را میده :


کد:
System.IO.FileNotFoundException: 'Could not load file or assembly 'System.Data.SQLite, Version=1.0.110.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139' or one of its dependencies. The system cannot find the file specified.'

پروپرتی Copy Local مربوط به این dll هم true هست.


حالا کلا با چه روشی میشه در هر دو ویندوز ، از دیتابیس sqlite استفاده کرد و کلا این مشکل را برطرف کرد؟
و اینکه آیا sql express هم همین محدودیت را داره؟ یعنی یا باید توی ویندوز 32 بیتی کار کنه یا باید توی ویندوز 64 بیتی؟ و اینکه اصلا sql express هم مثل sql server نیاز داره تا موتورش توی سیستم کاربر نصب بشه؟ اگه آره ، حجمش چقدر میشه؟
ممنون

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

System.Data.SQLite: Downloads Page

که باید در هر کدوم از سیستم 32 و 64 بیت ، از dll و رپر خاص خودش استفاده میکردم اما با دستور nuget زیر ، این مشکل حل شد و خودش اتوماتیک این کار را انجام میده و شاید هم اصلا وابستگی به نوع 32 بیت یا 64 بیت بودن سیستم عامل نداره (بالاخره در هر دو پروژه ی 32 یا 64 بیت ، کار میکنه) :

کد:
Install-Package System.Data.SQLite -Version 1.0.110

خیلی ممنون
 

the_king

مدیرکل انجمن
خیلی ممنون استاد علی
این schema name در دیتابیس که اینجا نوشته چیه ؟:

https://www.sqlite.org/lang_createtable.html
اسمی که برای اون Schema در نظر گرفته اید، معمولا اسم خود پایگاه داده. وقتی پایگاه داده ای رو به sqlite متصل میکنید با نامی attach میشه که همون نام Schema است.
مثلا در ATTACH DATABASE file_name AS database_name اون database_name ئه.

برای دسته بندی تیبل ها نیست؟
نه فقط Table ها، سایر اجزاء پایگاه داده مثل View ها و Function ها و Snapshot ها و Role ها و User ها و ...
من یه اسمی را میدم ، ارور میده. مثلا این Folder1 را میدم :
کد:
string commandText = "CREATE TABLE Folder1.tblPerson (ID INTEGER PRIMARY KEY , Name TEXT NOT NULL, LastName TEXT)";

شما اینجا دارید tblPerson رو ایجاد می کنید، نه Folder1 رو. اگه Folder1 وجود نداشته باشه خوب باید ارور بده.

یه مسئله ی مهم اینه که پروژه ی من باید روی any cpu باشه . چون alphavss باید طبق تشخیص ویندوز ، در ویندوزهای 32 بیتی ، از یه dll و در ویندوزهای 64 بیتی از یه dll دیگه استفاده کنه که به طبع اون ویندوز و alphavss ، پروژه ی منم باید 32 یا 64 بیتی بشه وگرنه alphavss ارور میده. که این تشخیص و استفاده از dll خاص ، اتوماتیک (با فراخونی متد VssUtils.LoadImplementation) انجام میده.
نه. از این به بعد شما دو تا نسخه اجرایی Build میکنید که یکی اش برای سیستم های x64 باشه و اون یکی برای x86. البته نه الان، وقتی برنامه تون کامل شد، الان که در حال کد نویسی هستید نیازی نیست هر دوشون رو Build کنید.

حالا مشکل اینه که sqlite هم به 32 بیت یا 64 بیت بودن پروژه بستگی داره منتها مشکلش اینه که اتوماتیک این کار را انجام نمیده . از طرفی هم من نمیتونم هر دوی dll های sqlite مربوط به پروژه های 32 و 64 بیتی را با هم توی پروژه لود کنم . البته یکی را rename کردم و به این شیوه ، هر دو dll را وارد reference کردم اما روی اونی که rename نکردم (dll برای پروژه ی 32 بیتی را rename نکردم) ، توی قسمت reference ، هم علامت زرد رنگ میزنه و ارور میده که در دسترس نیست و دوما پروژه را که 32 بیت میکنم ، موقع کدهای دیتابیس ارور میده .
ارور زیر را میده :
کد:
System.IO.FileNotFoundException: 'Could not load file or assembly 'System.Data.SQLite, Version=1.0.110.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139' or one of its dependencies. The system cannot find the file specified.'

پروپرتی Copy Local مربوط به این dll هم true هست.

حالا کلا با چه روشی میشه در هر دو ویندوز ، از دیتابیس sqlite استفاده کرد و کلا این مشکل را برطرف کرد؟
الان نه. ولی نهایتا شما یکبار پروژه تون رو برای x86 ها Build می کنید و یکبار برای x64 ها و در هر کدوم هم جداگانه Reference مشخص می کنید و نهایتا دو تا exe دارید که یکی مخصوص ویندوز 64 بیتی است و دیگری برای ویندوز 32 بیتی. الان به این قضیه اهمیت ندید. نهایتا وقتی پروژه تون تموم شد به سادگی پروژه تون رو طوری تنظیم می کنید که Reference دادن به اون dll ها بر اساس اون Build انتخاب شده باشه. اینطوری خطایی هم موقع Build دریافت نمی کنید. داخل فایل های csproj پروژه تون رو که ببینید <ItemGroup> هایی هست که می توانند یک Condition هم داشته باشند که فرضا فقط وقتی این ItemGroup اعمال بشه که پلتفرم x86 باشه :
کد:
<ItemGroup Condition=" '$(Platform)' == 'x86' ">
شما هر موردی که زیر مجموعه این ItemGroup قرار بدید باید اون Condition برایش برقرار باشه وگرنه نادیده گرفته میشه.
و اینکه آیا sql express هم همین محدودیت را داره؟ یعنی یا باید توی ویندوز 32 بیتی کار کنه یا باید توی ویندوز 64 بیتی؟ و اینکه اصلا sql express هم مثل sql server نیاز داره تا موتورش توی سیستم کاربر نصب بشه؟ اگه آره ، حجمش چقدر میشه؟
ممنون
گفتم قبلا، SQL Server Express سرور داره، گرچه حجمش کمتره ولی به هر حال سرور داره و باید هم نصب بشه. setup نصب اش هم سه نسخه مختلف داره که دو تاش مخصوص x64 و x86 ئه و سومی x86 ئه ولی مشترکه. اون مشترک ئه روی هر دو مدل ویندوز ها جواب میده. برای حجمش هم میتوانید نسخه های مختلف رو مقایسه کنید، مثلا :
https://www.microsoft.com/en-us/download/details.aspx?id=57473
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
سلام
استاد ، ورودی nvarchar رو که یک عدد رو براش مشخص میکنیم ، این عدد ، اندازه ی بایت برای اون فیلد هست؟ درسته؟
یعنی این ورودی عدد ، تعداد کاراکترها که نیست؟
یعنی مثلا نوع فیلد را nvarchar(4) بنویسیم ، از اونجایی که هر کاراکتر از نوع nvarchar ، دو بایت را اشغال میکنن (چون یونیکد هستن) ، پس فقط دو کاراکتر در این فیلدش میتونیم قرار بدیم . درسته؟

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

the_king

مدیرکل انجمن
سلام
استاد ، ورودی nvarchar رو که یک عدد رو براش مشخص میکنیم ، این عدد ، اندازه ی بایت برای اون فیلد هست؟ درسته؟
یعنی این ورودی عدد ، تعداد کاراکترها که نیست؟
یعنی مثلا نوع فیلد را nvarchar(4) بنویسیم ، از اونجایی که هر کاراکتر از نوع nvarchar ، دو بایت را اشغال میکنن (چون یونیکد هستن) ، پس فقط دو کاراکتر در این فیلدش میتونیم قرار بدیم . درسته؟
نه. n ای که برایش مشخص می کنید نه تعداد بایت ئه و نه دقیقا تعداد کاراکتر. مضربی از بایت ئه چون با فرض اینکه در مورد Unicode-16 صحبت می کنیم داره تعداد دو بایتی ها رو مشخص میکنه، جفت بایت، نه یک بایت. اما از طرف دیگه هیچ تضمینی نیست که n کاراکتر داخلش جا بشه چون بعضی کاراکتر های Unicode به کد مکمل احتیاج دارند و برای همین الزاما هر جفت بایت برای یک کاراکتر Unicode-16 کافی نیست.
برای قرار دادن تصویر ، پیشنهادتون اینه که اول ، تصویر را داخل پوشه ای در مسیر فایل اجرایی نرم افزارمون کپی کنیم و بعد آدرس تصویر را داخل دیتابیس مون قرار بدیم یا اینکه تصویر را مستقیما داخل دیتابیس مون بریزیم؟ کدومش اصولی تر هه؟
اصولی وجود نداره که بخاطرش یک روش رو کلا مردود بدونیم. هر روشی رو که پیاده کنید برای یکسری شرایط کاملا مناسبه و مزیت داره و برای سایر شرایط نه.
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
نه. n ای که برایش مشخص می کنید نه تعداد بایت ئه و نه دقیقا تعداد کاراکتر. مضربی از بایت ئه چون با فرض اینکه در مورد Unicode-16 صحبت می کنیم داره تعداد دو بایتی ها رو مشخص میکنه، جفت بایت، نه یک بایت. اما از طرف دیگه هیچ تضمینی نیست که n کاراکتر داخلش جا بشه چون بعضی کاراکتر های Unicode به کد مکمل احتیاج دارند و برای همین الزاما هر جفت بایت برای یک کاراکتر Unicode-16 کافی نیست.

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

خیلی ممنون استاد
ولی من دقیق متوجه ی منظورتون نشدم .
منظورتون اینه که اگه کاراکتر وارد شده ، unicode باشه ، اون عدد وارد شده ، تعداد کاراکتر هست؟
الان کلا وقتی مینویسیم nvarchar(4) ، دقیقا به چه معناست؟ یعنی 4 تا کاراکتر میتونیم برای این فیلد ارسال کنیم؟ اگه نه ، پس دقیقا چیه؟
 

the_king

مدیرکل انجمن
خیلی ممنون استاد
ولی من دقیق متوجه ی منظورتون نشدم .
منظورتون اینه که اگه کاراکتر وارد شده ، unicode باشه ، اون عدد وارد شده ، تعداد کاراکتر هست؟
الان کلا وقتی مینویسیم nvarchar(4) ، دقیقا به چه معناست؟ یعنی 4 تا کاراکتر میتونیم برای این فیلد ارسال کنیم؟ اگه نه ، پس دقیقا چیه؟
نه، من اصلا در مورد هیچ حالتی که unicode نباشه حرفی نزدم، تمامی صحبت ما در مورد unicode-16 ئه. ما فرض می کنیم که nvarchar کاراکتر های unicode-16 رو ذخیره میکنه.
اینکه سیستم کاراکتر انتخاب شده در یک مدیر پایگاه داده ها چی باشه و تنظیماتش چی باشه جای بحث داره ولی فرض رو بر این می گیریم که در مورد unicode-16 صحبت می کنید.
n همونطور که گفتم ربطی به تعداد کاراکتر نداره، جفت بایت رو مشخص می کنه، دقیقا جفت بایت، جفت که معنی اش مشخصه، بایت هم که مشخصه. پس جفت بایت معنی واضحی داره.
فرضا اگر مقدار n ئه 4 باشه، 4 * 2 بایت در نظر گرفته میشه. جفت بایت یک واحد دقیق ئه، تخمینی که نیست.
شما جفت بایت رو نه می توانید معادل بایت در نظر بگیرید و نه معادل کاراکتر unicode-16. جفت بایت یعنی دو بایت، بجز این نیست.
کاراکتر های Unicode-16 بزرگ و کوچیک دارند، همه شون در طول حداقلی مثل سایر کاراکتر ها جا نمیشن، بعضی هاشون طول بیشتری دارن.
فرض رو بر این میگیرید که در 2 * 4 بایت 4 کاراکتر unicode-16 جا میشه؟ شاید، ممکنه، بصورت معمول و در رشته های مرسوم بله، ولی نه الزاما. ممکنه 4 کاراکتر خاص از جدول unicode انتخاب شده باشه که بیشتر از 4 * 2 بایت بخواد و جا نشه.
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
سلامی مجدد
خیلی ممنون استاد
میگم به نظرتون ، برای این پروژه ی "پشتیبانگیر طلوع" ، برای قضیه ی دیتابیس ، بجای ADO.Net ، از Entity Framework برای ارتباط با SQLite استفاده کنم؟
اگه این پیشنهاد را میدین ، پس نوع Entity Framework Database First به دردم میخوره دیگه؟ یعنی لازم به استفاده از Entity Framework Code First و اینها نیست . درسته؟
بعد اینکه هر چند توی قضایای دیتابیس و Entity Framework و اینها ضعیفم ولی ابتداییات اش را بلدم . هر چند تمرین زیاد نکردم ولی فکر نکنم برای ساخت پروژه (وقتی که از این مباحث استفاده ی عملی کنم) ، به مشکل زیادی بخورم .
بعد هم اینکه دستورات (4 دستور اصلی) SQL (که همون دستورات SQLite هستن) را بلدم اما Linq To SQL یا Linq To SQLite را بلد نیستم .
همونطور که در سایت زیر ، دستورات SQLite را بصورت رسم شکل و واضح نشون داد :

https://www.sqlite.org/lang.html

سایتی هست که دستورات Linq To SQLite را به همین شفافی (یا کلا) توضیح بده؟
اصلا میشه در Entity Framework ، بجای Linq To SQLite ، از دستورات ADO.Net استفاده کرد؟

بعد هم اینکه برای استفاده از دیتابیس SQLite (برای طراحی و ایجاد فیلدها موقع دیزاین) ، چه نرم افزاری رو پیشنهاد میدین؟ چون فکر کنم بخش Server Explorer در ویژال استودیو یا نرم افزار SQL Server Management نمیتونه با SQLite کار کنه . درسته؟
من برای کار با SQLite ، نرم افزارهای SQLite Expert و Navicat.for.SQLite.Enterprise و Valentina.Studio.Pro و Navicat.Data.Modeler را دارم . کلا کدوم نرم افزار را پیشنهاد میدین؟
 
آخرین ویرایش:

the_king

مدیرکل انجمن
سلامی مجدد
خیلی ممنون استاد
میگم به نظرتون ، برای این پروژه ی "پشتیبانگیر طلوع" ، برای قضیه ی دیتابیس ، بجای ADO.Net ، از Entity Framework برای ارتباط با SQLite استفاده کنم؟
"بجای" که درست نیست، چون نمیتونه بجای اون باشه. ولی اگه سوال تون این باشه که برای پروژه x که اصلا فرقی نمی کنه اسمش چی باشه از Entity Framework استفاده کنم یا نه، باید دلیلی برای این پیشنهاد داشته باشم.
نه. دلیلی به ذهنم نمیرسه که بخواهم همچین پیشنهادی بکنم. در ضمن Linq در اغلب موارد کد نویسی رو راحت تر میکنه و کد خوانا و مختصری میسازه، ولی سرعت اجرای بهتری نداره، برعکس گاهی سرعت اجرای کند محسوسی داره. Linq هدفش تولید کد sql بهینه نیست و خیلی کد های sql بهینه ای ترجمه نمی کنه. تمرکزش روی مختصر بودن و خوانا بودن کد برنامه شما است. این نکته رو در نظر بگیرید.
و نهایتا هم کد Linq تون به دستورات sql ای ترجمه میشه که خودتون هم می توانستید بنویسید و شاید کد بهتری هم مینوشتید.
به همین جهت الزامی وجود نداره که برای ارتباط با داده حتما از Linq استفاده ای کنید، من خودم ازش استفاده نمی کنم که سلیقه شخصی منه.

سایتی هست که دستورات Linq To SQLite را به همین شفافی (یا کلا) توضیح بده؟
نمیدونم. از گوگل بپرسید.

اصلا میشه در Entity Framework ، بجای Linq To SQLite ، از دستورات ADO.Net استفاده کرد؟
Entity Framework خودش با ADO.NET Data Provider کار می کنه، رقیب ADO.NET نیست، معماری و دید خاصی برای کار با داده داره. برای کار با داده معماری ها و Framework های مختلفی طراحی میشه که دید متفاوتی برای داده و نحوه کار با داده دارند، ولی نهایتا وقتی به بخش ارتباط با پایگاه داده میرسن سیستم ارتباطی شون دیگه خاص خودشون نیست. یک مواردی مثل سرعت اجرای query یا طراحی query های خیلی بهینه رو فدا می کنند تا در مقابل برای کار با داده دید خاصی داشته باشند، فرضا ساده تر یا جذابتر یا منطبق بر یک معماری خاص. اگر بخواهید اون مدل و معماری رو دور بزنید و از دستورات داخلی ADO.NET کمک بگیرید، معنی اش اینه که تمایلی به رعایت اون مدل و معماری کار با داده ندارید و بیخودی انتخابش کردید.

بعد هم اینکه برای استفاده از دیتابیس SQLite (برای طراحی و ایجاد فیلدها موقع دیزاین) ، چه نرم افزاری رو پیشنهاد میدین؟ چون فکر کنم بخش Server Explorer در ویژال استودیو یا نرم افزار SQL Server Management نمیتونه با SQLite کار کنه . درسته؟
من برای کار با SQLite ، نرم افزارهای SQLite Expert و Navicat.for.SQLite.Enterprise و Valentina.Studio.Pro و Navicat.Data.Modeler را دارم . کلا کدوم نرم افزار را پیشنهاد میدین؟
من دنبال امتحان کردن ابزار های مختلف نبودم که همه شون رو بشناسم و مقایسه کرده باشم. از این یکی استفاده کردم که شاید بهترین گزینه هم نباشه :
SQLite and SQL Server Compact Toolbox
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
"بجای" که درست نیست، چون نمیتونه بجای اون باشه. ولی اگه سوال تون این باشه که برای پروژه x که اصلا فرقی نمی کنه اسمش چی باشه از Entity Framework استفاده کنم یا نه، باید دلیلی برای این پیشنهاد داشته باشم.
نه. دلیلی به ذهنم نمیرسه که بخواهم همچین پیشنهادی بکنم. در ضمن Linq در اغلب موارد کد نویسی رو راحت تر میکنه و کد خوانا و مختصری میسازه، ولی سرعت اجرای بهتری نداره، برعکس گاهی سرعت اجرای کند محسوسی داره. Linq هدفش تولید کد sql بهینه نیست و خیلی کد های sql بهینه ای ترجمه نمی کنه. تمرکزش روی مختصر بودن و خوانا بودن کد برنامه شما است. این نکته رو در نظر بگیرید.
و نهایتا هم کد Linq تون به دستورات sql ای ترجمه میشه که خودتون هم می توانستید بنویسید و شاید کد بهتری هم مینوشتید.
به همین جهت الزامی وجود نداره که برای ارتباط با داده حتما از Linq استفاده ای کنید، من خودم ازش استفاده نمی کنم که سلیقه شخصی منه.

سلام
خیلی ممنون استاد
:shock:
من فکر میکردم قطعا کار با Entity Framework را پیشنهاد میکنین .
اما چرا؟
همونطور که میدونین ، کار با Entity Framework باعث میشه بصورت شی گرا با جداول برخورد کنیم و خوانایی و استفاده از دیتابیس به این روش ، بسیار بسیار آسون تر میشه .
من آموزش Entity Framework هم گرفتم . اونجا مزایای دیگه هم میگفت که من نمیدونم دقیقا بعضی هاشون چی هستن . مثل قابلیت catching بهینه (اینو یه کم فهمیدم انگار) ، built in convention ، پیکربندی data annonation و fluent api و migration و ... که من نمیدونم چی هستن .
اصلا این مزایاشون را بذاریم کنار ، همین قدر که جداول دیتابیس را بصورت شی گرا در اختیارمون قرار میده و لازم نیست دیگه بصورت مستقیم از اون حجم عظیم از کلاس های ADO.NET مثل SqlConnection و SqlCommand و SqlAdapter و SqlDataReader و DataTable و DataSet و بسیاری از این نوع کلاس ها کار کنیم ، خودش خوب نیست؟
از طرفی ، همونطور که گفتین ، کار با Entity Framework ساده هست . همین ها دلیل بر استفاده از Entity Framework نمیشه؟ (سادگی استفاده و خلاصه شدن کدها و ...)

نمیدونم. از گوگل بپرسید.


Entity Framework خودش با ADO.NET Data Provider کار می کنه، رقیب ADO.NET نیست، معماری و دید خاصی برای کار با داده داره. برای کار با داده معماری ها و Framework های مختلفی طراحی میشه که دید متفاوتی برای داده و نحوه کار با داده دارند، ولی نهایتا وقتی به بخش ارتباط با پایگاه داده میرسن سیستم ارتباطی شون دیگه خاص خودشون نیست. یک مواردی مثل سرعت اجرای query یا طراحی query های خیلی بهینه رو فدا می کنند تا در مقابل برای کار با داده دید خاصی داشته باشند، فرضا ساده تر یا جذابتر یا منطبق بر یک معماری خاص. اگر بخواهید اون مدل و معماری رو دور بزنید و از دستورات داخلی ADO.NET کمک بگیرید، معنی اش اینه که تمایلی به رعایت اون مدل و معماری کار با داده ندارید و بیخودی انتخابش کردید.


من دنبال امتحان کردن ابزار های مختلف نبودم که همه شون رو بشناسم و مقایسه کرده باشم. از این یکی استفاده کردم که شاید بهترین گزینه هم نباشه :
SQLite and SQL Server Compact Toolbox

توی گوگل جستجو کردم ولی بصورت رسمی (مثل اون سایت) چیزی ندیدم . بیشتر در حد سئوال و پرسش و چند مقاله ی ساده بود .
پس نمیشه توی Entity Framework (مثلا در تابع Where اش) بجای دستورات Linq از دستورات مستقیم Sql کار کرد .
بابت معرفی اون نرم افزار هم خیلی ممنون استاد
 
آخرین ویرایش:

the_king

مدیرکل انجمن
سلام
خیلی ممنون استاد
:shock:
من فکر میکردم قطعا کار با Entity Framework را پیشنهاد میکنین .
اما چرا؟
همونطور که میدونین ، کار با Entity Framework باعث میشه بصورت شی گرا با جداول برخورد کنیم و خوانایی و استفاده از دیتابیس به این روش ، بسیار بسیار آسون تر میشه .
شما هر کاری که بکنید با داده ها بصورت شی گرا برخورد می کنید، در #C حالتی غیر از شی گرایی نداریم. بسیار بسیار آسون که نه، آسونتر میشه و خوانایی کدی که مینویسید افزایش پیدا می کنه، اما اینها یک مزیت برای شما است، معایبش سمت اجرا و برای کاربر ئه. مزیت برای مصرف کننده پروژه شما که نیست. شما از من می پرسید منطقی است که من سرعت اجرای بهتر کوئری رو فدای این کنم که کد نویسی ام اندکی ساده تر بشه؟ به نظر من نه، نظر من رو می پرسید دیگه. نه من میخوام شما رو متقاعد کنم و نه شما لازمه نظر من رو عوض کنین. شما دارید برای کاربر نرم افزاری میسازید. شما در تبلیغ نرم افزار نمی نویسید قدری کندتر کردمش اما عوضش با کدی خواناتر نوشتمش، کاربر اصلا کد رو نمی بینه، کاری نداره که شما کدتون چقدر مختصر شده.

من آموزش Entity Framework هم گرفتم . اونجا مزایای دیگه هم میگفت که من نمیدونم دقیقا بعضی هاشون چی هستن . مثل قابلیت catching بهینه (اینو یه کم فهمیدم انگار) ، built in convention ، پیکربندی data annonation و fluent api و migration و ... که من نمیدونم چی هستن .
اصلا این مزایاشون را بذاریم کنار ، همین قدر که جداول دیتابیس را بصورت شی گرا در اختیارمون قرار میده و لازم نیست دیگه بصورت مستقیم از اون حجم عظیم از کلاس های ADO.NET مثل SqlConnection و SqlCommand و SqlAdapter و SqlDataReader و DataTable و DataSet و بسیاری از این نوع کلاس ها کار کنیم ، خودش خوب نیست؟
تا وقتی ماهیت چیزی رو نفهمید و طرز استفاده از چیزی رو یاد نگرفتید نمی توانید با مورد دیگری مقایسه اش کنید یا در موردش نظر بدید. شما حتی مثال های Entity Framework رو ندیدید که ارتباط اش با جداول پایگاه داده رو متوجه بشید. از روی کدوم مثال ها دارید قضاوت می کنید؟ با دانش تخیلی مقایسه می کنید؟ یک طرف Entity Framework رو قرار دادید و طرف دیگه ADO.NET و دارید با هم مقایسه شون می کنید در حالی که Entity Framework بر روی ADO.NET سوار شده. شما وقتی یک پایگاه داده به پروژه معرفی می کنید DataSet بر اساس جداول پایگاه داده تون ایجاد میشه. با اون DataSet چطور با پایگاه داده در ارتباط هستید و ساختار جداول تون ایجاد میشه؟ به سادگی براتون کد خودکار نوشته میشه که در اون DataSet پروژه کدش قابل مشاهده است، بر اساس DataTable و SqlAdapter و ...
همین وضعیت در مورد Entity Framework هم هست. داده هایی که از پایگاه داده میان همینطوری از آسمون پرواز نمی کنند بیان بشینن در اشیاء داخل Entity Framework. اونم همینطور با کد های خودکار براتون بر اساس DataTable و SqlAdapter و ... یکسری Context هایی میسازه. هیچ اتفاق خاصی رخ نمیده که به معنی کار نکردن با کلاس های ADO.NET باشه یا مزیتی در دسترسی به پایگاه داده نسبت به DataSet ایجاد کنه.
کار با داده هم الزاما ربطی به پایگاه داده نداره. Entity Framework روی کار با داده متمرکز شده، نه ساختار فنی پایگاه داده خاصی. هر زمان باهاش تمرین کردید و دیدید چطور با پایگاه داده کار می کنه می توانیم در موردش بحث کنیم.

پس نمیشه توی Entity Framework (مثلا در تابع Where اش) بجای دستورات Linq از دستورات مستقیم Sql کار کرد .
این حکم شما مربوط به کدوم سوال قبلی شما است؟ شما سوالی در مورد Linq بجای Sql داشتید که حالا نتیجه گیری کنید؟ Entity Framework برای مواردی که با حالت کلی Linq قابل اجرا نیست SqlQuery و ExecuteSqlCommand داره.
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
شما هر کاری که بکنید با داده ها بصورت شی گرا برخورد می کنید، در #C حالتی غیر از شی گرایی نداریم. بسیار بسیار آسون که نه، آسونتر میشه و خوانایی کدی که مینویسید افزایش پیدا می کنه، اما اینها یک مزیت برای شما است، معایبش سمت اجرا و برای کاربر ئه. مزیت برای مصرف کننده پروژه شما که نیست. شما از من می پرسید منطقی است که من سرعت اجرای بهتر کوئری رو فدای این کنم که کد نویسی ام اندکی ساده تر بشه؟ به نظر من نه، نظر من رو می پرسید دیگه. نه من میخوام شما رو متقاعد کنم و نه شما لازمه نظر من رو عوض کنین. شما دارید برای کاربر نرم افزاری میسازید. شما در تبلیغ نرم افزار نمی نویسید قدری کندتر کردمش اما عوضش با کدی خواناتر نوشتمش، کاربر اصلا کد رو نمی بینه، کاری نداره که شما کدتون چقدر مختصر شده.

خیلی ممنون استاد .
در سی شارپ میدونم حالتی بجز شی گرا نداریم .
منظورم استفاده از دستورات sql هست . الان در ADO.NET ، ما باید از دستورات sql برای ذخیره سازی استفاده کنیم . این وسط هم کلی از کلاس های مربوط به ADO.NET (که میدونید و گفته بودم) هم باید شی بسازیم . اما توی Entity Framework ، از کلاس Context مون شی میسازیم و عضو جدول مون را صدا میزنیم . متد Add را صدا میزنیم (مثلا اگه نام جدول مون در دیتابیس ، Student بوده باشه میشه Context.Student.Add) و شی کلاس Student را بهش میدم و متد SaveChange را سر آخر صدا میزنیم . اما همین کار وقتی فقط با ADO.NET بخوایم کار کنیم ، علاوه بر استفاده از دستورات sql ، از کلاس های مربوط به ADO.NET هم باید شی بسازیم .
یه چیزایی بلدم استاد .

تا وقتی ماهیت چیزی رو نفهمید و طرز استفاده از چیزی رو یاد نگرفتید نمی توانید با مورد دیگری مقایسه اش کنید یا در موردش نظر بدید. شما حتی مثال های Entity Framework رو ندیدید که ارتباط اش با جداول پایگاه داده رو متوجه بشید. از روی کدوم مثال ها دارید قضاوت می کنید؟ با دانش تخیلی مقایسه می کنید؟ یک طرف Entity Framework رو قرار دادید و طرف دیگه ADO.NET و دارید با هم مقایسه شون می کنید در حالی که Entity Framework بر روی ADO.NET سوار شده. شما وقتی یک پایگاه داده به پروژه معرفی می کنید DataSet بر اساس جداول پایگاه داده تون ایجاد میشه. با اون DataSet چطور با پایگاه داده در ارتباط هستید و ساختار جداول تون ایجاد میشه؟ به سادگی براتون کد خودکار نوشته میشه که در اون DataSet پروژه کدش قابل مشاهده است، بر اساس DataTable و SqlAdapter و ...
همین وضعیت در مورد Entity Framework هم هست. داده هایی که از پایگاه داده میان همینطوری از آسمون پرواز نمی کنند بیان بشینن در اشیاء داخل Entity Framework. اونم همینطور با کد های خودکار براتون بر اساس DataTable و SqlAdapter و ... یکسری Context هایی میسازه. هیچ اتفاق خاصی رخ نمیده که به معنی کار نکردن با کلاس های ADO.NET باشه یا مزیتی در دسترسی به پایگاه داده نسبت به DataSet ایجاد کنه.
کار با داده هم الزاما ربطی به پایگاه داده نداره. Entity Framework روی کار با داده متمرکز شده، نه ساختار فنی پایگاه داده خاصی. هر زمان باهاش تمرین کردید و دیدید چطور با پایگاه داده کار می کنه می توانیم در موردش بحث کنیم.

الان دلیل تون برای اینکه میگید من از ADO.NET استفاده کنم و از Entity Framework استفاده نکنم ، اینه که در Entity Framework ، سرعت ارتباط با دیتابیس ، کم میشه؟
البته خوب مشخص هست که باید کمتر بشه (چون به عنوان واسط بین ما و ADO.NET هست انگار دیگه . نه؟) اما مگه چقدر سرعت را کم میکنه که شما همچین پیشنهادی میدید؟ محسوس که نیست . هست؟ (چه دیتابیس حجیم باشه یا نه ، محسوس یا اینکه خیلی محسوس که نیست . هست؟)

این حکم شما مربوط به کدوم سوال قبلی شما است؟ شما سوالی در مورد Linq بجای Sql داشتید که حالا نتیجه گیری کنید؟ Entity Framework برای مواردی که با حالت کلی Linq قابل اجرا نیست SqlQuery و ExecuteSqlCommand داره.

این متد ExecuteSqlCommand ، فقط در حالتی هست که دستورات Linq قابل اجرا نباشه؟
یا اینکه کسایی مثل ما که Linq بلد نیستن و میخوان از دستورات sql استفاده کنن ، میتونن با دستورات Linq کار نکنن و توسط این متد ، دستورات sql رو برای اجرا توسط Entity Framework بفرستن؟

خیلی ممنون استاد .
 

the_king

مدیرکل انجمن
خیلی ممنون استاد .
در سی شارپ میدونم حالتی بجز شی گرا نداریم .
منظورم استفاده از دستورات sql هست . الان در ADO.NET ، ما باید از دستورات sql برای ذخیره سازی استفاده کنیم.
در خود انجمن مثال های زیادی از کار با ADO.NET هست که از جدول رکورد می خوانند و می نویسند. ببینید در همه شون دستورات SQL رو می بینید؟ در پشت پرده تمامی ارتباط ها SQL هست ولی در کدی که می نویسید ممکنه حتی یک سطر کد SQL هم بکار نره. از این لحاظ هیچ فرقی بین کاری که داخل DataSet و Context انجام میشه نیست، همه شون دستورات SQL رو از شما مخفی می کنند. این که شما در کدتون مستقیما از SQL استفاده بکنید یا نه کاملا مربوط به نظر برنامه نویس و کاری است که میخواد بکنه. "ما باید از دستورات SQL برای ذخیره سازی استفاده کنیم" حکمی است که شما صادر می کنید، یک عقیده شخصی و فارق از واقعیت ها. از اون باید ها است که شما اختراع می کنید، نه در این انجمن و نه در سایت مایکروسافت و نه در کتاب های برنامه نویسی همچین بایدی ذکر نشده.

این وسط هم کلی از کلاس های مربوط به ADO.NET (که میدونید و گفته بودم) هم باید شی بسازیم . اما توی Entity Framework ، از کلاس Context مون شی میسازیم و عضو جدول مون را صدا میزنیم . متد Add را صدا میزنیم (مثلا اگه نام جدول مون در دیتابیس ، Student بوده باشه میشه Context.Student.Add) و شی کلاس Student را بهش میدم و متد SaveChange را سر آخر صدا میزنیم . اما همین کار وقتی فقط با ADO.NET بخوایم کار کنیم ، علاوه بر استفاده از دستورات sql ، از کلاس های مربوط به ADO.NET هم باید شی بسازیم.
یک پایگاه داده کوچک در SQL Server یا هر سیستم سازگار با ADO.NET دیگری که مایل هستید بسازید که یک جدول داخلش باشه با دو تا رکورد، یک اندیس که کلید جدول ئه و یک نام که رشته متنی ئه.
صورت پروژه این باشه که بدون هیچگونه درج کد SQL در یک فرم دو تا Button و یک TextBox و یک ListBox داریم.
یک دکمه برای خواندن و نمایش نام ها در ListBox و یک دکمه برای اضافه کردن رکورد جدید به جدول که نام اش در TextBox قرار داره.
حالا شما این پروژه رو با Entity Framework بنویسید، من بدون Entity Framework می نویسم و مقایسه می کنیم.


الان دلیل تون برای اینکه میگید من از ADO.NET استفاده کنم و از Entity Framework استفاده نکنم ، اینه که در Entity Framework ، سرعت ارتباط با دیتابیس ، کم میشه؟
البته خوب مشخص هست که باید کمتر بشه (چون به عنوان واسط بین ما و ADO.NET هست انگار دیگه . نه؟) اما مگه چقدر سرعت را کم میکنه که شما همچین پیشنهادی میدید؟ محسوس که نیست . هست؟ (چه دیتابیس حجیم باشه یا نه ، محسوس یا اینکه خیلی محسوس که نیست . هست؟)
من اینطور به مساله نگاه نمی کنم، مزیت ها و معایب رو کنار هم قرار میدم، ببینم در مقابل چقدر مزایا چقدر معایب حاصل میشه. این رو وقتی می توانید درست درک کنید که به هر دو طرف اشراف داشته باشید.
از من پرسیدید Entity Framework رو پیشنهاد می کنم، گفتم که دلیلی برای پیشنهاد کردنش ندارم. وقتی همچین پیشنهادی رو می کنم که معایب بزرگی در ADO.NET ببینم یا مزایای خیلی برجسته در Entity Framework ببینم که انتخابش نکنید تاسف خواهید خورد. خوب همچین حالتی رو نمی بینم. میخواهید رویش بحث کنید، می توانید ولی وقتی که به هر دوی آنها مسلط باشید، نه الان.

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

یا اینکه کسایی مثل ما که Linq بلد نیستن و میخوان از دستورات sql استفاده کنن ، میتونن با دستورات Linq کار نکنن و توسط این متد ، دستورات sql رو برای اجرا توسط Entity Framework بفرستن؟
کسی که بلد نیست که نباید اصلا سراغش بره. برای چی از Entity Framework استفاده کنه وقتی میخواد خودش دستورات SQL بده.
Linq قرار بوده تا حدی که از قابلیت هاش برمیومده شما رو از نوشتن دستورات SQL بی نیاز کنه و خودش دستورات SQL رو بسازه. وقتی دستورات SQL رو می نویسید دیگه هم Linq درگیر نیست و هم اجرا کننده Entity Framework نیست. این چیز بدی نیست، در مواردی هم ناچار میشید، ولی وقتی مدام و برای هر کار ساده ای همچین کاری رو بکنید به این معنا است که از قابلیت ها استفاده نکردید و این Framework رو بیخودی انتخاب کردید.
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
در خود انجمن مثال های زیادی از کار با ADO.NET هست که از جدول رکورد می خوانند و می نویسند. ببینید در همه شون دستورات SQL رو می بینید؟ در پشت پرده تمامی ارتباط ها SQL هست ولی در کدی که می نویسید ممکنه حتی یک سطر کد SQL هم بکار نره. از این لحاظ هیچ فرقی بین کاری که داخل DataSet و Context انجام میشه نیست، همه شون دستورات SQL رو از شما مخفی می کنند. این که شما در کدتون مستقیما از SQL استفاده بکنید یا نه کاملا مربوط به نظر برنامه نویس و کاری است که میخواد بکنه. "ما باید از دستورات SQL برای ذخیره سازی استفاده کنیم" حکمی است که شما صادر می کنید، یک عقیده شخصی و فارق از واقعیت ها. از اون باید ها است که شما اختراع می کنید، نه در این انجمن و نه در سایت مایکروسافت و نه در کتاب های برنامه نویسی همچین بایدی ذکر نشده.


یک پایگاه داده کوچک در SQL Server یا هر سیستم سازگار با ADO.NET دیگری که مایل هستید بسازید که یک جدول داخلش باشه با دو تا رکورد، یک اندیس که کلید جدول ئه و یک نام که رشته متنی ئه.
صورت پروژه این باشه که بدون هیچگونه درج کد SQL در یک فرم دو تا Button و یک TextBox و یک ListBox داریم.
یک دکمه برای خواندن و نمایش نام ها در ListBox و یک دکمه برای اضافه کردن رکورد جدید به جدول که نام اش در TextBox قرار داره.
حالا شما این پروژه رو با Entity Framework بنویسید، من بدون Entity Framework می نویسم و مقایسه می کنیم.

خیلی ممنون استاد.
توی این کد زیر :
کد:
            string conectionString = @"Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=E:\Project\Visual Studio\C#.Net\Saved Project\0 Practice\WinForm\Practice 1\Practice 1\Database1.mdf";
            string commandText = "SELECT * FROM tblPerson";

            using (SqlDataAdapter dataAdapter = new SqlDataAdapter(commandText, conectionString))
            {
                using (DataTable dataTable = new DataTable())
                {
                    dataAdapter.Fill(dataTable);
                    this.dataGridView1.DataSource = dataTable;
                }
            }

هیچ اروری نمیده اما توی شی DataGrideView ام ، فقط فیلدهای جدول ام را نشون میده و رکوردهاش را نشون نمیده (با اونکه جدول دیتابیس ام پر هه و رکورد داره)
مشکلش از کجاست؟
بعد اینکه برای دیتابیس Sqlite میشه عملیات مربوط به دیتابیس را توسط متد Parallel.Invoke فراخونی و استفاده کرد دیگه؟ یعنی اینکه بجای اینکه در نخ جدید اجرا کنیم ، در این متد اجرا کنیم؟ (ان شاء ا... که در هسته ی جدید اجرا کنه) :)
بعد اینکه میشه کاری کرد که اطلاعات ، مستقیما از دیتابیس ، توی شی DataGrideView مون بریزه ؟ یعنی اطلاعات توی رم (شی DataTable) ریخته نشه . چون ممکنه جدول مون توی دیتابیس پر حجم باشه (مثلا 2 گیگ حجم اش باشه) اما طرف به اون مقدار ، حافظه ی اصلی نداشته باشه . (البته منظورم این نیست که فیلدها را دونه دونه یا رکورد به رکورد بخونیم مثل DataReader که حجم خیلی کمتری میگیره)
اون AttachDbFilename هم که مسیر فایل را مقدار لیترال دادم ، توجه نکنید . این پروژه ی تستی هه .

بعد اینکه ، ساده ترین کدی که میتونستم توی ADO.Net بنویسم که همه ی اطلاعات را نشون بده ، همین بودم . از این که نمیشه کد رو خلاصه تر کرد . میشه؟
اما توی Entity Framework ، رسیدنِ به همین هدف (هدف در کد بالا) ، اولا نیاز به دستورات sql نداشت و دوما خط هاش کمتر بود و سوما چون شی گرا بود ، درکش بسیار راحت تر بود .

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

بله .
واسه ی همین هاست که تا حالا کسی بهتر از شما را توی برنامه نویسی ندیدم .
جایی که بیشتر (شاید هم همه) برنامه نویس ها (و حتی شرکت ها) ، چشم شون را میبندن و از یه چیزی استفاده میکنن ، شما شرایط را میبینین و با منطق پیش میرید .
مثلا من ندیدم کسی (حتی اساتیدهای دانشگاه) توی پروژه ی دسکتاپ اش ، استفاده از Sqlite را پیشنهاد کنه اما شما با منظق درست پیشنهاد دادین .
یا همین قضیه ی Entity Framework . من ندیدم کسی استفاده ازش را پیشنهاد نکنه (هر چند من تا حالا زیاد قانع نشدم)
یا اساتیدهایی رو دیدم که در زبان سی شارپ ، چیزهایی که شما به من آموزش دادین را اصلا نمیدونن (مثال خیلی هه) و از آموزش دادن شون مشخص هه که به فلسفه ی اون موضوع نرسیدن (منظورم این نیست من پی بردم یا فلسفه شو میدونم یا کامل میدونم) ولی شما دقیق همه رو گفتین .
خیلی ممنونم ازتون استاد . :rose:

معمولا ولی همیشه نه. برنامه نویس خودش تصمیم میگیره. ممکنه اون کار در Linq معادل داشته باشه ولی نوشتنش پیچیده باشه، یا اصلا برنامه نویس با SQL راحت تر باشه.


کسی که بلد نیست که نباید اصلا سراغش بره. برای چی از Entity Framework استفاده کنه وقتی میخواد خودش دستورات SQL بده.
Linq قرار بوده تا حدی که از قابلیت هاش برمیومده شما رو از نوشتن دستورات SQL بی نیاز کنه و خودش دستورات SQL رو بسازه. وقتی دستورات SQL رو می نویسید دیگه هم Linq درگیر نیست و هم اجرا کننده Entity Framework نیست. این چیز بدی نیست، در مواردی هم ناچار میشید، ولی وقتی مدام و برای هر کار ساده ای همچین کاری رو بکنید به این معنا است که از قابلیت ها استفاده نکردید و این Framework رو بیخودی انتخاب کردید.

حالا ببینم چی میشه . شاید از طریق Entity Framework نَرَم .
 
آخرین ویرایش:

جدیدترین ارسال ها

بالا