【问题标题】:Run multiple SQL Commands on button click EDIT SOLVED在按钮上运行多个 SQL 命令单击编辑已解决
【发布时间】:2020-10-02 19:35:14
【问题描述】:

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

我想在 button1_click 上运行两个 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();
        }

    }

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

【问题讨论】:

  • 一些建议:看看“Dapper”。自己编写 ADO.NET 代码并不有趣、有趣或有用。

标签: c# sql


【解决方案1】:

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

另外,如果您像这样运行这两个命令,将它们包装在事务中可能是个好主意

【讨论】:

  • 我在 komanda 和 komanda1 之后添加了该命令行,我收到此错误: System.InvalidOperationException: 'ExecuteNonQuery 需要一个打开且可用的连接。连接的当前状态为关闭。'
  • 认为您需要致电connection.Open()
  • @BeginnerCoding 是在 try 段内执行的 komanda1 吗?
  • @Lucas 不,不是
  • @BeginnerCoding 那么它应该是。您正在关闭在 try 段之后执行的 finally 段内的连接,您希望在关闭连接之前运行这两个命令
【解决方案2】:

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

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

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 对象 - 您已经这样做了。然后每个都必须执行一次。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多