2014-11-09 2 views
-2

저는이 코드가 제대로 작동하도록 노력하고 있지만 쿠키를 사용하고 있으며 쿠키 위치에 따라 ListView를 리바 인딩하려고하지만 오류 메시지가 나타납니다 : "반드시 선언해야합니다. 스칼라 변수 "@Location". "쿠키를 어떻게 선언 할 수 있습니까?

protected void Sortcarbtn_Click(object sender, EventArgs e) 
    { 
     HttpCookie cookie = Request.Cookies.Get("Location"); 
     using (SqlConnection carcon = new SqlConnection(ConfigurationManager.ConnectionStrings["BeravaConnectionString"].ConnectionString)) 

      if (cookie != null) 
      { 
       string CarSqlST = @"SELECT DISTINCT AdsID, Section, Category, Country, Maker, Gear, Condition, Status, State, City, AdsTit, 
       SUBSTRING(AdsDesc,1,155) as AdsDesc, Year, AdsPrice, Img1 From ads Where 1=1 AND [email protected] AND Country = @Location "; 


       var Location = Convert.ToString(cookie["Location"]); 
       var cat = Convert.ToString(Request.QueryString["cat"]); 

       string condition = ""; 

       if (barndcardrlst.SelectedValue != "") 
       { 
        condition += " and Maker='" + barndcardrlst.SelectedValue + "'"; 
       } 
       if (GearDrDw.SelectedValue != "") 
       { 
        condition += " and Gear='" + GearDrDw.SelectedValue + "'"; 
       } 


       if (carstatedrdolst.SelectedValue != "") 
       { 
        condition += " and State='" + carstatedrdolst.SelectedValue + "'"; 
       } 
       if (citiesdrdolst.SelectedValue != "") 
       { 
        condition += " and City='" + citiesdrdolst.SelectedValue + "'"; 
       } 


       if (CarCondDrDw.SelectedValue != "") 
       { 
        condition += " and Condition='" + CarCondDrDw.SelectedValue + "'"; 
       } 
       if (CarstusDRDL.SelectedValue != "") 
       { 
        condition += " and Status='" + CarstusDRDL.SelectedValue + "'"; 
       } 
       if ((CarPriceFrmDrDw.SelectedValue != "") && (CarPriceToDrDw.SelectedValue != "")) 
       { 
        condition += " and AdsPrice BETWEEN " + CarPriceFrmDrDw.SelectedValue + " AND " + CarPriceToDrDw.SelectedValue; 
       } 

       if ((CarYearfrmDrDw.SelectedValue != "") && (CarYeartoDrDw.SelectedValue != "")) 
       { 
        condition += " and Year BETWEEN " + CarYearfrmDrDw.SelectedValue + " AND " + CarYeartoDrDw.SelectedValue; 
       } 


       DataTable cdt = new DataTable(); 
       carcon.Open(); 
       SqlCommand ccmd = new SqlCommand(); 
       ccmd.Connection = carcon; 
       ccmd.CommandType = CommandType.Text; 
       ccmd.Parameters.AddWithValue("@Country", Location); 
       ccmd.Parameters.AddWithValue("@CATE", cat); 
       ccmd.CommandText = CarSqlST + condition; 
       SqlDataAdapter ad = new SqlDataAdapter(); 
       ad.SelectCommand = ccmd; 

       ad.Fill(cdt); 
       cateshowlistview.DataSource = cdt; 
       cateshowlistview.DataBind(); 

      } 


    } 

답변

0

변경 "@Country"

ccmd.Parameters.AddWithValue("@Country", Location); 

당신이 @location

문자열로 SQL 문에 국가 정의 "@location"

ccmd.Parameters.AddWithValue("@Location", Location); 

할 수 CarSqlST = @ "SELECT ... AND Category = @ CATE AND Country = @Location";

업데이트

SQL 인젝션 해킹을 방지하기 위해 당신이 함께 방금 SQL 매개 변수를 사용해야합니다 문자열 CONCAT있는 쿼리 옵션 모든 fileters를 재사용 할 SQL 수 있도록. 추가하기 쉽도록 매개 변수 사전을 만듭니다. 그런 다음 사전을 통해 SQL 루프를 반복하여 SQL 매개 변수를 채 웁니다. 나는 또한 많은 문자열 concat을 할 수 있기 때문에 문자열 빌더로 전환했다. 나는 당신의 객체 나 테이블 또는 연결이 없기 때문에이 코드를 테스트하지 않았다.

using (var carcon = new SqlConnection(ConfigurationManager.ConnectionStrings["BeravaConnectionString"].ConnectionString))) 
{ 
    if (cookie != null) 
    { 
     // Parameters for SQL 
     var parameters = new Dictionary<string, object>(); 

     // string builder to build up SQL Statement 
     var CarSqlST = new StringBuilder(
      "SELECT DISTINCT AdsID, Section, Category, Country, Maker, Gear, Condition, Status, State, City, AdsTit, " + 
      "SUBSTRING(AdsDesc,1,155) as AdsDesc, Year, AdsPrice, Img1 From ads " + 
      "Where Category = @pCATE AND Country = @pLocation "); 

     parameters.Add("@pCATE", Request.QueryString["cat"].ToString()); 
     parameters.Add("@pLocation", cookie["Location"]); 

     if (barndcardrlst.SelectedValue != "") 
     { 
      CarSqlST.Append(" and Maker= @pMaker"); 
      parameters.Add("@pMaker", barndcardrlst.SelectedValue); 
     } 

     if (GearDrDw.SelectedValue != "") 
     { 
      CarSqlST.Append(" and Gear= @pGear"); 
      parameters.Add("@pGear", GearDrDw.SelectedValue); 
     } 

     if (carstatedrdolst.SelectedValue != "") 
     { 
      CarSqlST.Append(" and State= @pState"); 
      parameters.Add("@pState", carstatedrdolst.SelectedValue); 
     } 

     if (citiesdrdolst.SelectedValue != "") 
     { 
      CarSqlST.Append(" and State= @pCity"); 
      parameters.Add("@pCity", citiesdrdolst.SelectedValue); 
     } 

     if (CarCondDrDw.SelectedValue != "") 
     { 
      CarSqlST.Append(" and Condition= @pCondition"); 
      parameters.Add("@pCondition", CarCondDrDw.SelectedValue); 
     } 

     if (CarstusDRDL.SelectedValue != "") 
     { 
      CarSqlST.Append(" and Status= @pStatus"); 
      parameters.Add("@pStatus", CarstusDRDL.SelectedValue); 
     } 

     if ((CarPriceFrmDrDw.SelectedValue != "") && (CarPriceToDrDw.SelectedValue != "")) 
     { 
      CarSqlST.Append(" and AdsPrice BETWEEN @pLowPrice AND @pHighPrice"); 
      parameters.Add("@pLowPrice", CarPriceFrmDrDw.SelectedValue); 
      parameters.Add("@pHighPrice", CarPriceToDrDw.SelectedValue); 
     } 

     if ((CarYearfrmDrDw.SelectedValue != "") && (CarYeartoDrDw.SelectedValue != "")) 
     { 
      CarSqlST.Append(" and Year BETWEEN @pLowYear AND @pHighYear"); 
      parameters.Add("@pLowYear", CarYearfrmDrDw.SelectedValue); 
      parameters.Add("@pHighYear", CarYeartoDrDw.SelectedValue); 

     } 

     DataTable cdt = new DataTable(); 
     SqlCommand ccmd = carcon.CreateCommand();; 
     ccmd.CommandType = CommandType.Text; 

     // Add all the parameters into this command 
     foreach (var parameter in parameters) 
     { 
      ccmd.Parameters.Add(parameter.Key, parameter.Value); 
     } 

     // set the command text from string builder 
     ccmd.CommandText = CarSqlST.ToString(); 

     SqlDataAdapter ad = new SqlDataAdapter(); 
     ad.SelectCommand = ccmd; 
    } 
} 

당신은 상단에있는 명령을 생성하고 바로 대신 사전의 SQL 매개 변수를 작성하지만 난 더 나은 무언가가 일어날 경우 사전 접근 방식을 좋아 한 수 - 예외 또는 우리는 우리가 만든 결코 구제 할 필요가 SQL 명령.

+0

안녕하세요 @CharlesNRice 당신이 언급 한 것처럼했는데이 오류가 나타납니다 : "매개 변수가있는 쿼리 '(@ 위치 nvarchar (4000), @ CATE nvarchar (4)) SELECT DISTINCT AdsI'는 '@Location'매개 변수를 필요로합니다. 그것은 공급되지 않았다. " 그리고 나에게도 더 나에게 내 SQL 문을보다 안전하게 aganist SQL 인젝션을 설명하고 싶습니다. –