我正在尝试使用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时,我发现两个表都没有更新。有什么建议吗?
答案 0 :(得分:1)
检查此MSDN示例。
.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();
}
}