对于一个项目,我正在构建一个独立的Java应用程序。在某一点上,我想将数据插入到几个数据库表中。这些insert语句都是从一个方法调用的,并且都有自己的Java类,其中包含执行语句的代码。像这样:
DataService1 ds1 = new DataService1();
DataService2 ds2 = new DataService2();
updateDatabase() {
ds1.insertData1(data);
ds2.insertData2(data2);
}
类DataService1
和DataService2
是连接到数据库并执行insert语句的类。
是否可以使此方法(updateDatabase()
)具有事务性?如果表中的一个插入失败,该方法回滚所有其他sql语句?我知道你可以使sql语句成为事务,但insert语句都在不同的类中。
或者我的方法首先是错误的?
谢谢!
答案 0 :(得分:0)
你可以做的就是使用try-catch。让ds1和ds2尝试插入它,如果失败则使用private void button4_Click(object sender, EventArgs e)
{
try
{
using (SqlConnection conn = new SqlConnection("Data Source=(LocalDB)\\MSSQLLocalDB;AttachDbFilename=D:\\VS_project\\WindowsFormsApplication1\\WindowsFormsApplication1\\myInfo.mdf;Integrated Security=True"))
{
conn.Open();
using (SqlCommand command = new SqlCommand("INSERT INTO myInfo(Name,Address,Gender,LangKnownHindi)VALUES(@name, @address,@gender,@lang)", conn))
{
command.Parameters.AddWithValue("@name", textBox1.Text);
command.Parameters.AddWithValue("@address", textBox2.Text);
command.Parameters.AddWithValue("@gender", Gender);
command.Parameters.AddWithValue("@lang", LANG_Hin);
command.ExecuteNonQuery();
}
conn.Close();
MessageBox.Show("Saved SuccessFully!!!!!");
}
}
catch (SqlException ex)
{
MessageBox.Show(ex.Message);
}
}
(你必须创建那个,它只是一个扩展Exception的类。)在{{1}中然后,您可以应用使每个DataService尝试回滚的代码。
答案 1 :(得分:0)
当然可以。您只需要确保在方法开头打开一个事务,将该事务用于您的状态,如果其中一个语句失败,则回滚事务。
Hibernate等ORM系统可以自动为您处理。