PDA

View Full Version : سوال: کدام روش بهینه تر هست؟



veniz2008
جمعه 15 مهر 1390, 14:17 عصر
سلام دوستان،چند تا سوال توی ذهنم هست که گفتم از اساتید بپرسم تا از سردرگمی دربیام،این سوالات ممکنه که سوالات تعداد زیادی از دوستان باشه،ممنون میشم که توضیحات جامعی رو بفرمایید.

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

مثلا بعضی جاها از datareader، بصورت زیر استفاده میکنن:


Sqldatareader reader = cmd.executereader();


If (reader[“id”] .tostring() = = txtid.text)

و در بعضی جاها از dataset بصورت زیر استفاده میکنن:


Adapter.fill(ds, “person”);


If (ds.tables[“person”].rows.count = = 0)

کدوم روش بهینه تر و سریع تر هستش؟ و اینکه اصولا در چه جاهایی بهتره که از dataset استفاده بشه؟(چون یه جایی خوندم که dataset یک شی سنگین هستش و لزوما نباید در همه جا ازش استفاده کرد!،آیا این حرف درسته؟)

سوال 2: فرض کنید که به مقادیر چند فیلد از یک رکورد نیاز داریم(مثلا از یک رکورد با 6 فیلد به فیلد name و id نیاز داریم)،آیا استفاده از datarow به شکل زیر بهترین روش هست یا روش بهتری هم وجود داره؟


Adapter.fill(dt);


Foreach (datarow dr in dt.rows)


{


String s1 = dr.[“id”].tostring();


String s2 = dr.[“name”].tostring();

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

محسن شامحمدی
جمعه 15 مهر 1390, 18:26 عصر
سوال 1: برای تعیین وجود داشتن یا عدم وجود یک رکورد خاص در جدول از چه روشی بهتره که استفاده کنیم؟
مثلا بعضی جاها از datareader، بصورت زیر استفاده میکنن:
Sqldatareader reader = cmd.executereader();
If (reader[“id”] .tostring() = = txtid.text)
و در بعضی جاها از dataset بصورت زیر استفاده میکنن:
Adapter.fill(ds, “person”);
If (ds.tables[“person”].rows.count = = 0)
کدوم روش بهینه تر و سریع تر هستش؟ و اینکه اصولا در چه جاهایی بهتره که از dataset استفاده بشه؟(چون یه جایی خوندم که dataset یک شی سنگین هستش و لزوما نباید در همه جا ازش استفاده کرد!،آیا این حرف درسته؟)


ببین دوست عزیز
Dataset توی رم کامپیوتره ولی Datareader اطلاعات رو از توی دیتابیسی که روی هارده (و در بعضی مواقع در شبکه محلی و یا حتی اینترنت!) می خونه.
پس منطقیه که اگر با Dataset کار کنی و اطلاعات رو از دیتاست بگیری سرعت دسترسیت تا ده ها برابر و یا حتی صدها برابر بیشتر از Data reader باشه.



(چون یه جایی خوندم که dataset یک شی سنگین هستش و لزوما نباید در همه جا ازش استفاده کرد!،آیا این حرف درسته؟)
شما فرض کن می خوای اطلاعات یک کاربر خاص رو از دیتابیس بخونی.
خب نیازی نیست که حتما از Data set استفاده کنی و کل جدول کاربران رو بیاری توی رم و یکی یکی چک کنی تا برسی به کاربری که می خوای و ...
فقط کافیه یک چنین کوئری ای با شی Data reader اجرا کنی.
select * from users where username='ali'
خب مطمئنا در اینجا Datareader سریعتر عمل می کنه.




سوال 2: فرض کنید که به مقادیر چند فیلد از یک رکورد نیاز داریم(مثلا از یک رکورد با 6 فیلد به فیلد name و id نیاز داریم)،آیا استفاده از datarow به شکل زیر بهترین روش هست یا روش بهتری هم وجود داره؟

در بالا پاسخ داده شد.

موفق باشید.

hakim22
سه شنبه 24 مرداد 1391, 17:44 عصر
خب نیازی نیست که حتما از Data set استفاده کنی و کل جدول کاربران رو بیاری توی رم و یکی یکی چک کنی تا برسی به کاربری که می خوای و ...
فقط کافیه یک چنین کوئری ای با شی Data reader اجرا کنی.
select * from users where username='ali'
خب مطمئنا در اینجا Datareader سریعتر عمل می کنه.



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

یا میتوانید از StoredProcedure ها استفاده کنید و از طریق Dataset اونها رو فراخوانی کنید.

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

روش هایی مثل LINQ امتحان خودشون رو پس دادن عالی عمل می کنند.
جدیدا هم خیلی از برنامه نویس های دیتابیس به WCF رو آوردن که اون هم به نظر من یکی از بهترین روش های کار باداده است. مخصوصا در پروژه های WPF و Silverlight

موفق باشید.

tooraj_azizi_1035
سه شنبه 24 مرداد 1391, 19:55 عصر
سلام
اگه به دنبال رکوردهایی هستید که حاوی مقدار خاصی هستند مثلا فیلد Age برابر 30 باشد:
DataRow[] dr = table1.Rows.Find("agecolumnName = 30");
اما اگر با استفاده از ID ردیف جستجو می کنید:
DataRow dr = table1.Rows.Find("idcolumnName = value");

برای خواندن مقدار یافت شده:
string Name = dr("nameColumnName")
string age = dr("ageColumnName")




hope this helps