2014-04-20 2 views
-1

내가 기능을 가진 SqlDB.dll을 가지고 : 당신이 그것을 반환하기 전에 독자를 닫는 시도하고, 또한 내가 내부의 데이터를 읽고 괜찮아 볼 수 있듯이SqlDataReader 개체 InvalidOperationException이

  public SqlDataReader getEnumValues(int enumId) 
    { 
     SqlDataReader reader = null; 
     using (SqlConnection connection = new SqlConnection(connectionString)) 
     { 
      connection.Open(); 
      SqlCommand command = 
       new SqlCommand(
        "SELECT * FROM [EnumValue] WHERE enumId LIKE '" + enumId + "';", 
        connection); 
      reader = command.ExecuteReader(); 
      //if(reader.Read()) 
      // Debug.WriteLine("Inside sqlDb->getEnumValues command = " + command.CommandText + " reader[name] = " + reader["name"].ToString() + " reader[value] = " + reader["value"].ToString() + " reader[description] = " + reader["description"].ToString()); 
     } 
     //reader.Close(); 
     return reader; 
    } 

. 이 같은 기능을 사용하고 있습니다 :

using (SqlDataReader getEnumValuesReader = (SqlDataReader)getEnumValues.Invoke(sqlDB, getEnumValuesForEnumParam)) 
        { 
         Debug.WriteLine("Success getEnumValues -- "); 

         if (getEnumValuesReader.HasRows) 
         { 
          while (getEnumValuesReader.Read())  //Loop throw all enumValues and add them to current enum 
          { 
           try 
           { 
            values.Add(new Model.EnumValue(getEnumValuesReader["name"].ToString(), getEnumValuesReader["value"].ToString(), getEnumValuesReader["description"].ToString())); 
            Debug.WriteLine("Value[0].name = " + values[0].Name); 
           } 
           catch (Exception ex) 
           { 
            Debug.WriteLine("Error in building new EnumValue: " + ex.Message); 
           } 
          } 
         } 

        } 

을 나는 유형의 예외를 받고 있어요 'System.InvalidOperationException'

나는 그것이 SqlDataReader 개체가 전달되는 함께 할 수있는 뭔가가 같은데요.

+1

[SQL Injection alert] (http://msdn.microsoft.com/en-us/library/ms161953%28v=sql.105%29.aspx) - SQL 문을 연결하지 않아야합니다 ** - 대신에 SQL 삽입을 피하기 위해 ** 매개 변수화 된 쿼리 **를 사용하십시오. –

+0

보안 문제가 전혀 없으며 향후 다른 사용자 \ 다른 개발자 \ 계획이 없지만 답변 해 주셔서 감사합니다. – Yogevnn

+0

이 코드를 사용하는 경우 웹 사이트 - ** 모든 웹 사이트 중 **는 SQL 삽입으로 악용 될 위험이 높습니다. 그냥 내가 어떤 웹 사이트를 방문하는지 결코 알 수 없으므로 아무 것도 방문하지 않도록 할 수 있습니다 .... –

답변

2

SQL 판독기는 SQL 연결 컨텍스트 외부에 존재할 수 없습니다. 연결이 메소드에서 처리 중이므로 리턴 된 독자는 호출 메소드에서 데이터를 가져올 수 없습니다.

리더 대신 판독기에서 값을 반환하는 것이 가장 좋습니다. 독자들을 지나치는 것은 좋은 습관이 아니며, 기본 연결 등을 의미합니다. 공개적이고 알려지지 않은 것입니다.

+0

답변 주셔서 감사합니다, 내 문제는 모든 값을 반환하는 방법입니까? 모든 값이 같은 유형에서 온 것이 아니며 일부는 문자열이고 일부는 int입니다 – Yogevnn

+0

모든 유형 (문자열, int 등)의 클래스를 선언하고 메소드 을 반환하면됩니다. DTO라고합니다. 데이터 전송 객체. –