在ASP中使用SQL事务.. NET更新数据

本文关键字:事务 NET 更新 数据 SQL ASP | 更新日期: 2023-09-27 18:16:15

我正在尝试使用SQL事务更新多个表。现在,事务只影响其中一个表(dbo.Colors)。然而,这三种代码几乎是相同的,所以我想知道我在哪里遇到了问题。这两个表之间的关键区别在于,一个表从asp:Textbox (es)获取信息,而另外两个表从下拉列表获取数据。它们都通过一个名为"PlanID"的会话变量相关联。下面是我的代码:

SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["ConversionConnect2"].ConnectionString);
    string query = "UPDATE dbo.Colors SET HeaderBackground = @HeaderBackground, HeaderText = @HeaderText, FooterBackground = @FooterBackground, FooterText = @FooterText,  ButtonText = @ButtonText, ButtonHover = @ButtonHover WHERE PlanID = @PlanID";
    string query2 = "UPDATE dbo.Fonts SET HeaderFont = @HeaderFont, FooterFont = @FooterFont, ButtonFont = @ButtonFont WHERE PlanID = @PlanID";
    string query3 = "UPDATE dbo.Sizes SET HeaderSize = @HeaderSize, FooterSize = @FooterSize, ButtonSize = @ButtonSize WHERE PlanID = @PlanID";
using (conn)
        {
            SqlTransaction trans = null;
            try
            {
                conn.Open();
                trans = conn.BeginTransaction();
                using (SqlCommand transCom = new SqlCommand(query, conn, trans))
                {
                    transCom.Parameters.AddWithValue("@PlanID", Session["planid"].ToString());
                    transCom.Parameters.AddWithValue("@HeaderBackground", txtheadercolor.Text);
                    transCom.Parameters.AddWithValue("@HeaderText", headertext.Text);
                    transCom.Parameters.AddWithValue("@FooterBackground", txtfootercolor.Text);
                    transCom.Parameters.AddWithValue("@FooterText", footertext.Text);
                    transCom.Parameters.AddWithValue("@ButtonText", txtbuttoncolor.Text);
                    transCom.Parameters.AddWithValue("@ButtonHover", txthovercolor.Text);
                    transCom.ExecuteNonQuery();
                }
                using (SqlCommand transCom2 = new SqlCommand(query2, conn, trans))
                {
                    transCom2.Parameters.AddWithValue("@PlanID", Session["planid"].ToString());
                    transCom2.Parameters.AddWithValue("@HeaderFont", headerfont.SelectedValue.ToString());
                    transCom2.Parameters.AddWithValue("@FooterFont", footerfont.SelectedValue.ToString());
                    transCom2.Parameters.AddWithValue("@ButtonFont", ddButtonFont.SelectedValue.ToString());
                    transCom2.ExecuteNonQuery();
                }
                using (SqlCommand transCom3 = new SqlCommand(query3, conn, trans))
                {
                    transCom3.Parameters.AddWithValue("@PlanID", Session["planid"].ToString());
                    transCom3.Parameters.AddWithValue("@HeaderSize", ddheadersize.SelectedValue);
                    transCom3.Parameters.AddWithValue("@FooterSize", ddfootersize.SelectedValue);
                    transCom3.Parameters.AddWithValue("@ButtonSize", ddButtonSize.SelectedValue);
                    transCom3.ExecuteNonQuery();
                }
                trans.Commit();
            }
            catch (Exception Ex)
            {
                if (trans != null)
                {
                    trans.Rollback();
                }
                else
                {
                    return;
                }
            }
            conn.Close();
        }

这段代码运行时没有错误,但是,当我检查dbo。字体和dbo。大小,我看到两个表都没有更新。有什么建议吗?

在ASP中使用SQL事务.. NET更新数据

查看此MSDN示例。

http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlparametercollection.addwithvalue (v = vs.110) . aspx

. addwithvalue将尝试进行类型转换。这可能是你想要的,也可能不是。

关于这个问题有一场很好的辩论。

http://forums.asp.net/t/1200255.aspx

另外,字符串将被转换为nvarchar(),这可能会对DBMS产生性能问题。简而言之,使用. add并在可能的情况下选择数据类型。

找一个简单的例子,比如MSDN,然后先测试一下。然后将其修改为您的特定示例。

没有实际的表定义,更多的时间,等等…我不能给你一个确切的答复。

祝你c#编程好运!

我认为你需要为事务本身再加一个using子句。同样,使用简单示例进行测试,然后展开。

为什么在SqlTransaction中使用using语句?

    /* Code from Stack Overflow Answer */
using (SqlConnection cn = new SqlConnection(ConfigurationManager.AppSettings["T3"])) {
        cn.Open();
        using (SqlTransaction tr = cn.BeginTransaction()) {
            //some code
            tr.Commit();
        }
    }