我如何检查复制

时间:2016-04-26 17:40:52

标签: c#

private void Add_Box_Click(object sender, EventArgs e)
{
    string phoneNumber;
    if (string.IsNullOrWhiteSpace(Id_Box.Text))// To check if the Id_box is empty or not
    {
        MessageBox.Show("Please Enter Your ID");// need to enter ID in order to save data
    }
    ///////////////////////////////////////////check the Extension Box////////////////////////////////////////////////////////////////////////////////////
    else
    {
        if (string.IsNullOrWhiteSpace(Ext_Box.Text))
        {
            phoneNumber = Phone_Box.Text;// if it is empty then it will only show the phone number
        }
        else
        {

            phoneNumber = Phone_Box.Text + "," + Ext_Box.Text; // show the phone number and the extension if there is something in the extension
        }
        ///////////////////////////////////////////////////////////Save it to the Database///////////////////////////////////////////////////////
        SqlCeCommand cmd = new SqlCeCommand("INSERT INTO Contact_List(Id, Name, Adress1, Adress2, City, Province, Postal_Code, Phone, Email)VALUES('" + Id_Box.Text + "','" + Name_Box.Text + "','" + Adress1_Box.Text + "','" + Adress2_Box.Text + "','" + City_Box.Text + "','" + Province_Box.Text + "','" + Code_Box.Text + "','" + phoneNumber + "','" + Email_Box.Text + "')", con);

        con.Open();
        cmd.ExecuteNonQuery();
        con.Close();
        MessageBox.Show("Information Added", "Confirm");
        /////////////////////////////////////Show new set of data after insert a new data/////////////////////////////////////////////////////////////              
        SqlCeCommand cmd2 = new SqlCeCommand("Select * from Contact_List;", con);
        try
        {
            SqlCeDataAdapter sda = new SqlCeDataAdapter();
            sda.SelectCommand = cmd2;
            DataTable dt = new DataTable();
            sda.Fill(dt);
            BindingSource bs = new BindingSource();
            bs.DataSource = dt;
            dataGridView1.DataSource = bs;
            sda.Update(dt);
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }
        ////////////////////////////////Empty The Box/////////////////////////////////////////////////////////////////////////////////////////////////
        Id_Box.Text = String.Empty;
        Name_Box.Text = String.Empty;
        Adress1_Box.Text = String.Empty;
        Adress2_Box.Text = String.Empty;
        City_Box.Text = String.Empty;
        Province_Box.Text = String.Empty;
        Code_Box.Text = String.Empty;
        Phone_Box.Text = String.Empty;
        Ext_Box.Text = String.Empty;
        Email_Box.Text = String.Empty;
    }

}

此代码将Id,name等存储到数据库中。但是当有相同的Id时,我想删除它。当我删除它时,两个相同的Id都将被删除,我不想这样,所以在将它存储到数据库之前检查重复是否存在?

如果可能,我想做这样的事情:

if ( the values in id column == to the Id_textBox) {
    MessageBox.Show("Duplicate ,PLease enter anotherId")
}

可能的?

2 个答案:

答案 0 :(得分:0)

在执行INSERT SQL语句之前,请尝试运行SQL int ContactCount = (int)cmd.ExecuteScalar("SELECT COUNT(*) FROM CONTACT_LIST WHERE Id = '" + Id_Box.Text + "'")

如果ContactCount > 0,那么你可以删除你的建议。

我是否还可以建议您使用SQL UPDATE而不是DELETEing并插入相同的记录。

另外,阅读SQL注入攻击。构建一个SQL语句,就像您在这里一样,使用用户输入的值会让您暴露于这种类型的漏洞。

答案 1 :(得分:0)

首先,像所有这些答案一样:不要使用字符串连接,而是使用参数化查询来防止SQL注入。

对于你的问题:

你可以做一个

string query = "SELECT count(*) from ContactList Where id = @id";
SqlCeCommand cmd = new SqlCeCommand(query, connection);
cmd.Parameters.Add("@id", SqlDbType.NVarChar, 50).Value = Id_Box.Text;
int count = (int)cmd.ExecuteScalar();

如果count > 0该ID已存在。

或者你可以做一个

string query "IF NOT EXISTS(SELECT count(*) from ContactList Where id = @id) INSERT INTO ContactList(Id, ...) VALUES(@id, ...)";
SqlCeCommand cmd = new SqlCeCommand(query, connection);
cmd.Parameters.Add("@id", SqlDbType.NVarChar, 50).Value = Id_Box.Text;
int count = cmd.ExecuteNonQuery();
然后

count将包含受影响的行数,如果值已存在则为0,如果不存在,则为1,但是新插入。