如果下一个表事务失败,如何删除以前的表事务

时间:2015-06-05 13:07:24

标签: c# sql asp.net sql-server transactions

我将一些数据逐个插入表中。我有两张表adjustment_headeradjustment_grid

首先我将数据插入adjustment_header表,然后我将数据插入adjustment_grid表。如果调整插入失败,则应自动删除先前在adjustment_header表中插入的数据。

对这类问题有任何疑问吗?

SqlCommand sqlcmd1 = new SqlCommand("INSERT INTO adjustment_header values('"+TextBox1.Text+"','"+TextBox2.Text+"','"+TextBox3.Text+"','"+TextBox4.Text+"')",conn);
conn.Open();
sqlcmd1.ExecuteNonQuery();
conn.Close();
//adjustment grid row 1
if (itemno1.SelectedItem.Text != "please select")
{
    SqlCommand cmd1 = new SqlCommand("INSERT INTO adjustment_grid values('"+TextBox1.Text+"','" + itemno1.SelectedItem.Text + "','" + adj1.SelectedItem.Text + "','" + store1.SelectedItem.Text + "','" + qty1.Text + "','" + cost1.Text + "')", conn);
    conn.Open();
    cmd1.ExecuteNonQuery();
    conn.Close();
}
//adjustment grid row 2
if (itemno2.SelectedItem.Text != "please select")
{
    SqlCommand cmd2 = new SqlCommand("INSERT INTO adjustment_grid values('" + TextBox1.Text + "','" + itemno2.SelectedItem.Text + "','" + adj2.SelectedItem.Text + "','" + store2.SelectedItem.Text + "','" + qty2.Text + "','" + cost2.Text + "')", conn);
    conn.Open();
    cmd2.ExecuteNonQuery();
    conn.Close();
}
//adjustment grid row 3
if (itemno3.SelectedItem.Text != "please select")
{
    SqlCommand cmd3 = new SqlCommand("INSERT INTO adjustment_grid values('" + TextBox1.Text + "','" + itemno3.SelectedItem.Text + "','" + adj3.SelectedItem.Text + "','" + store3.SelectedItem.Text + "','" + qty3.Text + "','" + cost3.Text + "')", conn);
    conn.Open();
    cmd3.ExecuteNonQuery();
    conn.Close();
}

在此代码中首先我将数据插入adjustment_header表,然后我在adjustment_grid表中插入3次,在adjustment_grid表中的3个事务中一个失败以前插入的数据应该自动删除。

1 个答案:

答案 0 :(得分:3)

将整个块包裹在SqlTransaction中,并且不要为每个语句打开/关闭连接:

conn.Open();
using(SqlTransaction tran = conn.BeginTransaction("Adjustment"))
{
    SqlCommand sqlcmd1 = new SqlCommand("INSERT INTO adjustment_header values('"+TextBox1.Text+"','"+TextBox2.Text+"','"+TextBox3.Text+"','"+TextBox4.Text+"')",conn, tran);
    sqlcmd1.ExecuteNonQuery();

    //adjustment grid row 1
    if (itemno1.SelectedItem.Text != "please select")
    {
        SqlCommand cmd1 = new SqlCommand("INSERT INTO adjustment_grid values('"+TextBox1.Text+"','" + itemno1.SelectedItem.Text + "','" + adj1.SelectedItem.Text + "','" + store1.SelectedItem.Text + "','" + qty1.Text + "','" + cost1.Text + "')", conn, tran);
        cmd1.ExecuteNonQuery();
    }
    //adjustment grid row 2
    if (itemno2.SelectedItem.Text != "please select")
    {
        SqlCommand cmd2 = new SqlCommand("INSERT INTO adjustment_grid values('" + TextBox1.Text + "','" + itemno2.SelectedItem.Text + "','" + adj2.SelectedItem.Text + "','" + store2.SelectedItem.Text + "','" + qty2.Text + "','" + cost2.Text + "')", conn, tran);
        cmd2.ExecuteNonQuery();
    }
    //adjustment grid row 3
    if (itemno3.SelectedItem.Text != "please select")
    {
        SqlCommand cmd3 = new SqlCommand("INSERT INTO adjustment_grid values('" + TextBox1.Text + "','" + itemno3.SelectedItem.Text + "','" + adj3.SelectedItem.Text + "','" + store3.SelectedItem.Text + "','" + qty3.Text + "','" + cost3.Text + "')", conn, tran);
        cmd3.ExecuteNonQuery();
    }
    tran.Commit();
}

您还应该使用参数而不是字符串连接,但这是一个单独的问题......

我也不会直接引用您的控件。将此类逻辑放在具有各种选项参数的函数中的单独类中。这样,您可以将其与UI分离,并在必要时重新使用它。