我正在制作一个连接到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;
}
如何从数据库中删除正确的行?
答案 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)