2011-03-27 2 views
0

다음은 데이터베이스 계층 함수의 코드입니다.C# asp.net : error - 하나 이상의 필수 매개 변수에 지정된 값이 없습니다.

 public static dsPersonnel GetPersonnel(string Database, string strSearch) 
    { 
     dsPersonnel DS; 
     OleDbConnection sqlConn; 
     OleDbDataAdapter sqlDA; 

     //create the connection string 
     sqlConn = new OleDbConnection("PROVIDER=Microsoft.Jet.OLEDB.4.0;" + 
      "Data Source=" + Database); 

     string query; 
     if (strSearch == "" || strSearch.Trim().Length == 0) 
     { 
      query = "SELECT * from tblPersonnel"; 
     } 
     else 
     { 
      query = "SELECT * FROM tblPersonnel WHERE LastName = " + strSearch + ""; 
     } 




     //create the adapter with query 
     sqlDA = new OleDbDataAdapter(query, sqlConn); 

     //create the dataset 
     DS = new dsPersonnel(); 

     //fill the data set 
     sqlDA.Fill(DS.tblPersonnel); 

     //return the dataset 
     return DS; 
    } 
} 

포스트 백이 빈 문자열을 제출하면 모든 레코드가 반환됩니다. 하지만 실제 문자열이 함수에 전달되면 "하나 이상의 필수 매개 변수에 값이 지정되지 않았습니다"라는 오류 메시지가 나타납니다.

sqlDA.Fill(DS.tblPersonnel); 

디버그에서 문자열이 두 경우 모두 올바르게 작성되고 있는지 확인했지만 후자의 경우 오류가 발생합니다. 나는라는 매개 변수화 된 쿼리를 사용해야한다는 것을 알고 있지만 이것이 내가 배우는 클래스의 학습 과정에서의 단계입니다. 한 번에 하나의 문제 :). 이 문제가 무엇인지에 대한 제안 사항이 있습니까?

+0

귀하의 코드는 [SQL Injection] (http://en.wikipedia.org/wiki/SQL_injection)에 열려 있습니다. – Oded

답변

2
query = 
    "SELECT * FROM tblPersonnel WHERE LastName = '" + 
     strSearch + 
     "'"; 

+0

나는이 롤을 게시하자마자 거의 그것을 발견했다. 고마워. 타이머가 올라 오면 첫 번째 대답을 선택합니다. – Sinaesthetic

2

을 시도해보십시오 검색 조건에 따옴표를 추가

query = "SELECT * FROM tblPersonnel WHERE LastName = '" + strSearch + "'"; 

이상

query = string.Format("SELECT * FROM tblPersonnel WHERE LastName = '{0}'", strSearch); 
+1

@Oded - 이것은 매개 변수화 된 쿼리가 아니며 연결을 사용할 때와 동일한 보안 문제가 있습니다. 유일한 차이점은 약간 더 효율적일 수 있다는 것입니다. string.Format은 행복하게 SQL 삽입을 삽입하게합니다. –

+0

@Mystere Man - 나쁘다. 형식을보고 매개 변수화 된 것으로 가정합니다. – Oded

2

당신은 SQL에서 작은 따옴표로 문자열을 묶어야합니다.

query = "SELECT * FROM tblPersonnel WHERE LastName = '" + strSearch + "'"; 
1

귀하가 귀하의 검색어에 전달한 매개 변수를 인용하고있는 것처럼 보이지 않습니다.

대신

query = "SELECT * FROM tblPersonnel WHERE LastName = " + strSearch + ""; 

의) 올바르게 필터에 포함 된 작은 따옴표를 이스케이프 문 (예를 들어, 아포스트로피)

query = "SELECT * FROM tblPersonnel WHERE LastName = '" + strSearch.Replace("'", "''") + "'"; 

공지 사항에게 여분의 작은 따옴표를 시도하고, 또한 (교체

샘플 코드에 여러 가지 문제점과 보안 취약점이 있음을 반복해야합니다.

관련 문제