在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。大小,我看到两个表都没有更新。有什么建议吗?
查看此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();
}
}