PDA

View Full Version : انتخاب چند رکورد تصادفی و ذخیره در آرایه



ahmad14.h
چهارشنبه 10 شهریور 1389, 11:56 صبح
سلام .
من این سوال 10 بار به شکل های مختلف مطرح کردم ولی جواب درستی به من داده نشد.
چند تا رکورد به صورت تصادفی انتخاب میشن. چطور مقدار یکی از فیلد ها رو تو آرایه بریزم؟
سوالم مبهم نیست؟
خواهش میکنم هر جوابی که میتونید ،بگید ...

ممنون

ali_autumnal
چهارشنبه 10 شهریور 1389, 12:03 عصر
خوب رکورد از کجا بصورت تصادفی انتخاب میشه؟
آیا از دیتابیس بصورت تصادفی انتخاب میشود؟
بله: خوب. پس این جدول کلید اصلی دارد. از طریق کلید اصلی به سطر مربوطه مراجعه میکنیم و سپس با استفاده از نام فیلدها راحت میتونیم به مقدار ها دسترسی پیدا کنیم.

در غیر اینصورت توضیحات بیشتری بده.

موفق باشید
علی پاییزی

ahmad14.h
چهارشنبه 10 شهریور 1389, 12:10 عصر
برنامه آزمون آنلاین هست.
کلید اصلی دارد.
الان با این کد اطلاعات واکشی میشه و در gridview نمیش داده میشه.

SELECT TOP 20 TITLE,J1,....J4 ORDER BY NEWID()
این 20 تا سوال را به صورت تصادفی انتخاب میکنه.
برای هر سوال یک فیلد جواب صحیح وجود داره.
حالا میخوام جواب صحیح این 20 سوال را تو آرایه بریزم که بعدا با جواب های کاربر مقایسه کنم.
ممنون

manij_mhm
چهارشنبه 10 شهریور 1389, 12:15 عصر
اگه با پایگاه دارید کار می کنید می تونید برای خوندن رکورد ها از reader استفاده کنید.

موفق باشید.

javad_r_85
چهارشنبه 10 شهریور 1389, 12:37 عصر
اگه با پایگاه دارید کار می کنید می تونید برای خوندن رکورد ها از reader استفاده کنید.

موفق باشید.

همونطوری که دوستم فرمودند از دیتا ریدر ها استفاده کن که رکورها را تک تک بر میگردونه و با استفاده از متد rdr.read() یعنی تا زمانی که رکودها را می خونه مقادیر را بگیر و در آرایه قرار بده

ahmad14.h
چهارشنبه 10 شهریور 1389, 13:02 عصر
ممنون از همتون.
ولی من تا حالا اینجوری کار نکردم.
کدش چی؟

ahmad14.h
چهارشنبه 10 شهریور 1389, 13:18 عصر
من دارم از gridview استفاده میکنم . با این جطور میشه؟

javad_r_85
چهارشنبه 10 شهریور 1389, 13:40 عصر
این یه نمونه کده که در صورتی که مقدار برگشتی داری سطری باشه پیغم میده


SqlDataReader rdr;
cmdText = new SqlCommand("SELECT * FROM COSTOMERs", con);
con.Open();
rdr = cmdText.ExecuteReader();

while (rdr.Read())
MessageBox.Show("0k");
rdr.Close();
con.Close();





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


object[] k;
rdr.GetValues(k);




فقط کافیه که بدونید مثلا فیلد اول رشته می باشه و از تبدیلها استفاده کنی
و یا متدهای دیگر rdr مانندrdr.GetString(); که مقدار فیلد خاصی را بر میگردونه استفاده کنید

manij_mhm
چهارشنبه 10 شهریور 1389, 14:10 عصر
فقط کافیه به جای ExecuteNonQuery از ExecuteReader استفاده کنی


SqlDataReader read = DA.SelectCommand.ExecuteReader();


تمام رکورد ها با کد بالا در read ذخیره شده حالا برای دسترسی به فیلد خاصی می نویسیم:

while (read.Read())
{
my_Array[i] = read[i];
}

Masoome_das
چهارشنبه 10 شهریور 1389, 14:37 عصر
با پیشنهادی که دوستان دادند باز هم شما مجبورید کل اطلاعات را از پایگاه دادتان بخوانید و سطر به سطر تست کنید که آیا این سطر جزو انتخاب هایتان است یا خیر
اگر شما تمایل دارید از DataSet استفاده کنید در یک آرایه کلید های تصادفی مورد نظرتان را قرار دهید سپس dataSet را فیلتر کنید و سطرهایی که با کلید شما برابری دارد را انتخاب کنید

احمد سامعی
چهارشنبه 10 شهریور 1389, 14:42 عصر
سلام
این طور که من متوجه شدم شما در سایت می خواهید این کار انجام بدید

این روش ها که دوستان گفتند خوبه اما برای ویندوز، چون شما در وب به سختی می تونید اطلاعات آرایه رو نگاه دارید تا پس از بازگشت اطلاعات از طرف کاربر مقایسه کنید در نتیجه باید الگوریتم مناسبتری در نظر بگیرید

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

زمانی که به مرحله سوم رسیدید باید جوابهای سوالات با شماره هایی که دریافت کردید دوباره بازخوانی کنید و مقایسه انجام شده و نتیجه به کاربر نمایش داده بشه

در کل استفاده از آرایه های معمولی دیگه رسم نیست و به جای اون باید شما از کانکشن های کلاس جنریک استفاده کنید که امکانات بهتری به شما می ده مانند لیست ها

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


System.Collections.Generic.List<string> questions = new System.Collections.Generic.List<string>();


System.Collections.Generic.Dictionary<int, Object> questions = new System.Collections.Generic.Dictionary<int, object>();

البته زمانی که اینکه از آبجکت یا رشته استفاده کنید بسته به شما و برنامه تون داره
(فرض بر این که شما کار با دیتابیس و دریافت اطلاعات بلد هستید)

#aliyari_C
چهارشنبه 10 شهریور 1389, 18:37 عصر
سلام
همانظور که مشاهده کردید , بهترین نتیجه ای که می توان از این چند بحث کرد این است که فقطی Data هایمان در حافظه است, چرا باید خودمان را درگیر SELECT کردن در بانک کنیم(البته در مواقعی باید این کار را کرد)ولی در مواقعی هم نباید این کار را کرد.
این هم یکی از چند دللایل خلق LINQ می باشد.

برای این کار ابتدا کلاس زیر را تعرف می کنیم


class TableTest
{
private int _ID;
private string _Question;
private int _Reply;

public TableTest()
{
}
public TableTest(int ID, String Question)
{
this._ID = ID;
this._Question = Question;

}
public TableTest(int ID, int Reply)
{
this._ID = ID;
this._Reply = Reply;
}
public int ID
{
get { return _ID; }
set { _ID = value; }
}
public string Question
{
get { return _Question; }
set { _Question = value; }
}
public int Reply
{
get { return _Reply; }
set { _Reply = value; }
}
}
سپس کد زیر را هم اضافه می کنیم


//SortedDictionary<int, string> sdc = new SortedDictionary<int, string>();
//این لیست جهت نمایش دادن سوال یه کاربر
List<TableTest> Ls = new List<TableTest>();
//این لیست جهت گرفتن تمامی سوالها از کاربر
List<TableTest> Lg = new List<TableTest>();

//این لیست جهت نمایش دادن نتیجه آزمون به کاریر
SortedDictionary<int, bool> Lr = new SortedDictionary<int, bool>();
//برای گرفتن 20 عدد اتفاقی برای دسترسی به رکورد
int[] j = Enumerable.Range(1, this.database11DataSet.Table1.Count).OrderBy(k => k = Guid.NewGuid().GetHashCode()).Take(20).ToArray();

//جهت گرفتن 20 رکورد از جدول
foreach (int item in j)
Ls.Add(new TableTest((int)database11DataSet.Table1.Select("ID=" + item).First()["ID"], database11DataSet.Table1.Select("ID=" + item).First()["question"].ToString())); // sdc.Add((int)dataSet11.TavleCsharp.Select("ID==" + item).First()["ID"], dataSet11.TavleCsharp.Select("ID==" + item).First()["question"].ToString());
//جهت گرفتن جوابهای تست از کاربر که در اینجا تمامی تستها گزینه 2 قرار داده شده
foreach (var d in Ls)
Lg.Add(new TableTest(d.ID, 2));

Ls.Clear();
//در اینجا تمامی نتایج برسی و درون لیست ریخنه می شود
foreach (var f in Lg)
{


Lr.Add(f.ID, (database11DataSet.Table1.Select("ID=" + f.ID + "and reply=" + f.Reply).Count() == 0));

}

//اینم مشاهده نتیجه
StringBuilder sb=new StringBuilder();

foreach (var item in Lr)
sb.AppendLine( item.Key.ToString() +" : "+item.Value.ToString());
MessageBox.Show( sb.ToString());

اگر نامفهوم بود بگو
موفق وتندرست باشی
__________________________________________________ _________________________
چون به دریاه می توانی راه یافت.................سوی یک قطره چرا باید شتافت

ahmad14.h
چهارشنبه 10 شهریور 1389, 22:56 عصر
واقعا" از همه ممنونم.
راستش من از asp.net استفاده میکنم.

احمد سامعی
پنج شنبه 11 شهریور 1389, 02:20 صبح
من فکر می کنم باز باید برگردیم به قوانین سایت

جناب ahmad14.h نکته اینکه تالاری سوال پرسیدید اشتباه هست و باید در تالار مربوطه بپرسید چون بعضی از دوستان فقط تحت ویندوز کار می کنند و ممکن راه حل ها با وب فرق داشته باشه البته سوء تفاهم برای دوستان نشه برای این می گم که اساتید اون تالار از تجربه شون شما استفاده کنید چون ممکن به اینجا کمتر سر بزنن

جناب #aliyari_C من از راه حل شما سر درنیاوردم ؟ شما در وب وقتی سوالات به سمت کلاینت ارسال می کنید باید یک جوری شماره اون ها رو در سرور ذخیره کنید تا بدونید پس از بازگشت چه شماره سوالاتی ارسال شده بر مبنای همون ها جواب ها از بانک دریافت و مقایسه بشه
و نکته دیگه اینکه برعکس شما من فکر می کنم باید انتخاب سوالات در بخش سرور دیتا صورت بگیره و نه در سطح لایه اول برنامه ! چون شما نمی دونید تعداد سوالات چندتا هست و اگر ثابت فرض کنید امکان توسعه برنامه گرفته می شه در نهایت بهترین کار استفاده از یک sp هست که سوالات دریافت و یک sp برای دریافت نتایج داشته باشید در نهایت LINQ هم جزء بار اضافی برای سرور چیزی نداره پس همون بهتره از روشها اتصال معمول استفاده بشه و از یک کلاس ویژه که یک بار اتصال بده تا بار کمتری بر سرور بوجود بیاد

ahmad14.h
پنج شنبه 11 شهریور 1389, 10:14 صبح
من تو تالار مربوطه سوالم مطرح کردم کسی جواب درست حسابی نداد.همه میگن بقیشو که خودت میدونی .
من 1 ماه هم نیست که دارم کار میکنم دیگه بقیش چمیدونم آخه!!!!!
فقط هم چون پروژه برای فاغ التحصیلی ام بود یاد گرفتم.
میتونستم مثل خیلی های دیگه از یه نفر دیگه آماده شده رو بگیرم بعد تحویل استاد بدم.

احمد سامعی
پنج شنبه 11 شهریور 1389, 11:27 صبح
سلام
تمام کسانی که تو اینجور انجمن ها رفت و آمد دارن مثل شما علاقمند بودن و به دانشگاه اکتفا نکردن اما اون کسی که گفته بقیه اش خودت می دونی مبنا رو بر این گذاشته که شما یکم اطلاعات داری که خوب شما باید در جوابش می گفتی که نه و یا در زمانی که پست می دی همون ابتدا بگی در چه سطحی هستی تا دوستان بیشتر راهنمایی کنند ( هرچند گاهی بعضی ها فقط می خوان پست بدن و علاقه شدید به ابراز وجود دارن که کم هستند)
با این حال جواب صحیح در تالار خودش
در مورد هر بخش از برنامه هم باید جداگانه جستجو کنی و اگر نتیجه نداد سوال بپرسی و نه اینکه همه چیز در یک تاپیک بپرسی و معمولاً در تالار های مختلف یک تاپیک بالای تالار هست که سوالات قدیمی مهم در اون هست که می تونی سریعتر به جواب برسی

حالا هم بگو کجاش نفهمیدی ؟

شاد بمانید
سامعی

ahmad14.h
پنج شنبه 11 شهریور 1389, 11:39 صبح
درسته.
والا این کدها رو که هیچی نفهمیدم.
با SqlDataSource اطلاعات(20 رکورد تصادفی) رو میخونم تو یه datalist نمایش میدم.jتو هر سطر یه radiobuttonlist هست که کاربر جوابشو تو اون میزنه.
حالا هر سوال گزینه صحیح اش هم تو جدول ذخیره شده.
نمیدونم چطور فیلد گزینه صحیح اون رکورد هایی که واکشی میشن رو یه جا ذخیره کنم.
اگه این قسمت رو انجام بدم بقی اش فکر نکنم زیاد سخت باشه.
ممنون

احمد سامعی
پنج شنبه 11 شهریور 1389, 15:09 عصر
اول اینکه شما به یکی از مدیران تالار پیغام بدید تاپیک به تالار asp.net منتقل کنند تا از دوستانی که در این زمینه امتحان آنلاین تجربه بیشتری دارن کمک بگیری
دوم شما نباید اول جواب رو همراه سوالات واکشی کنید باید شماره سوال بگیرید و بعد جواب دریافت کنید من قبلاً اشاره کردم

برای نگاه داری شماره سوال ها راه حل زیاد هست مثلاً session یا کوکی ها یا یک جدول در دیتابیس یا HiddenField یا ....

باید دید برای منظور شما کدام بهینه هست و مقدار بازدید کننده از سایت چقدر هست (البته فکر کنم پروژه شما دانشجویی هست که نیاز به محاسبات زیاد نداره از session استفاده کن تا بار روی سرور ایجاد نشه)

ahmad14.h
پنج شنبه 11 شهریور 1389, 18:38 عصر
ممنونم. اونا فقط کد asp.net میدن . من کد C# میخوام.

احمد سامعی
پنج شنبه 11 شهریور 1389, 19:35 عصر
دوست عزیز این حرفتون جای اشکال داره
به زبان ساده asp تکنولوژی تلفیق تگهای html با زبان برنامه نویسی شماست حالا این زبان می تونه #C باشه یا دلفی یا VB تفاوتی نمی کنه
تگ های asp ربطی به کدهای برنامه شما نداره مانند کدهایی که با بانک در ارتباط هستند
در نتیجه شما باید زمان سوال پرسیدن خاطر نشان کنید که با چه زبانی کار می کنید هرچند بعد یک مدت می فهمید که تفاوت آنچنانی بین زبان های دات نت نیست و به راحتی می تونید به هم تبدیلشون کنید پس نگران این مساله نباشید

ahmad14.h
پنج شنبه 11 شهریور 1389, 20:13 عصر
این پروژه دانشگاهیم هست. پروژه برای فارغ التحصیلی کاردانی.
تا کمتر از 3 هفته دیگه من باید وارد دانشگاه برای کارشناسی بشم. تو این مدت کم من چی کار کنم!
الان دارم هر کاری میکنم تا از یه جا کمک بگیرم. کسی کمکی که میخوام نمیکنه.

#aliyari_C
جمعه 12 شهریور 1389, 00:56 صبح
جناب #aliyari_C من از راه حل شما سر درنیاوردم ؟
بگو کجاش رو سر در نیاوردی تا برات تشریحش کنم!


شما در وب وقتی سوالات به سمت کلاینت ارسال می کنید......
اولا ایشان تاپیکشان را در بخش برنامه نویسی در C#‎‎‎ (http://www.barnamenevis.org/forum/forumdisplay.php?f=26) عنوان کردن و ما هم app جواب دادیم
دوست عزیز احمد سامعی (http://www.barnamenevis.org/forum/member.php?u=18023) اگر می شه شما هم کد asp ش رو بذارید تا ما هم اسفاده کنیم

احمد سامعی
جمعه 12 شهریور 1389, 02:01 صبح
اولا ایشان تاپیکشان را در بخش برنامه نویسی در C#‎‎‎‎[/URL] عنوان کردن و ما هم app جواب دادیم

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

شاد بمانید