2013-01-14 5 views
0

전자 메일 주소를 입력하는 샘플 웹 사이트가 있으며 MS SQL 데이터베이스에 삽입됩니다. 다음 페이지에서 GridView는 데이터베이스의 목록을 표시합니다. 이제 데이터베이스에 affecteds 나는 주소를 삭제하는 기능을 추가 할 필요가 있지만, 후 확인 실행, 삭제 방법은 행의 데이터 소스 반환 전체의 삭제를 할 수있는 경우는 주소가 현재데이터베이스에서 삭제하기 전에 확인

public partial class Default : Page 
{ 
    protected void Page_Load(object sender, EventArgs e) 
    { 
     Label1.Text = GetLastWriteTime(Request.PhysicalPath).ToString(); 
    } 

    protected void Button1_Click(object sender, EventArgs e) 
    { 
     string data = DateTime.Now.ToLongDateString() + "," + DateTime.Now.ToLongTimeString() + ": "; 

     SqlDataSource1.InsertCommand = "INSERT INTO ListaAdresow (Email) Values('" + TextBox1.Text + "')"; 

     try 
     { 
      SqlDataSource1.Insert(); 
      Label2.Text += data + "added into database: " + TextBox1.Text + "<br/>"; 
      TextBox1.Text = ""; 
     } 
     catch (Exception ex) 
     { 
      Label2.Text += data + ex.Message; 
     } 
    } 
    protected void Button2_Click(object sender, EventArgs e) 
    { 
     string data = DateTime.Now.ToLongDateString() + "," + DateTime.Now.ToLongTimeString() + ": "; 
     SqlDataSource1.DeleteCommand = "DELETE FROM ListaAdresow WHERE Email='" + TextBox1.Text + "'"; 

     SqlDataSource1.SelectCommand = "SELECT FROM [ListaAdresow] WHERE Email=" + TextBox1.Text; 

     try 
     { 
       SqlDataSource1.Delete(); 

       Label2.Text += data + "removed from database: " + TextBox1.Text + "<br/>"; 
       TextBox1.Text = ""; 

     } 
     catch (Exception ex) 
     { 
      Label2.Text += data + ex.Message; 
     } 
    } 
} 
+8

1 단계. [SQL Injection] (http://en.wikipedia.org/wiki/SQL_injection)을 읽으십시오. –

+1

데이터베이스를 확인하지 않고 삭제하면 ok입니다. 그것은 존재하지 않는 경우 오류를 던지지 않을 것이며, 존재한다면 삭제 될 것입니다. 플레임 (flem)이 연구 EF를 제안하고 이것을 사용하는 SQL SERVER에 연결하기 때문에 데이터 조작을 위해 이와 같은 문자열을 사용하면 위험 할 수 있습니다. – sprocket12

+1

2 단계. 이유를 이해했으면 쿼리를 저장 프로 시저 또는 EF로 변경합니다. –

답변

0

경우 확인해야 . See documentation.

+0

이렇게 될 수 있을까요? 시도해보십시오 { int value = SqlDataSource1.Delete(); \t \t \t 경우 (값> 0) { \t \t Label2.Text + = + 데이터 "데이터베이스에서 삭제 :"+ \t TextBox1.Text + "
"; \t \t TextBox1.Text = ""; \t \t \t} 다른 \t \t \t \t Label2.Text + = 데이터 + "메일 데이터베이스 \t \t \t} \t} 캐치 (예외 예) 에 존재하지 않는 \t \t \t { \t \t \t { \t Label2.Text + = data + ex.Message; } – Cragmorton

+0

예, 코드 반환은 데이터베이스에서 영향을받은 행 수를 표시합니다. 이것은 더 효율적인 방법입니다. – hesenger

0

귀하의 질문에 대답하기 위해, 당신은 이런 식으로 뭔가 (테스트되지 않은)를 사용할 수 있습니다 :

SqlDataAdapter da = new SqlDataAdapter(); 
    DataTable dt = new DataTable(); 

    // Create the SelectCommand using paramaterized queries 
     SqlCommand command = new SqlCommand("SELECT * 
              FROM ListaAdresow 
              WHERE Email = @Email", connection); 
    command.Parameters.Add("@Email", SqlDbType.VarChar, 40, TextBox1.Text); 

    da.SelectCommand = command; 
    da.Fill(dt); 

    if (dt.Rows.Count > 0) 
    { 
     //Row Exists 
    } 
    else 
    { 
     //Row Does Not Exist 
    } 

는 그러나, 나는 다른 사람의 DeleteCommand 자체적으로 실행할 수 있습니다 말한 반복을 그리고 영향의 수를 반환합니다 기록.

1

나는 강하게 당신이 모든 쿼리뿐만 예를 위해서 저장 프로 시저를 만들 제안 기능은 다음과 같이 뭔가 할 수 귀하의 gridview에서 :

if (myGrid.SelectedRows.Count > 0) 
{ 
    int selectedIndex = myGrid.SelectedRows[0].Index; 

    // gets the RowID from the first column in the grid 
    int rowID = int.Parse(BooksGrid[0, selectedIndex].Value.ToString()); 

    string sql = "IF EXISTS(SELECT COLUMN FROM Table1 WHERE ID = @rowID) 
        BEGIN 
         DELETE FROM TABLE1 WHERE ID = @rowID" 
        END; 

    } 
0

그냥 세션에서 값을 넣고 세션 값을 확인 삭제하기 전에 삭제하십시오.

0

저장 프로 시저를 사용하고 매개 변수와 함께 값을 전달하십시오. 당신은 데이터가 데이터베이스에 존재하는지 여부를 쉽게 확인할 수 있습니다. 또한 SQL 인젝션을 막는 데 도움이됩니다. :)

관련 문제