C# 在按钮上运行多个SQL命令,然后单击“编辑”

C# 在按钮上运行多个SQL命令,然后单击“编辑”,c#,sql,C#,Sql,我在这里搜索了如何在上运行多个sql命令,但对我来说还不清楚 我想在按钮1上运行两个SQL查询。第一个是从tehnicke_karakteristike表中删除,其中sifra_proizvoda=@sifraProizvoda;第二个是从proizvod表中删除,其中sifra_proizvoda=@sifraProizvoda。sifra_proizvoda是tehnicke_karakteristike的FK 这是我的密码: private void button1_Cli

我在这里搜索了如何在上运行多个sql命令,但对我来说还不清楚

我想在按钮1上运行两个SQL查询。第一个是从tehnicke_karakteristike表中删除,其中sifra_proizvoda=@sifraProizvoda;第二个是从proizvod表中删除,其中sifra_proizvoda=@sifraProizvoda。sifra_proizvoda是tehnicke_karakteristike的FK

这是我的密码:

        private void button1_Click(object sender, EventArgs e)
    {
       konekcija = new SqlConnection(Konekcija.konString);

        SqlCommand komanda = new SqlCommand("DELETE FROM tehnicke_karakteristike WHERE sifra_proizvoda = @sifra_proizvoda", konekcija);
        SqlParameter sifraParam = new SqlParameter("@sifra_proizvoda", SqlDbType.Int);

        SqlCommand komanda1 = new SqlCommand("DELETE FROM proizvod WHERE sifra_proizvoda = @sifra_proizvoda", konekcija);
        SqlParameter sifraParam1 = new SqlParameter("@sifra_proizvoda", SqlDbType.Int);

        komanda.Parameters.Add(sifraParam);
        komanda1.Parameters.Add(sifraParam1);

        sifraParam.Value = tbSifra.Text;
        sifraParam1.Value = tbSifra.Text;
        try
        {
            konekcija.Open();
            komanda.ExecuteNonQuery();
            komanda1.ExecuteNonQuery();
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);

        }
        finally
        {
            konekcija.Close();
        }

    }

当我运行此命令时,只有第一个命令通过。

komanda.ExecuteNonQuery()
之后缺少
komanda.ExecuteNonQuery()
,这就是为什么只有
komanda
执行,而
komanda1
不执行


另外,如果您像这样运行这两个命令,那么最好将它们包装到事务中,因为在
komanda.ExecuteNonQuery()
之后缺少
komanda.ExecuteNonQuery()
,这就是为什么只有
komanda
被执行,而
komanda
没有执行的原因

另外,如果您像这样运行这两个命令,那么最好将它们包装在一个事务中

当我运行此命令时,只有第一个命令通过

这是合乎逻辑的:您只执行一次查询:

komanda.ExecuteNonQuery();
因此,最新的任务占了上风

您有两个查询,但有一个共享参数,因此您可以通过更改SQL来重用查询。如果您有一个实例化的
SqlCommand
,并设置了连接属性和参数,则可以更改
CommandText
属性,并对该
SqlCommand
运行不同的查询。 未测试,但我会尝试以下方法:

    SqlCommand komanda = new SqlCommand("DELETE FROM tehnicke_karakteristike WHERE sifra_proizvoda = @sifra_proizvoda", konekcija);
    SqlParameter sifraParam = new SqlParameter("@sifra_proizvoda", SqlDbType.Int);
    komanda.Parameters.Add(sifraParam);
    sifraParam.Value = tbSifra.Text;

    // execute the 1st statement
    komanda.ExecuteNonQuery();

    // reuse the command
    komanda1.CommandText = "DELETE FROM proizvod WHERE sifra_proizvoda = @sifra_proizvoda"
    // execute the 2nd statement
    komanda.ExecuteNonQuery();
这使得代码更加紧凑,但是您可以完美地定义两个不同的
SqlCommand
对象,您已经这样做了。然后每一个都必须执行一次

当我运行此命令时,只有第一个命令通过

这是合乎逻辑的:您只执行一次查询:

komanda.ExecuteNonQuery();
因此,最新的任务占了上风

您有两个查询,但有一个共享参数,因此您可以通过更改SQL来重用查询。如果您有一个实例化的
SqlCommand
,并设置了连接属性和参数,则可以更改
CommandText
属性,并对该
SqlCommand
运行不同的查询。 未测试,但我会尝试以下方法:

    SqlCommand komanda = new SqlCommand("DELETE FROM tehnicke_karakteristike WHERE sifra_proizvoda = @sifra_proizvoda", konekcija);
    SqlParameter sifraParam = new SqlParameter("@sifra_proizvoda", SqlDbType.Int);
    komanda.Parameters.Add(sifraParam);
    sifraParam.Value = tbSifra.Text;

    // execute the 1st statement
    komanda.ExecuteNonQuery();

    // reuse the command
    komanda1.CommandText = "DELETE FROM proizvod WHERE sifra_proizvoda = @sifra_proizvoda"
    // execute the 2nd statement
    komanda.ExecuteNonQuery();

这使得代码更加紧凑,但是您可以完美地定义两个不同的
SqlCommand
对象,您已经这样做了。然后每个命令都必须执行一次。

我在komanda和komanda1之后添加了该命令行,得到以下错误:System.InvalidOperationException:“ExecuteOnQuery需要一个打开且可用的连接。连接的当前状态为关闭。'我想您需要调用
连接.Open()
@初学者编码是在try段内执行的komanda1吗?@Lucas否是not@BeginnerCoding那就应该是。您正在关闭在try段之后执行的finally段内的连接,您希望在关闭连接之前运行这两个命令。我在komanda和komanda1之后添加该命令行,我得到以下错误:System.InvalidOperationException:'ExecuteOnQuery需要一个打开且可用的连接。连接的当前状态为关闭。'我想您需要调用
连接.Open()
@初学者编码是在try段内执行的komanda1吗?@Lucas否是not@BeginnerCoding那就应该是。如果要在try段之后执行的finally段中关闭连接,则要在关闭连接之前运行这两个命令一些建议:查看“Dapper”。自己编写ADO.NET代码不是一件有趣、有趣或有用的事情。自己编写ADO.NET代码并不有趣、有趣或有用。