2011-10-27 2 views
-1

여기에 C# 코드가 있습니다. "행/열에 대한 데이터가 없습니다."라는 메시지가 표시됩니다. 제대로 작동하려면이 코드를 어떻게 향상시킬 수 있습니까?텍스트 입력을 SQL 쿼리와 비교

db = new OleDbConnection(); 
db.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data source=" + fileName; 
db.Open(); 

string sql = "SELECT * FROM GroupNameNS WHERE GroupName = '" + Groupnametxt.Text.Trim() + "'"; 

cmd = new OleDbCommand(sql, db); 
rdr = cmd.ExecuteReader(); 

if (Groupnametxt.Text.Trim() == (string)rdr["GroupName"]) 
{ 
    MessageBox.Show("Group Name taken, please try another name", "Error in Name", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); 
    membernumber1.ReadOnly = true; 
} 
else 
{ 
    sql = "INSERT INTO GroupNameNS VALUES ('" + Groupnametxt.Text.Trim() + "')"; 
    membernumber1.ReadOnly = false; 
    cmd = new OleDbCommand(sql, db); 
    rdr = cmd.ExecuteReader(); 
} 
+0

"... or something like that"? 도움을 받으려면 정확한 오류를주십시오 ... Excel 스프레드 시트를 쿼리하고 있습니까? –

+1

"그런가요?" 사람들이 오류를 도울 수 있기를 원하면 적어도 정확한 오류 메시지를 문서화하는 시간을 가져주십시오. 또한 구글의 SQL 인젝션 공격에 대한 좋은 생각 일 것입니다. –

+0

자세한 정보를 제공해주십시오. "또는 그런 것"은 문제를 추론하는 데 도움이되지 않습니다. 스택 추적이 있습니까? 위의 코드는 현재 SQL 주입 가능성이 매우 높습니다. 쿼리에 SqlParameters를 사용하는 것을 고려해야합니다. 쿼리가 이미 해당 비교 및 ​​필터링을 수행했기 때문에 Groupnametxt가 DataReader의 내용과 같은지 확인하지 않아도됩니다. – chemicalNova

답변

0

결과 집합의 행을 증가 시키려면 Reader 객체에서 .Read()를 호출해야합니다.

rdr.Read(); 

// 읽을 수 있도록 더 레코드 (들)가없는 경우이 false를 반환합니다 참고, 그래서 일반적으로 내부에 사용되며 if 문 또는 while 루프

당신은 당신의 if (Groupnametxt.Text.Trim() == (string)rdr["GroupName"])if(rdr.Read())에 변경 수 이 GroupName 값을 가진 테이블에 적어도 하나의 레코드가 있으면 true를 반환하기 때문입니다.

  if (rdr.Read()) 
      { 
       MessageBox.Show("Group Name taken, please try another name", "Error in Name", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); 
       membernumber1.ReadOnly = true; 
       rdr.Close(); 
      } 
      else 
      { 
       rdr.Close(); 
       sql = "INSERT INTO GroupNameNS VALUES ('" + Groupnametxt.Text.Trim() + "')"; 
       membernumber1.ReadOnly = false; 
       cmd = new OleDbCommand(sql, db); 
       cmd.ExecuteNonQuery(); 
      } 

다른 몇 가지 사항을 수정했습니다. 사용 후 Reader 개체를 닫아야합니다. 그리고 use ExecuteNonQuery() for an INSERT

+0

SQL 인젝션 공격에 취약합니다. 그룹 이름에 SQL 매개 변수를 사용해야합니다. –

0

다음은 몇 가지 추가 변경 사항으로, using 키워드를 올바르게 정리하고 모범 사례로 groupname에 Parameter를 추가하는 것입니다.

using(OleDbConnection db = new OleDbConnection()) 
{ 
    db.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data source=" + fileName; 
    db.Open(); 

    string groupName = groupName.Text.Trim(); 
    string sql = "SELECT * FROM GroupNameNS WHERE GroupName = '@groupname'"; 

    using(OleDbCommand cmd = new OleDbCommand(sql, db)) 
    { 
     cmd.Parameters.AddWithValue("@groupname", groupName); 

     using(OleDbDataReader rdr = cmd.ExecuteReader()) 
     {  
      if (rdr.Read()) 
      { 
       MessageBox.Show("Group Name taken, please try another name", "Error in Name", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); 
       membernumber1.ReadOnly = true; 
      } 
      else 
      { 
       sql = "INSERT INTO GroupNameNS VALUES ('@groupname')"; 
       cmd.CommandText = sql;    
       cmd.ExecuteNonQuery(); 
       membernumber1.ReadOnly = false;   
      } 
     } 
    } 
}