C# 在按钮上运行多个SQL命令,然后单击“编辑”
我在这里搜索了如何在上运行多个sql命令,但对我来说还不清楚 我想在按钮1上运行两个SQL查询。第一个是从tehnicke_karakteristike表中删除,其中sifra_proizvoda=@sifraProizvoda;第二个是从proizvod表中删除,其中sifra_proizvoda=@sifraProizvoda。sifra_proizvoda是tehnicke_karakteristike的FK 这是我的密码: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
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代码并不有趣、有趣或有用。