C# 删除按钮SQL数据库Windows窗体应用程序
如何修改删除按钮代码以从SQL数据库中删除所选行?当前,当我选择一行并单击“删除”按钮时,所有行都将被删除C# 删除按钮SQL数据库Windows窗体应用程序,c#,mysql,sql,visual-studio,C#,Mysql,Sql,Visual Studio,如何修改删除按钮代码以从SQL数据库中删除所选行?当前,当我选择一行并单击“删除”按钮时,所有行都将被删除 private void delete_button1_Click_1(object sender, EventArgs e) { if (dataGridView1.SelectedRows.Count > 0) { int selectedIndex = dataGridView1.SelectedRows[0].I
private void delete_button1_Click_1(object sender, EventArgs e)
{
if (dataGridView1.SelectedRows.Count > 0)
{
int selectedIndex = dataGridView1.SelectedRows[0].Index;
string sqlquery;
string ConString = ConfigurationManager.ConnectionStrings["ConString"].ConnectionString;
MySqlConnection con = new MySqlConnection(ConString);
con.Open();
int rowID = int.Parse(dataGridView1[0, selectedIndex].Value.ToString());
sqlquery = "DELETE FROM hotel_booking WHERE BookingID = BookingID";
try
{
MySqlCommand command = new MySqlCommand(sqlquery, con);
command.ExecuteNonQuery();
string CmdString = "SELECT * FROM hotel_booking";
MySqlDataAdapter sda = new MySqlDataAdapter(CmdString, con);
DataSet ds = new DataSet();
sda.Fill(ds);
dataGridView1.DataSource = ds.Tables[0].DefaultView;
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
}
不要尝试运行此查询,它将删除您的所有行
DELETE FROM hotel_booking WHERE BookingID = BookingID
BookingID=BookingID
表示它始终为真
我想你是想用
int rowID = int.Parse(dataGridView1[0, selectedIndex].Value.ToString());
sqlquery = "DELETE FROM hotel_booking WHERE BookingID = "+ rowID;
不要尝试运行此查询,它将删除您的所有行
DELETE FROM hotel_booking WHERE BookingID = BookingID
BookingID=BookingID
表示它始终为真
我想你是想用
int rowID = int.Parse(dataGridView1[0, selectedIndex].Value.ToString());
sqlquery = "DELETE FROM hotel_booking WHERE BookingID = "+ rowID;
由于
WHERE
子句中的错误,您当前正在删除所有行:
DELETE FROM hotel_booking WHERE BookingID = BookingID
删除所有行,因为每行中的BookingID
等于BookingID
您希望将rowID
作为标准,因此将其添加为参数:
int rowID = int.Parse(dataGridView1[0, selectedIndex].Value.ToString());
sqlquery = "DELETE FROM hotel_booking WHERE BookingID = @rid";
try
{
MySqlCommand command = new MySqlCommand(sqlquery, con);
command.Parameters.Add("@rid", SqlDbType.Int).Value = rowID;
command.ExecuteNonQuery();
请注意,将用户生成的值直接插入查询(如
“WHERE BookingID=“+rowID…”
)容易受到攻击。尽管对于数字类型,这并不是一个很大的危险,但通常应使用上述参数化查询。由于WHERE
子句中的错误,您当前正在删除所有行:
DELETE FROM hotel_booking WHERE BookingID = BookingID
删除所有行,因为每行中的BookingID
等于BookingID
您希望将rowID
作为标准,因此将其添加为参数:
int rowID = int.Parse(dataGridView1[0, selectedIndex].Value.ToString());
sqlquery = "DELETE FROM hotel_booking WHERE BookingID = @rid";
try
{
MySqlCommand command = new MySqlCommand(sqlquery, con);
command.Parameters.Add("@rid", SqlDbType.Int).Value = rowID;
command.ExecuteNonQuery();
请注意,将用户生成的值直接插入查询(如
“WHERE BookingID=“+rowID…”
)容易受到攻击。虽然对于数字类型,这不是一个很大的危险,但您通常应该使用如上所述的参数化查询。您的问题在于:
sqlquery = "DELETE FROM hotel_booking WHERE BookingID = BookingID"
其中部分始终为真
将其更改为:
sqlquery = "DELETE FROM hotel_booking WHERE BookingID = @BookingID"
try
{
MySqlCommand command = new MySqlCommand(sqlquery, con);
command.Parameters.AddWithValue("@BookingID", rowID);
command.ExecuteNonQuery();
...
你的问题是:
sqlquery = "DELETE FROM hotel_booking WHERE BookingID = BookingID"
其中部分始终为真
将其更改为:
sqlquery = "DELETE FROM hotel_booking WHERE BookingID = @BookingID"
try
{
MySqlCommand command = new MySqlCommand(sqlquery, con);
command.Parameters.AddWithValue("@BookingID", rowID);
command.ExecuteNonQuery();
...
您的问题在这里:
sqlquery=“从酒店预订中删除,其中BookingID=BookingID”
。其中的部分始终为真。如何仅删除所选行?您的问题在这里:sqlquery=“从酒店预订中删除,其中BookingID=BookingID”
。其中part始终为true。如何仅删除所选行?抱歉,这是不可接受的。您必须使用参数化查询来避免Sql注入我认为不可能有Sql注入,因为您解析所选项的索引,并将其保存为整数。数字索引不能用于注入任何查询,是吗?如果我错了,那么我非常抱歉,但请用一些事实来证明我错了@在这种特殊情况下,SQL注入的可能性不大,但我们都必须习惯于总是使用参数化查询。这在与不了解何时可能进行SQL注入的新手打交道时更为重要,因此我们必须教他们在所有情况下使用参数化查询。没问题:),但正如@Pikoh所说,您不应该使用此示例。在这种情况下,使查询看起来像这样是可以的,但在其他情况下,您应该将他的解决方案用于参数化查询。@RossH是的,它可以工作,但要非常小心,您应该使用参数化查询。顺便说一句,在我的回答中有另一个输入错误,这就是为什么它对你不起作用。对不起,这是不可接受的。您必须使用参数化查询来避免Sql注入我认为不可能有Sql注入,因为您解析所选项的索引,并将其保存为整数。数字索引不能用于注入任何查询,是吗?如果我错了,那么我非常抱歉,但请用一些事实来证明我错了@在这种特殊情况下,SQL注入的可能性不大,但我们都必须习惯于总是使用参数化查询。这在与不了解何时可能进行SQL注入的新手打交道时更为重要,因此我们必须教他们在所有情况下使用参数化查询。没问题:),但正如@Pikoh所说,您不应该使用此示例。在这种情况下,使查询看起来像这样是可以的,但在其他情况下,您应该将他的解决方案用于参数化查询。@RossH是的,它可以工作,但要非常小心,您应该使用参数化查询。顺便说一句,在我的回答中还有另一个输入错误,这就是为什么它对你不起作用。它现在说rowId在当前上下文中不存在。对不起,输入错误。它是rowID
,所以应该是command.Parameters.AddWithValue(“@BookingId”,rowID”)代码>,我已经编辑了我的答案,但仍然不起作用,当我单击“删除”时,什么也没有发生。但没有错误。调试代码并检查rowID
的值。可能不是数据库中的值。它现在表示rowId在当前上下文中不存在。抱歉,输入错误。它是rowID
,所以应该是command.Parameters.AddWithValue(“@BookingId”,rowID”)代码>,我已经编辑了我的答案,但仍然不起作用,当我单击“删除”时,什么也没有发生。但没有错误。调试代码并检查rowID
的值。数据库中可能没有值