删除SQL行并更改Id

时间:2016-07-18 20:36:26

标签: c# mysql

我正在制作一个连接到SQL数据库的C#工具来管理我创建的另一个程序的用户。我在ListBox中显示用户,我可以添加/删除用户。删除一些配置文件后,事情变得奇怪了,我认为这可能与我如何从数据库中删除行有关。我使用的ID会随着每个新用户的创建而自动增加。这是我从数据库中删除的代码:

using (conn = new SqlConnection(connectionString))
using (SqlCommand command = new SqlCommand("DELETE FROM myDatabase WHERE Id = '" + (listBox1.SelectedIndex + 1) + "'", conn))
{
    conn.Open();
    command.ExecuteNonQuery();
}

这就是我将用户加载到我的列表框中的方式:

using (conn = new SqlConnection(connectionString))
using (SqlDataAdapter sqlAdapt = new SqlDataAdapter("SELECT * FROM myDatabase", conn))
{
    DataTable dataTable = new DataTable();
    sqlAdapt.Fill(dataTable);
    listBox1.DisplayMember = "Name";
    listBox1.ValueMember = "Id";
    listBox1.DataSource = dataTable;
}

如何从数据库中删除正确的行?

2 个答案:

答案 0 :(得分:3)

您应该使用属性SelectedValue来查找您的ID而不是SelectedIndex

if(listBox1.SelectedValue != null)
{
    int userID = Convert.ToInt32(listBox1.SelectedValue);
    using (conn = new SqlConnection(connectionString))
    using (SqlCommand command = new SqlCommand("DELETE FROM myDatabase WHERE Id = @uid", conn))
    {

        conn.Open();
        command.Parameters.Add("@uid", MySqlDbType.Int32).Value = userID;
        command.ExecuteNonQuery();
    }
}

SelectedIndex的问题是该值从0变为列表框中的最大项目数。此值与您的数据库自动计算的用户ID无关。 (仅删除一次后,添加这些值就不同步了)

另请注意,永远不应使用字符串连接构建sql文本。这是一个众所周知的安全问题,名为Sql Injection

答案 1 :(得分:-1)

"DELETE FROM myDatabase WHERE Id = '" + (listBox1.SelectedIndex + 1) + "'"

我不确定mySQL,但看起来你传递的是字符串而不是int。 当您将参数作为数字传递时,您应该删除" ' &#34 ;. 所以,它看起来像:

"DELETE FROM myDatabase WHERE Id = " + (listBox1.SelectedValue)