Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 删除按钮SQL数据库Windows窗体应用程序_C#_Mysql_Sql_Visual Studio - Fatal编程技术网

C# 删除按钮SQL数据库Windows窗体应用程序

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

如何修改删除按钮代码以从SQL数据库中删除所选行?当前,当我选择一行并单击“删除”按钮时,所有行都将被删除

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
的值。数据库中可能没有值