【问题标题】:Verification before delete from database从数据库中删除之前的验证
【发布时间】:2013-01-14 20:24:02
【问题描述】:

我有一个示例网站,您可以在其中输入您的电子邮件地址并将其插入 MS SQL 数据库。在下一页上,GridView 显示了数据库中的列表。现在我需要添加一个删除地址的函数,但它必须验证该地址当前是否为

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;
        }
    }
}

【问题讨论】:

  • 第 1 步。阅读SQL Injection
  • 不检查数据库就删除也没关系。如果它不存在它不会抛出错误,如果它存在它将被删除。正如弗莱姆建议研究 EF,并使用它连接到 SQL SERVER,使用这样的字符串进行数据操作可能很危险。
  • 第 2 步。了解原因后,将查询更改为存储过程或 EF。
  • 此外,您的删除命令将删除具有相同电子邮件的每个条目,如果这是您想要的,那很好。但是,如果同一电子邮件可以有多个条目,那么我建议使用唯一 ID,并使用它进行插入/更新/删除。

标签: c# asp.net .net sql-server tsql


【解决方案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;

     }

【讨论】:

    【解决方案2】:

    如果执行删除后可以验证,数据源的Delete方法返回对数据库影响的总行数。 See documentation.

    【讨论】:

    • 所以可能是这样的?尝试 { int value = SqlDataSource1.Delete(); if(value > 0) { Label2.Text += data + "从数据库中删除:" + TextBox1.Text + "
      "; TextBox1.Text = ""; } else { Label2.Text += data + "数据库中不存在邮件} } catch (Exception ex) { Label2.Text += data + ex.Message; }
    • 是的,代码的返回显示了数据库中有多少行受到影响。这种方法效率更高。
    【解决方案3】:

    要回答您的问题,您可以使用以下内容(未经测试):

    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 可以自己运行,它会返回受影响的记录数。

    【讨论】:

      【解决方案4】:

      只需将值放入会话中,并在删除之前使用删除一个检查会话值

      【讨论】:

        【解决方案5】:

        尝试使用存储过程并通过参数传递值。因为您可以轻松检查数据库中是否存在数据。它还可以帮助您防止某些 sql 注入。 :)

        【讨论】:

          猜你喜欢
          • 2016-10-18
          • 1970-01-01
          • 2017-12-14
          • 1970-01-01
          • 1970-01-01
          • 2013-05-14
          • 2021-06-05
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多