2013-07-11 6 views
2

GridView (gvPart)SqlDataSource (sdsParts)을 데이터 원본으로 사용하고 있습니다. gvPart에는 AllowPaging="true" 속성이 있습니다. gvPart을 통해 검색을 입력하고 실행하는 데 사용되는 TextBox (txtPartSearch)Button도 있습니다. 이를 위해, 나는 뒤에 코드에서 다음과 같은 한 :asp : SqlDataSource SelectCommand 속성이 페이징 할 때 지속되지 않습니다.

protected void partSearch(object sender, EventArgs e) 
{ 
    string query = txtPartSearch.Text; 
    string selectCmd = "SELECT ... WHERE partnum LIKE '" + query + "%' ... "; // I have cut out most of the statement for clarity 
    sdsParts.SelectCommand = selectCmd; 
    gvPart.DataBind(); 
} 

이것의 목적은 사용자가 부품 번호를 입력하고 대신 전체 목록의 쿼리와 일치하는 gvPart 디스플레이 부분 만이 할 수 있도록하는 것입니다.

위의 방법을 사용한 후 gvPart의 첫 번째 페이지가 예상 한 것과 같습니다. 그러나이 select 문으로 인해 gvPart에 두 페이지 이상이 표시되는 경우 바닥 글의 2 페이지를 클릭하면 두 번째 페이지가 표시되지만 데이터는 원래 데이터의 페이지 2 (즉, 이전에 가져온 데이터 검색은 기본값이 SelectCommandsdsParts입니다.

페이징이 SqlDataSource을 "다시 설정"하고 sdsParts.SelectCommand = selectCmd 문과 관계없이 Default.aspx로 작성된 SelectCommand을 사용합니다. 다른 페이지에서 클릭 한 후

protected void Page_Load(object sender, EventArgs e) 
{ 
    if (!IsPostBack) 
    { 
     string selectCmd = "SELECT ... "; 
     sdsParts.SelectCommand = selectCmd; 
     gvPart.DataBind(); 
    } 
} 

을하지만 : Page_Load의 기본 하나를 추가 한 후

<asp:SqlDataSource ID="sdsParts" runat="server" ConnectionString="..." /> 

과 : sdsParts는 다음과 같이 보이도록

나는 완전히 밖으로 SelectCommand 떠나 시도 gvPart은 공백으로, 마치 SelectCommand=""입니다.

sdsParts 인 이유는 무엇이며 어떻게 수정하고 피할 수 있습니까?

편집

나는 내 문제를 해결했다. 같은 문제로 여기 오는 사람들을 위해 여기를 클릭하여 해결 방법에 대한 설명과 제안을 받으십시오.

편집은 왜 뒤에 코드에서의 SqlDataSource의 SelectCommand에 변경되어 더 명확

답변

1

SQLDataSource은 보안상의 이유로 새로운 SelectCommand을 유지하지 않습니다. 따라서 SelectCommand 속성은 .aspx 파일에 코딩 된 원래 값으로 되돌아갑니다.가능한 해결책은 지금처럼 Session 변수를 사용하는 것입니다 좀 더 정보를

protected void Page_Load(object sender, EventArgs e) 
{ 
    if (Session["select"] != null) 
     sdsParts.SelectCommand = selectCmd; 
    else 
     sdsParts.SelectCommand = "SELECT ... "; //some default command 
} 

Click here 내 솔루션의 위치를 ​​참조하십시오 :

protected void partSearch(object sender, EventArgs e) 
{ 
    string query = txtPartSearch.Text; 
    string selectCmd = "SELECT ... WHERE partnum LIKE '" + query + "%' ... "; 
    sdsParts.SelectCommand = selectCmd; 
    Session["select"] = selectCmd; 
} 

그리고 Page_Load에.

참고 : 위의 select 문을 생성하는 방법은 SQL 삽입 공격을 초대하므로 권장하지 않습니다. SqlDataSource Parameters을 사용하는 것이 좋습니다.

0

에 대한 대답에 내 위의 솔루션을 이전? 그것을 통제 장치에 넣으십시오.

둘째, 코드가 SQL 주입 공격의 영향을받습니다. 사용자 제공 데이터를 TSQL ... EVER에 연결하지 마십시오.

예를 들어 통증이있는 ​​빠른 학습을 위해 프로그램을 실행하고 ';DROP TABLE PARTS;' 부품 번호를 입력 한 다음 울기가 끝나면 사장이 당신을 해고하지 않으면 코드를 변경하십시오 .

+0

나는이 점을 처음 접했고, 그런 공격을 피할 방법을 모른다. 하나를 예방하기 위해 어떤 단계를 밟아야합니까? – wlyles

+0

문자열을 연결하지 마십시오 (특히 사용자의 데이터). 그러면 데이터베이스로 전달됩니다. –

+0

SqlDataSource에 다음과 같은 SelectCommand가 있어야합니다. 'SELECT ... FROM Parts WHERE partnum LIKE @ partnum' 다음에 partnum이라는 SqlParameter (Probably ControlParameter)를 만듭니다. –