PDA

View Full Version : سوال: طریقه دسترسی سریعتر به دیتابیس



Arashdn
یک شنبه 19 خرداد 1392, 16:31 عصر
سلام
فرض کنیم که من یه برنامه مدیریت فروشگاه دارم که از دیتابیس استفاده میکنه
فرض کنیم یه کلاس دارم به اسم فروشگاه
تو این کلاس
یه تابع داریم در آوردن قیمت یه جنس
یه تابع دیگه داریم محاسبه مالیات (که به طبع باید قیمت جنس رو بگیره و درصد رو از دیتابیس بخونه)
یه تابع دیگه داریم که باید یه متنی رو از دیتابیس بخونه و بزاره کنار مالیات

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

ممنون

صباح فتحی
یک شنبه 19 خرداد 1392, 16:45 عصر
سلام از store procedureوfunction استفاده کنید

Arashdn
یک شنبه 19 خرداد 1392, 16:49 عصر
سلام از store procedureوfunction استفاده کنید
یه کم بیشتر توضیح میدید؟

صباح فتحی
یک شنبه 19 خرداد 1392, 16:57 عصر
توی پایگاه داد باپرس وجوی ازچندتا جدولی که همزمان میخواید اطلاعات واکشی کنید یک استورپ مینویسید وتوی بررنامه ات اون استورپ رو صدا بزن.تو فروم سرچ کنید

veniz2008
یک شنبه 19 خرداد 1392, 17:07 عصر
سلام.
شما هر بار که با دیتابیس کار دارید قاعدتا باید این باز و بسته شدن رو انجام بدید! ولی ما یک مفهوم به نام اشیا connected (اتصال گرا) داریم به این معنی که تا زمانیکه کانکشن اونها برقرار باشه (یعنی close نشده باشن) میتونید بر روی اونها مانور بدید و عملیات انجام بدید. مثل SqlCommand و SqlDataReader .
در مقابل غیر اتصال گراها را داریم که نیازی به باز شدن کانکشن توسط برنامه نویس برای اونها وجود نداره. مثل DataTable و DataSet.
در برنامه نویسی چند لایه و ADO.NET، باز و بسته شدن کانکشن فقط یکبار (یا دو بار ) نوشته میشه ولی بارها این باز و بسته شدن انجام میشه. چرا که در هر فرمی و برای هر موجودیتی (بصورت ساده هر موجودیت را یک کلاس در نظر بگیرید) نیاز هست که بارها به دیتابیس وصل بشیم و عملیات های مورد نظرمون رو انجام بدیم.
موفق باشید.

Arashdn
یک شنبه 19 خرداد 1392, 17:24 عصر
توی پایگاه داد باپرس وجوی ازچندتا جدولی که همزمان میخواید اطلاعات واکشی کنید یک استورپ مینویسید وتوی بررنامه ات اون استورپ رو صدا بزن.تو فروم سرچ کنید
هر چی سرچ کردم چیزی پیدا نشد ، ممکنه یکی دو تا لینک بدید؟



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

veniz2008
یک شنبه 19 خرداد 1392, 17:38 عصر
ممکنه یه کم بیشتر توضیح بدید و اگه ممکنه یه مثال بزنید؟
این برای اشیا اتصال گرا و غیر اتصال گرا :
http://barnamenevis.org/showthread.php?122584-%DA%86%D8%B1%D8%A7-DataReader-%D9%87%D9%85%D9%8A%D8%B4%D9%87-Close-%D8%A7%D8%B3%D8%AA-%D8%9F&highlight=%DA%86%D8%B1%D8%A7+DataReader+%D9%87%D9% 85%D9%8A%D8%B4%D9%87+Close+%D8%A7%D8%B3%D8%AA
این هم برای معماری چند لایه :
http://barnamenevis.org/showthread.php?292520-%DA%A9%D9%85%DA%A9-%D8%A8%D8%B1%D8%A7%DB%8C-%D8%A2%D9%85%D9%88%D8%B2%D8%B4-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87-%D9%86%D9%88%DB%8C%D8%B3%DB%8C-3%D9%84%D8%A7%DB%8C%D9%87&highlight=%DA%86%D9%86%D8%AF+%D9%84%D8%A7%DB%8C%D9 %87
این نکته رو همینجا بگم که سبک کدنویسی میتونه کاملا متفاوت باشه. این نیست که بگیم حتما یک روش وجود داره ولی در تمام سبک ها مفاهیم یکسان هستن و شیوه ها هم تا حدود خیلی زیادی با همدیگه یکسان هستن. این دست شما رو باز میذاره که راحت تر کدنویسی رو انجام بدید.
موفق باشید.

Arashdn
یک شنبه 19 خرداد 1392, 18:09 عصر
یه مسئله
اگه من کل یه جدول خیلی بزرگ(فرض کنیم با هزاران رکورد) رو Select کنم و بیارمش تو یه dataset مشکلی پیش میاد؟
یعنی کل اطلاعات تو رم کپی میشه یا دیتاست کل دیتابیس رو زیر نظر داره و هر موقع لازم بشه از دیتابیس میخونه؟
ابزار بهتری هم داریم که اگه دیتابیس عوض شد تغییرات رو هم بدونه؟
ممنون

veniz2008
یک شنبه 19 خرداد 1392, 18:42 عصر
اگه من کل یه جدول خیلی بزرگ(فرض کنیم با هزاران رکورد) رو Select کنم و بیارمش تو یه dataset مشکلی پیش میاد؟
این کار اشتباه محض هست که همه رکوردها رو به یکباره بریزید توی یک دیتاتیبل (یا دیتاست). به چند دلیل:
1. رم زیادی رو از سیستم شما (یا مشتری) میخوره. این کار، اصلا بهینه نیست.
2. هزار رکورد در یک لحظه (برای نمایش دادن) به درد هیچ بیننده ای نمیخوره و در ضمن فرم ما هم چنین ظرفیتی رو نداره که بتونه 1000 رکورد رو نشون بده مگر اینکه با اسکرول گرید، رکوردها رو پیمایش کنیم.
3. کند شدن برنامه ( و خیلی از مواقع هنگ کردن برنامه) در اثر فشار زیادی که به اون وارد میشه.
در چنین حالتی حتما باید از paging کردن دیتاگرید برای نمایش اطلاعات استفاده کنیم یعنی در هر بخش مثلا 10 رکورد رو نمایش بدیم و با زدن دکمه 10 رکورد بعدی یا قبلی رو به کاربر نمایش بدیم. در گرید asp این خاصیت بصورت پیش فرض برای گرید در نظر گرفته شده ولی در گرید win app وجود نداره و خودمون باید اونو ایجاد کنیم. قبلا در سایت در این باره بحث و کدهای اون گذاشته شده (دنبال paging کردن دیتاگرید بگردید).

یعنی کل اطلاعات تو رم کپی میشه یا دیتاست کل دیتابیس رو زیر نظر داره و هر موقع لازم بشه از دیتابیس میخونه؟دیتاست در واقع همون دیتابیس و جداول شما در سمت سی شارپ هستن پس بسته به تعداد جداول و اطلاعات داخل اونها از رم سیستم شما استفاده میکنه. من توصیه به استفاده از دیتاست در چنین حالاتی نمیکنم. بهتر اونه که تا حد امکان از دیتاتیبل استفاده کنید که یک شی سبک تر نسبت به دیتاست هست و رم کمتری رو هم مصرف میکنه. البته بعد از اینکه کارتون باهاش تموم شد رم تخصیص داده شده رو ازش پس بگیرید. لینک زیر در این باره بحث شده:
http://barnamenevis.org/showthread.php?370492-%D8%AE%D8%A7%D9%84%DB%8C-%DA%A9%D8%B1%D8%AF%D9%86-Data-grid-view-%D8%9F&highlight=%D8%AE%D8%A7%D9%84%DB%8C+%DA%A9%D8%B1%D8 %AF%D9%86+Data+grid+view


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