【问题标题】:SQL Transaction with Parameters带参数的 SQL 事务
【发布时间】:2012-10-15 07:55:10
【问题描述】:

我正在使用 SQL 事务语句来执行存储过程。传统上,我会使用命令参数将不同的变量插入到命令中。

当我尝试对事务使用相同的方法时,该过程不会插入到数据库中,尽管事务可以正常工作。

这是我的尝试:

SqlConnection db = DataConn.SqlConnection();

    db.Open();
    SqlTransaction transaction = db.BeginTransaction();

    try
    {
        const string strSql = "procSiteAddMember @uID, @userName, @password, @nickname, @email, @siteAddress";

        var sqlComm = new SqlCommand(strSql, db, transaction) {CommandType = CommandType.Text};

        sqlComm.Parameters.Add(new SqlParameter("@uID", SqlDbType.VarChar, 255)).Value = uID;
        sqlComm.Parameters.Add(new SqlParameter("@userName", SqlDbType.VarChar, 20)).Value =
            txtRegisterUsername.Text.Trim();
        sqlComm.Parameters.Add(new SqlParameter("@password", SqlDbType.VarChar, 20)).Value =
            txtRegisterPassword.Text;
        sqlComm.Parameters.Add(new SqlParameter("@nickname", SqlDbType.VarChar, 20)).Value =
            txtRegisterNickname.Text.Trim();
        sqlComm.Parameters.Add(new SqlParameter("@email", SqlDbType.VarChar, 20)).Value = txtRegisterEmail.Text.Trim();
        sqlComm.Parameters.Add(new SqlParameter("@siteAddress", SqlDbType.VarChar, 20)).Value = lblNickname.Text.Trim();

        //sqlComm.ExecuteNonQuery();
        //DataConn.Disconnect();

        transaction.Commit();

        Response.Redirect("~/Member/" + txtRegisterNickname.Text);
    }
    catch (Exception ent)
    {
        Response.Write("Error: " + ent.Message);
    }

我看到This post - 但它似乎很长,有很多变数。

【问题讨论】:

  • 必须必须调用三个sqlComm.ExecuteNonQuery();ExecuteScalar()ExecuteReader()方法之一。
  • 哦哇...好吧,对于其他徘徊的人。该代码确实有效,只需取消注释 sqlComm.ExecuteNonQuery(); @AVD:将您的回复作为答案发布:)
  • DataConn.SqlConnection() 每次都返回一个 new 连接,在这种情况下,您可能正在泄漏连接,因为它不在 using 中,或者它返回一个 single 连接,这对于 asp.net 应用程序来说性能不佳。
  • 您应该必须在 finally 块中使用 commit 交易,在 catch 块中使用 rollback() 交易方法或使用 using 块。
  • @AVD,DataConn.Connect 只返回一个打开的 SQLConnection - 将提交放在 finally 块中。

标签: c# asp.net sql sqltransaction


【解决方案1】:

您已经解决了这个问题,但由于没有人回答,我会这样做以供将来参考。

您仍然需要执行查询,因此请取消注释您的行 sqlComm.ExecuteNonQuery();

另外不要忘记在你的 catch 块中添加 transaction.Rollback();,你必须把它放在另一个 try-catch 块中,以防回滚抛出异常。

例子:

try
{
    ...
    transaction.Commit();

}
catch (Exception ex)
{
    try
    {
        ...
        transaction.Rollback();
    }
    catch (Exception ex2)
    {
        ...
    }
}

欲了解更多信息,请访问:https://msdn.microsoft.com/en-us/library/86773566(v=vs.110).aspx

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-11
    • 1970-01-01
    相关资源
    最近更新 更多