2012-11-07 3 views
1

IDataReader가 오래되어 일부 코드가 더러운 코드로 인식되지만 사이트에서이 코드를 사용하고 있습니다. 여러 조인을 사용하여 테이블에서 특정 ID를 얻기 위해 쿼리를 실행하는 IDataReader 문이 있습니다. 이제이 사이트에는 DAL이 있지만 한 번에 하나의 표에서 선택할 수있는 기능 만 지원하므로 조인과 함께 select 문을 사용하면이 기능이 작동하지 않습니다. 이것이 IDataReader를 강제로 사용해야하는 이유입니다.IDataReader 읽지 않음, 오류 없음

if (Request.QueryString["CategoryId"].ToString() == "0") 
       { 
        using (IDataReader getCategoryID = DB.GetRS("SELECT ItemCatalogCategory.CategoryID FROM UserCustomerCatalog INNER JOIN ItemCatalogCategory ON UserCustomerCatalog.ItemProfileCatalogID = ItemCatalogCategory.ItemProfileCatalogID " + 
           "INNER JOIN ItemCategory ON ItemCatalogCategory.CategoryID = ItemCategory.CategoryID INNER JOIN StoreCatalog ON UserCustomerCatalog.StoreCatalogID = StoreCatalog.StoreCatalogID " + 
           "WHERE UserCustomerCatalog.ItemProfileCatalogID = '" + Request.QueryString["CatalogID"] + "' AND UserCustomerCatalog.CustomerID =' " + Session["Customer"].ToString() + "' AND ItemCategory.ProductID = '" + productis + "'")) 
        { 

         if (getCategoryID.Read()) 
         { 
          string categoryID = getCategoryID["ItemCatalogCategory.CategoryID"].ToString(); 

          string lookmike = Request.Url.AbsolutePath + "?CatalogID=" + catalogis + "&ProductID=" + productis + "&CatalogIndex=" + Request.QueryString["CatalogIndex"] + "&CategoryID=" + categoryID; 
          Response.Redirect(Request.Url.AbsolutePath + "?CatalogID=" + catalogis + "&ProductID=" + productis + "&CatalogIndex=" + Request.QueryString["CatalogIndex"] + "&CategoryID=" + categoryID); 

         } 
         else 
         { 
          Response.Redirect(Request.Url.AbsolutePath + "?CatalogID=" + catalogis + "&ProductID=" + productis + "&CatalogIndex=" + Request.QueryString["CatalogIndex"] + "&CategoryID=" + Request.QueryString["CategoryId"]); 
         } 

        }//end using getCategoryID 
       } 

이 내가 무슨이지만 얻을 때까지 :

if (getCategoryID.Read()) 

는 허위 렌더링 던져 예외 및 오류 또는 경고가 없습니다. 과거에이 유형의 선택을 문제없이 수행했지만, .Read()가 false를 반환하는 이유를 알아낼 수 없습니다.

누구나 읽을 수없는 이유를 제시 할 수 있습니까? 더 많은 코드가 필요한 경우 필요에 따라 제공 할 수 있습니다. 어떤 도움을 주셔서 감사합니다, 미리 감사드립니다. 당신의 SQL 텍스트를 보면

+1

실제로 결과가없는 것이 가능합니까? 사용중인 DB 시스템에 관계없이 생성중인 SQL 쿼리를 실행할 때 얼마나 많은 결과가 반환됩니까? –

+2

"IDataReader가 오래되었다는 것을 깨닫고 일부는 더티 코드로 보았습니다"적어도 DataTable은 아니지만 데이터 판독기는 정상입니다. 개인적으로 나는 UI * 옆에 * little * (UI 바로 옆)이 아니라 그것을 숨길 수 있습니다. –

+2

그러나 *에는 *, *** *** 거대한 *** SQL 주입 구멍이 있습니다. 매우 안전하지 않은 코드. (여전히 찾고 ...) –

답변

1

공간 쿼리를 미치게하는 결과

으로 위력을 과시하고 어떤 결과를 줄 수 없었다 약간의 오타가있다.

다른 회원이 이미 말한 것처럼 SQL Injection에 문제가 있음을 반복하겠습니다. GetRS의 실제 구현에 과부하를 추가하여 SqlDataReader를 작성하는 데 사용되는 명령에 추가 할 SQLParameter 컬렉션을받을 수도 있습니다. 이 같은 것

public SqlDataReader GetRS(string sqlText, SqlParameter[] prm) 
{ 
     .... 
     SqlCommand cmd = new SqlCommand(sqlText, conn); 
     cmd.Parameters.AddRange(prm); 
     ..... 
} 

호출 코드를 upate 시작하십시오.

+0

SQL 주입을 피하기 위해 답변과 조언을 해주셔서 감사합니다. 이것과 비슷한 코딩을위한 매개 변수 구조를 구현하려고합니다. 다시 귀하의 도움에 감사드립니다, 정말 감사드립니다. –

+2

도움이 될 수있어서 기쁩니다. 그리고 우리가 그것에 머무르는 동안 잠시 쉬고 미소를 짓자. http://xkcd.com/327/ – Steve

관련 문제