【问题标题】:Why is my update statement not updating the table?为什么我的更新语句没有更新表?
【发布时间】:2012-03-19 18:08:43
【问题描述】:

它编译,它似乎运行,但记录没有改变。

这是我的代码:

private void UpdateRecord(string ATicketID, string ATicketSource, string AContactsEmail, string AAboutSomeID, string ACategoryID)
{
    try
    {
        con = new OracleConnection(oradb);
        con.Open();

        String query = "UPDATE ABC.CONCERTTICKETS SET TICKETSOURCE = :p_TICKETSOURCE, ABOUTSOMEID = :p_ABOUTSOMEID, CATEGORYID = :p_CATEGORYID, CONTACTEMAIL = :p_CONTACTEMAIL WHERE TICKETID = :p_TICKETID";

        cmd = new OracleCommand(query, con);
        cmd.CommandType = CommandType.Text;

        OracleParameter p_TICKETID =
            new OracleParameter("p_TICKETID", OracleDbType.NVarchar2, ParameterDirection.Input);
        p_TICKETID.Size = 20;
        p_TICKETID.Value = ATicketID;
        cmd.Parameters.Add(p_TICKETID);

        OracleParameter p_TICKETSOURCE =
            new OracleParameter("p_TICKETSOURCE", OracleDbType.NVarchar2, ParameterDirection.Input);
        p_TICKETSOURCE.Size = 20;
        p_TICKETSOURCE.Value = ATicketSource;
        cmd.Parameters.Add(p_TICKETSOURCE);

        OracleParameter p_ABOUTSOMEID =
            new OracleParameter("p_ABOUTSOMEID", OracleDbType.Int32, ParameterDirection.Input);
        p_ABOUTSOMEID.Value = AAboutSOMEID;
        cmd.Parameters.Add(p_ABOUTSOMEID);

        OracleParameter p_CATEGORYID =
            new OracleParameter("p_CATEGORYID", OracleDbType.Int32, ParameterDirection.Input);
        p_CATEGORYID.Value = ACategoryID;
        cmd.Parameters.Add(p_CATEGORYID);

        OracleParameter p_CONTACTEMAIL =
            new OracleParameter("p_CONTACTEMAIL", OracleDbType.NVarchar2, ParameterDirection.Input);
        p_CONTACTEMAIL.Size = 100;
        p_CONTACTEMAIL.Value = AContactsEmail;
        cmd.Parameters.Add(p_CONTACTEMAIL);

        try
        {
            try
            {
                ot = con.BeginTransaction();
                cmd.Transaction = ot;
                cmd.ExecuteNonQuery();
                ot.Commit();
            }
            catch (Exception)
            {
                ot.Rollback();
            }
        }
        catch (OracleException ex)
        {
            MessageBox.Show(ex.Message);
        }
        MessageBox.Show("Apparent success");
    }
    finally
    {
        con.Close();
        con.Dispose();
    }

    dataGridView1.Refresh();
}

========= 更新:

所以你的意思是这样,我接受:

try
                {
                    using (var transaction = con.BeginTransaction())
                {
                    cmd.Transaction = transaction;
                    cmd.ExecuteNonQuery();
                    transaction.Commit();
                } 
                }                
                catch (Exception ex)
                {
                    ot.Rollback();
                    throw;
                }
                MessageBox.Show("Apparent success");

============ 再次更新(此代码有效):

private void UpdateRecord(string ATicketID, string ATicketSource, string AContactsEmail, string AAboutSomeID, string ACategoryID)
{
    try
    {
        con = new OracleConnection(oradb);
        con.Open();

        String update = @"UPDATE ABC.CONCERTTICKETS 
                          SET TICKETSOURCE = :p_TICKETSOURCE, 
                          ABOUTSOMEID = :p_ABOUTSOMEID, 
                          CATEGORYID = :p_CATEGORYID, 
                          CONTACTEMAIL = :p_CONTACTEMAIL 
                          WHERE TICKETID = :p_TICKETID";

        cmd = new OracleCommand(update, con);
        cmd.CommandType = CommandType.Text;

        // TICKETSOURCE, ABOUTLLSID, CATEGORYID, CONTACTEMAIL, TICKETID
        OracleParameter p_TICKETSOURCE =
            new OracleParameter("p_TICKETSOURCE", OracleDbType.NVarchar2, ParameterDirection.Input);
        p_TICKETSOURCE.Size = 20;
        p_TICKETSOURCE.Value = ATicketSource;
        cmd.Parameters.Add(p_TICKETSOURCE);

        OracleParameter p_ABOUTSOMEID =
            new OracleParameter("p_ABOUTSOMEID", OracleDbType.Int32, ParameterDirection.Input);
        p_ABOUTSOMEID.Value = AAboutSOMEID;
        cmd.Parameters.Add(p_ABOUTSOMEID);

        OracleParameter p_CATEGORYID =
            new OracleParameter("p_CATEGORYID", OracleDbType.Int32, ParameterDirection.Input);
        p_CATEGORYID.Value = ACategoryID;
        cmd.Parameters.Add(p_CATEGORYID);

        OracleParameter p_CONTACTEMAIL =
            new OracleParameter("p_CONTACTEMAIL", OracleDbType.NVarchar2, ParameterDirection.Input);
        p_CONTACTEMAIL.Size = 100;
        p_CONTACTEMAIL.Value = AContactsEmail;
        cmd.Parameters.Add(p_CONTACTEMAIL);

        OracleParameter p_TICKETID =
            new OracleParameter("p_TICKETID", OracleDbType.NVarchar2, ParameterDirection.Input);
        p_TICKETID.Size = 20;
        p_TICKETID.Value = ATicketID;
        cmd.Parameters.Add(p_TICKETID);

        using (var transaction = con.BeginTransaction())
        {
            try
            {
                cmd.Transaction = transaction;
                cmd.ExecuteNonQuery();
                transaction.Commit();
            }
            catch (Exception ex)
            {
                transaction.Rollback();
                throw;
            }
        }

        MessageBox.Show("Apparent success");
    }
    finally
    {
        con.Close();
        con.Dispose();
    }
    Popul8TheGrid();
}

【问题讨论】:

  • 你的外部 try 块没用。你在内心的尝试中遇到了异常。
  • 它可能正在回滚,但你没有做任何事情,catch 块中出现异常,所以你永远不会知道它。
  • 我移除了外部的 try 块;我通过了它,但没有达到回滚。它执行、提交并显示“成功”消息,但表不受影响。

标签: c# .net oracle sql-update


【解决方案1】:

您的 try/catch 块已完全损坏。

你必须先解决这个问题,然后你才能看到真正的错误是什么。

try
{
    ot = con.BeginTransaction();
    cmd.Transaction = ot;
    cmd.ExecuteNonQuery();
    ot.Commit();
    MessageBox.Show("Success"); // <-- this should be here, not after the catch!
}
catch (Exception)
{
    ot.Rollback();
    throw;   // <-- this is important otherwise the exception is swallowed!
}

【讨论】:

  • 谢谢你;我更改了代码以添加“投掷”;但是,没有达到回滚。
【解决方案2】:

我注意到您确实无法区分是否引发了异常和事务是否回滚或事务是否成功。看,您正在捕获异常,回滚事务,然后仍然显示消息框“明显成功”。因为您正在吞下异常并失败。 people scream from the top of rooftops to not swallow exceptions是有原因的。

所以,我怀疑抛出了一个异常,你正在捕捉它,回滚,然后因为你失败并显示消息框而感到困惑。这是写得不好的代码,写得不好的代码会引入这样的错误。

如果我是你,我至少会重新抛出异常。

catch (Exception) {
    ot.Rollback();
    throw;
}

但更好的是,只需将事务的使用包装在 using 块中

using(var transaction = con.BeginTransaction()) {
    cmd.Transaction = transaction;
    cmd.ExecuteNonQuery();
    transaction.Commit();
}

为什么我的更新语句没有更新表?

您的代码中有错误。这些陈述之一

ot = con.BeginTransaction();
cmd.Transaction = ot;
cmd.ExecuteNonQuery();
ot.Commit();

正在抛出异常,但您不知道它,因为您正在吞噬所有异常。停止吞下异常,你会发现这些行中的哪一行抛出了异常以及为什么。然后,您将获得更多信息来调试您的潜在问题。

【讨论】:

  • 不,单步执行,它运行良好,永远不会到达 catch 块。
  • 我更新了我的帖子,我认为你推荐的 BeginTransaction..Commit 块。
  • 不,我不是这个意思。丢外层try/catch
  • 我确实删除了外部 try/catch,以响应 c0deNinja。
  • 好的,现在可以使用了。我不知道是重新排列参数以使它们与 SQL 语句的顺序相同,还是重新排列 try..catch 块使其工作。我通过附加工作代码更新了帖子。
【解决方案3】:

此代码在不通知用户的情况下回滚事务。

   catch (Exception)
   {
       ot.Rollback();
   }

【讨论】:

    猜你喜欢
    • 2020-10-24
    • 2015-11-11
    • 1970-01-01
    • 1970-01-01
    • 2012-05-31
    • 2018-03-21
    • 2011-10-10
    • 2018-03-13
    • 2016-07-18
    相关资源
    最近更新 更多