2012-05-17 3 views
0

ID 번호 (1,2..20 등)를 기반으로 SQL에 저장된 1-35 개의 질문 사이에 25 개의 난수를 가져옵니다. 그러면 테스트를받는 사용자가 SQL의 질문 풀에서 무작위 질문을받습니다. 루프 변수 "a"가 존중 된 배열에 값을 입력하는 키로 사용되는 동안 SQL 매개 변수를 증가 시키려고합니다.SQL 데이터베이스 테이블에서 데이터 당기기

select top 35 * from Question_Pool order by (newid()) 

이것은 효과적으로 35을 복용하기 전에 질문을 randomises :

샘플 코드는

protected void Question_Fetch(int[] Mixed_Questions) 
    //this array is loaded with my mixed numbers between 1-35(no duplicates) the array length //is 25 
    { 
     Question_String_list = new string[25]; 
     Question_Answers = new string[25]; 
     Num_Answers = new string[25]; 
     Types_Of_Question = new string[25]; 
     User_Answers = new string[25]; 
     isLocked = new string[25]; 

     using (SqlCommand Comd = new SqlCommand("SELECT Question_String, Question_Answer, Type_Of_Question, Possible_Answers FROM Question_Pool WHERE Question_ID = @Question_ID", Conn)) 
     { 
      SqlParameter IDParam = Comd.Parameters.Add("@Question_ID", SqlDbType.Int); 
      for (int a = 0; a < Mixed_Questions.Length; a++) 
      { 
       int Random_Number = Mixed_Questions[a]; 
       Comd.Parameters.AddWithValue("@Question_ID", Random_Number); 
       Conn.Open();           
       SqlDataReader rdr = Comd.ExecuteReader(); 
       if (rdr.Read()) 
       { 
        IDParam = Mixed_Questions[a]; 
        //Random_Number = Mixed_Questions[a]; 
        //Comd.Parameters.AddWithValue("@Question_ID", Random_Number); 
        Question_String_list[a] = rdr.GetValue(0).ToString(); 
        Question_Answers[a] = rdr.GetValue(1).ToString(); 
        Types_Of_Question[a] = rdr.GetValue(2).ToString(); 
        Num_Answers[a] = rdr.GetValue(3).ToString(); 
        Conn.Close(); 
       } 
      } 
     } 
     Answer_Controls(); 
     Init_Test_Details(); 
    } 
+0

정말 고전적인 ASP를 사용하고 있습니까? 또한 왜 객체 배열 대신에 병렬 배열을 사용하고 있습니까? –

+0

죄송합니다. asp 태그는 실수입니다. 이것은 아직이 응용 프로그램 개발의 초기 단계이며 공동 운영 학생입니다. 제가 제공 할 수있는 지원을 코딩 할 때 쉽게 더 쉽게 보일 수있는 객체 배열을 살펴 보겠습니다. 크게 감사하겠습니다. –

답변

2

아래에 다음과 같이 뭔가를 할 수 있습니다 (35 개) 무작위로 질문을 뽑아 더 나은 방법입니다. 이렇게하면 35 개의 쿼리가 아닌 하나의 쿼리로 모든 작업을 수행 할 수 있습니다.

+0

이것이 내가하는 방법이기도하다. 또한 사용자가 "테스트"를 여러 번 수행 할 수있는 능력이 있다면 where 절을 포함시켜 이전에 묻지 않은 질문을 사용자가 항상 볼 수 있도록 할 수 있습니다. QuestionInt가 아닌 Question_Pool에서 top 35 *를 선택합니다. QuestionId from Answers where AnsweredByUserId = @ UserId) order by (newid()) – mellodev

+0

대단히 감사합니다. 완벽하게 작동합니다! @ Paul Stovell 다시 한 번 감사드립니다. 오늘이 시간을 너무 많이 보냈습니다. –

관련 문제