2014-04-28 4 views
0

로 입력하십시오.복제본을 확인하여이 코드를 입력하여

private void button1_Click(object sender, EventArgs e) 
{ 
    string Coonstring = "datasource=localhost;port=3306;username=root;password=****;Charset=utf8"; 
    string cmd = "Insert into project.name_registry (name) values('" + this.txt.Text + "');"; 
    MySqlConnection connectionDatabase = new MySqlConnection(Coonstring); 
    MySqlCommand cmddata = new MySqlCommand(cmd, connectionDatabase); 
    MySqlDataReader myreader; 

    try 
    { 
     connectionDatabase.Open(); 
     myreader = cmddata.ExecuteReader(); 
     MessageBox.Show("Done"); 
     while (myreader.Read()) 
     { 
     } 
    } 
    catch (Exception ex) 
    { 
     MessageBox.Show(ex.Message); 
    } 
} 

나는이 버튼 체크에 눌러 삽입 이름을 메시지 박스 내 이름이 존재 말해 추가를 방지 표시가 발견되면 때 필요합니다. 삽입 완료라고하지 않으면. 어떻게 할 수 있니? 이전에 언급 한 바와 같이

감사합니다 첫째

+4

** 경고 ** 귀하의 코드는 SQL 주입 공격에 매우 취약합니다. –

+1

두 번째로, EntityFramework에 대해 들어 봤습니까? 모든 질문을 해결할 것입니다. :) –

+1

'name = regime에서 count (*)를 선택하십시오. [name] = 'TheName'' 그리고 위에서 언급 한 것처럼 SQL 주입을 감시하십시오. –

답변

-1

: 당신은 눈에 보이는 주요 SQL 주입이 ... 둘째

, 당신은 PARAMS를 사용한다.

셋째, 당신

SELECT * 
FROM [TABLE] 
WHERE [ColumnName] = @Param 
1

가장 좋은 곳은 체크 이런 종류의를 가질 경우, 데이터베이스 자체에있다. 거의 모든 데이터베이스는 필드에 UNIQUE 제약 조건을 설정할 수 있습니다. name_registryname 열을 고유하게 설정하면 DBMS에서 동일한 이름의 두 번째 항목을 추가 할 수 없으며 예외가 발생합니다. 이것은 보통 가장 좋은 방법입니다.

DB가 손에 없는데 열을 고유하게 설정할 수없는 경우 @FrancisDucharme 및 다른 사람의 제안을 사용하고 DB에 특정 이름을 쿼리하고 INSERT 당신이 싱글을 반환하는, ExecuteScalar를 호출해야합니다 -이없는이 단일 결과 SELECT 문, ExecuteReader를 호출 할 필요가 없습니다,도 위의 INSERT 문에 대한 것을 불구하고,

SELECT COUNT(*) FROM name_registry WHERE [name] = 'TheName' 

주 : 0 결과를 반환 당신이 정말로 필요하지 않은 본격적인 DataReader을 로딩하지 않고도 가치있는 결과를 얻을 수 있습니다.

마지막으로 대답에 덧붙여서 양심이 없어서 ADO.NET에서 매개 변수화 된 쿼리를 사용하는 것에 대해 적어도 one tutorial의 방향으로 향하지 않고 계속 진행할 수 있습니다. 이는 SQL을 막는 데 도움이되지 않습니다. 주입 공격뿐만 아니라 코드를 정리하고 더 읽기 쉽게 만들어줍니다. 거기에 많은 사람들이 있습니다.

관련 문제