PDA

View Full Version : حرفه ای: انتخاب درصدی از یک جدول به صورت رندم(مشورت)



moslem.hady
یک شنبه 23 مرداد 1390, 18:50 عصر
سلام به همه دوستان
میخوام از یه جدول که یه فیلد با عنوان type (که مقادیر int میگیره. فرضا 1و2و3) داره، به صورت درصدی و رندم از هر نوع(که با type مجزا میشن) انتخاب کنم. و با repeater نشون بدم.

به عنوان مثال انتخاب رندم 10 درصد از رکوردهایی که type=1 و انتخاب رندم 40 درصد از رکوردهایی که type=4

من این کار رو کردم. 2تا ریپیتر گذاشتم که اولی با SqlDataSource1 این کوئری رو میگیره:
select top (10)precent * from table1 where type=1 order by newid()
(این کد به صورت رندم 10 درصد از type=1 رو انتخاب میکنه)
و دومین repeater با SqlDataSourcer2 این کوئری رو میگیره:
select top (40)precent * from table1 where type=4 order by newid()

خوب حالا سوال من اینه:
اولا آیا کار من درسته که به تعداد type (برای من 10 تا میشه) Repeater و SqlDataSource میذارم؟ روش دیگه ای در نظر دارین؟ میشه همه select ها(که 10 تا میشه) رو با یه SqlDataSource گرفت و آورد؟!!
دوما این کد نمایش درصدی و رندمی ک من استفاده کردم فشار زیادی رو سرور میاره(جایی خوندم). آیا کد بهتری برای این کار هست؟!!
اگه نظری دارین بگین. کد ها هم میتونه Tsql باشه هم linq
با تشکر

ASPX
یک شنبه 23 مرداد 1390, 19:19 عصر
دوست عزیز شما همانطور که گفته اید در این روش 10 تا کوئری اجرا نمایید. این 10 تا کوئری نیاز به 10 تا کانکشن دارند و این کار به صلاح نیست اگر بتوانید به صورت دستی کدنویسی را انجام دهید به راحتی با یک کانکشن میتوانید همه داده ها را بخوانید و نیاز به 10 تا SqlDataSourcer هم ندارید.
اگر بتوانید از شی دیتا ریدر استفاده نمایید برای خواندن داده ها میتوانید بدون باز و بسته کردن کانکشن از متد nextresult استفاده نمایید. با فرض اینکه هر کوئری پی در پی ارسال شود
میتوانید همه این 10 کوئری را در یک پروسیجر استفاده نمایید و با کمی ترفند آنها یکباره بخوانید! به صورت زیر
کد پروسیجر


select top (10)precent * from table1 where type=1 order by newid()
select top (20)precent * from table1 where type=2 order by newid()
select top (30)precent * from table1 where type=3 order by newid()
.
.
.
select top (100)precent * from table1 where type=10 order by newid()

کد سی شارپ


SqlConnection conn = new SqlConnection("Data Source=localhost; User Id=sa; Password=; Initial Catalog=northwind");
conn.Open();


SqlCommand cmd = new SqlCommand("نام sp", conn);
cmd.CommandType = CommandType.StoredProcedure;
SqlDataReader reader = cmd.ExecuteReader();
repeater1.DataSource=reader ;
repeater1.DataBind();
reader..NextResult();
/******************/
reader = cmd.ExecuteReader();
repeater2.DataSource=reader ;
repeater2.DataBind();
reader..NextResult();
/*********************



reader = cmd.ExecuteReader();
repeater10.DataSource=reader ;
repeater10.DataBind();
reader..NextResult();
conn.close();


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

moslem.hady
یک شنبه 23 مرداد 1390, 19:48 عصر
ممنون دوست عزیز. من زیاد با این طریقه کد نویسی(استفاده از SqlDataReader) آشنا نیستم.
موقعی که کد شما رو نوشتم و اجرا کردم خطایی با این عنوان داد:
There is already an open DataReader associated with this Command which must be closed first.

من کد شما رو عوض کردم به این صورت:


Repeater1.DataSource = reader;
Repeater1.DataBind();
reader.NextResult();
conn.Close(); conn.Open();
reader = cmd.ExecuteReader();
Repeater2.DataSource = reader;
Repeater2.DataBind();

reader.NextResult();
conn.Close(); conn.Open();
reader = cmd.ExecuteReader();
Repeater3.DataSource = reader;
Repeater3.DataBind();


اما در نهایت چیزی نمایش داده نشد. من StoredProcedore رو جدا تست کردم. درست کار میکنه.
مرسی

moslem.hady
یک شنبه 23 مرداد 1390, 21:58 عصر
با تشکر از خودم!!! مشکل رو پیدار کردم:
فقط یک بار باید این کد رو نوشت:
reader = cmd.ExecuteReader();
ینی تکرار لازم نیست. فقط یه دفه ExecuteReader کافیه.

این مشکل حل شد. کسی کد sql بهتر برای انتخاب رندم یه درصد از داده ها داره؟! یا روش بهتر؟