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

时间:2014-08-04 18:38:53

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

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

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.Fonts和dbo.Sizes时,我发现两个表都没有更新。有什么建议吗?

1 个答案:

答案 0 :(得分:1)

检查此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#编码!

...

我认为你需要另一个使用子句来处理事务本身。再次,用简单的例子进行测试,然后展开。

Why use a using statement with a SqlTransaction?

    /* Code from Stack Overflow Answer */

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