簡體   English   中英

為什么我的更新語句沒有更新表?

[英]Why is my update statement not updating the table?

它編譯,似乎運行,但記錄沒有改變。

這是我的代碼:

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
{
    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!
}

我注意到你真的沒有辦法區分是否拋出異常並且事務被回滾或者事務是否成功。 看,你正在捕獲異常,回滾事務,然后仍然顯示消息框“顯然成功”。 因為你吞下了這個例外並且墮落了。 有一個原因是人們從屋頂頂部尖叫到不吞下異常

所以,我懷疑是一個異常被拋出,你正在抓住它,回滾,然后變得困惑,因為你摔倒並顯示消息框。 這是編寫得很糟糕的代碼,編寫錯誤的代碼會引入這樣的錯誤。

如果我是你,我至少會重新拋出異常。

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

但更好的是,只需將事務的using包裝在一個using塊中

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

為什么我的更新語句沒有更新表?

您的代碼中存在錯誤。 其中一個陳述

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

拋出異常,但你不知道,因為你吞下了所有異常。 停止吞下異常,你會發現這些行中的哪一行正在拋出異常以及原因。 然后,您將獲得更多信息來調試您的基礎問題。

此代碼在不通知用戶的情況下回滾事務。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM