2015-02-03 3 views
0

몇 가지 정적 전역 인스턴스를 생성합니다. 다음은 전역 클래스입니다.모든 구성원에 대해 동일한 속성 가져 오기 (원하지 않는 항목)

public static class global_instances { 

    public static Orders order1 = new Orders(); 
    public static Orders order2 = new Orders(); 
    public static Orders order3 = new Orders(); 
    public static Orders order4 = new Orders(); 
    public static Orders order5 = new Orders(); 
    public static Orders order6 = new Orders(); 
} 

Orders 클래스에는 ID, 이름 등과 같은 여러 필드가 있습니다.

mysql 리더를 사용하여이 객체 필드를 고유 속성으로 채 웁니다.

다음과 같은 문제가 있습니다. 개체의 모든 정적 멤버가 할당 한 후 동일한 특성을 갖습니다. 정확히 마지막 데이터 레코드입니다. 그러나 모든 기록은 데이터베이스와 마찬가지로 고유해야합니다. 다음은 과제 클래스입니다.

internal static class Assignments 
{ 
    private static Queue<int> assign_ids = new Queue<int>(); 

    internal static void orders() 
    { 
     for (int i = 1; i <= 6; ++i) 
     { 
      assign_ids.Enqueue(i); 
     } 

     MySql.Data.MySqlClient.MySqlConnection sql_connection = null; 
     sql_connection = new MySql.Data.MySqlClient.MySqlConnection("server=localhost; user id=root; password=123; database=tables; persist security info=False"); 

     MySql.Data.MySqlClient.MySqlCommand sql_command = new MySql.Data.MySqlClient.MySqlCommand(); 

     sql_command.Connection = sql_connection; 

     sql_connection.Open(); 
     string id_string = Convert.ToString(assign_ids.Peek()); 
     sql_command.CommandText = "SELECT * FROM orders WHERE id='" + id_string + "';"; 
     var sql_reader = sql_command.ExecuteReader(); 

     for (int i = 1; i <= 6; ++i) 
     { 
      id_string = Convert.ToString(assign_ids.Peek()); 
      sql_command.CommandText = "SELECT * FROM orders WHERE id='" + id_string + "';"; assign_ids.Dequeue(); 
      while (sql_reader.Read()) 
      { 
       switch (i) 
       { 
        case 1: global_instances.order1.modify(sql_reader.GetString(0), sql_reader.GetString(1), sql_reader.GetUInt16(2), sql_reader.GetString(3), sql_reader.GetString(4), sql_reader.GetString(5), sql_reader.GetInt16(6), sql_reader.GetInt16(7), sql_reader.GetString(8), sql_reader.GetString(9)); 
         break; 
        case 2: global_instances.order2.modify(sql_reader.GetString(0), sql_reader.GetString(1), sql_reader.GetUInt16(2), sql_reader.GetString(3), sql_reader.GetString(4), sql_reader.GetString(5), sql_reader.GetInt16(6), sql_reader.GetInt16(7), sql_reader.GetString(8), sql_reader.GetString(9)); 
         break; 
        case 3: global_instances.order3.modify(sql_reader.GetString(0), sql_reader.GetString(1), sql_reader.GetUInt16(2), sql_reader.GetString(3), sql_reader.GetString(4), sql_reader.GetString(5), sql_reader.GetInt16(6), sql_reader.GetInt16(7), sql_reader.GetString(8), sql_reader.GetString(9)); 
         break; 
        case 4: global_instances.order4.modify(sql_reader.GetString(0), sql_reader.GetString(1), sql_reader.GetUInt16(2), sql_reader.GetString(3), sql_reader.GetString(4), sql_reader.GetString(5), sql_reader.GetInt16(6), sql_reader.GetInt16(7), sql_reader.GetString(8), sql_reader.GetString(9)); 
         break; 
        case 5: global_instances.order5.modify(sql_reader.GetString(0), sql_reader.GetString(1), sql_reader.GetUInt16(2), sql_reader.GetString(3), sql_reader.GetString(4), sql_reader.GetString(5), sql_reader.GetInt16(6), sql_reader.GetInt16(7), sql_reader.GetString(8), sql_reader.GetString(9)); 
         break; 
        case 6: global_instances.order6.modify(sql_reader.GetString(0), sql_reader.GetString(1), sql_reader.GetUInt16(2), sql_reader.GetString(3), sql_reader.GetString(4), sql_reader.GetString(5), sql_reader.GetInt16(6), sql_reader.GetInt16(7), sql_reader.GetString(8), sql_reader.GetString(9)); 
         break; 
       }//end switch 

      } 
      sql_reader.Close(); 
      sql_reader = sql_command.ExecuteReader(); 
     } 
     sql_connection.Close(); 

    } 

} 

웹 양식을 사용하여 데이터를 출력하고 디버깅하고 그물을 조사했지만 해결책을 찾지 못했습니다.

다음은 주문 클래스입니다. public class 주문 : I_Orders { protected static string edition; 보호 된 정적 문자열 희박; static static uint id; protected static string name; 보호 된 정적 문자열 유형. static string affilations 보호. protected static int points; private static int span; 보호 된 정적 문자열 요구 사항. 보호 된 정적 문자열 스페셜;

internal Orders(){ 
     edition = "none"; 
     rarity = ""; 
     id = 0; 
     name = ""; 
     type = ""; 
     affilations = ""; 
     points = 0; 
     span = 0; 
     requirements = ""; 
     specials = ""; 
    } 
    public void modify(string edi, string rar, uint i_d, string nam, string typ, string aff, int poi, int spa, string requ, string spec) { 
     edition = edi; 
     rarity = rar; 
     id = i_d; 
     name = nam; 
     type = typ; 
     affilations = aff; 
     points = poi; 
     span = spa; 
     requirements = requ; 
     specials = spec; 
    } 

    public string get_edition() { return edition; } 
    public string get_rarity() { return rarity; } 
    public uint get_id() { return id; } 
    public string get_name() { return name; } 
    public string get_type() { return type; } 
    public string get_affilations() { return affilations; } 
    public int get_points() { return points; } 
    public int get_span() { return span; } 
    public string get_requirements() { return requirements; } 
    public string get_specials() { return specials; } 
} 

전체 프로젝트의 주문 개체에 액세스해야합니다. 글로벌 대안을 줄 수 있습니까?

SQL 문이 6 번 변경되고 주문을 한 번만 수정하기 때문에 switch 문을 사용하고 있습니다.

편집은 내가으로 IDisposable 인터페이스를 구현하는 클래스 할당에 내 개체를 사용하여. 그러나 할당 방법을 호출하지 않고도 내 웹폼에서 객체를 수정하더라도 (테스팅 목적으로) 동일한 속성을 갖습니다.

+3

이름이 정해지지 않은'objects' 클래스의 코드를 보여주십시오. 또한 이와 같은 전역 상태는 웹 컨텍스트에서 특히 * 나쁜 * 아이디어이며, 모든 변수 이름도 비 통상적이며 리소스를 적절히 처분하지 못한다는 점에 유의하십시오. –

+3

그게 바로 당신이하고있는 일입니다. 동일한 쿼리를 6 번 반복합니다. 매번 같은 글로벌 인스턴스 (모든 글로벌 인스턴스)에 하나씩 모든 행을 씁니다.이 행은 결과의 순서와 관련이없는 'i'가 가리키는 행입니다. 이 코드에는 너무 많은 문제가 있습니다. 전역 변수, 반복 변수, 연결 문 ... –

+1

이 코드는 의미가 없습니다. 원하는 범위의 ID를 가진 모든 레코드를 선택하기 만하면됩니까? –

답변

0

내 주문 클래스 필드는 정적 이었으므로 가능한 인스턴스 복사본은 하나뿐입니다.

정적 멤버는 복사본이 하나 뿐인 경우에만 사용하십시오.

0

Queue<int> assign_ids;을 제거하면 문제를 해결할 수 있습니다. 루프 외부 변경

Convert.ToString(assign_ids.Peek()) 

: 루프 내부

id_string = "1" 

:

id_string = i.ToString() 

보조 노트로서, 당신은 처리는 IDisposable 처리, 코드 구조 및 명령 매개 변수에주의를 기울여야한다 . 일회용 개체는 명세서를 사용하여 가장 잘 처리됩니다. 코드 중복을 피하십시오 (루프 내부 및 외부에서 명령 실행 코드 복제). sql 삽입 및 SQL 쿼리 계획 캐시 성능 문제의 영향을받는 문자열 연결을 피하십시오. SQL 명령과 함께 매개 변수 사용에 대해 배우십시오.

+0

답장을 보내 주셔서 감사합니다. 그러나 주된 문제는 여전히 존재합니다. 인스턴스의 모든 구성원은 동일한 속성을가집니다. 50 개가 넘는 6 개의 ID를 무작위로 선택합니다. 내 게시물에 남았습니다. 죄송합니다. –

관련 문제