簡體   English   中英

C# Winform - OracleDataAdapter 沒有立即持久化記錄

[英]C# Winform - OracleDataAdapter not persisting the records immediately

我正在對舊的 C# WinForm 應用程序進行更改。

在下面的代碼中,當調用DoWork() function 時。 它調用兩個函數PerformOperation1PerformOperation2 這兩個函數都有一個非常相似的主體。 唯一的區別是它們都更新同一個數據庫表的不同字段。

最后,當他們都完成工作后,我們使用OracleDataAdapter獲取記錄。

返回的行數在代碼中為 0。 但是,如果我立即在數據庫上執行查詢,它會返回一些行。 這意味着當我們在 DataAapter 上調用Fill時, PerformOperation2更新的記錄不會以某種方式推送到數據庫。

public void DoWork()
{
    PerformOperation1();
    PerformOperation2();
    
    var sql = "select * from results where result_id = 1 and is_valid = 'Y'";
    var table =  new DataTable();
    var data = new OracleDataAdapter(new OracleCommand(sql, base.Connection));
    data.Fill(table);
    var count = data.Rows.Count; //It returns 0 But when execute the same query on database, it returns rows.
}

    public void PerformOperation1() 
    {
        string sql = "select seq_1, product, count_1, count_2 from results where result_id = 1";
        string updateSQL = "update results set count_1 = :count_1, count_2 = :count_2 WHERE seq_1 = :seq_1";

        var selectCmd = new OracleCommand(sql, base.Connection);
        selectCmd.CommandType = CommandType.Text;
        var adapter = new OracleDataAdapter(lCmd);

        adapter.UpdateCommand = new OracleCommand(updateSQL, base.Connection);
        adapter.UpdateCommand.CommandType = CommandType.Text;

        AddCommandParameter(adapter.UpdateCommand, ":count_1", DbType.Double, 11, "count_1");
        AddCommandParameter(adapter.UpdateCommand, ":count_2", DbType.Double, 11, "count_2");

        var data = new DataSet();
        adapter.Fill(data);
                        
        foreach (var row in data.Tables[0].Rows)
        {
            row["count_1"] = GetCount1(row["seq1"]); //Returns Count1
            row["count_2"] = GetCount2(row["seq1"]); //Returns Count2
            
            //Forces an immediate garbage collection of all generations
            GC.Collect();
            GC.WaitForPendingFinalizers();
        }

        adapter.Update(data);
        data.AcceptChanges();
    }

    public void PerformOperation2() 
    {
        string sql = "select seq_1, product, is_valid from results where result_id = 1";
        string updateSQL = "update results set is_valid = :is_valid WHERE seq_1 = :seq_1";
        //Does exactly the samething like PerformOperation1 function above.
        //100% same code.
        //Only difference is that it updates different column named is_valid (with value 'Y' or 'N')
    }


    public void AddCommandParameter(DbCommand aoCommand, string asParamName, DbType aoDataType, int aiSize, string asColName)
    {
        if (aoCommand is OracleCommand)
        {
            OracleCommand loCommand = (OracleCommand)aoCommand;
            OracleType loOraDataType = ConvertToOracleType(aoDataType);
            loCommand.Parameters.Add(asParamName, loOraDataType, aiSize, asColName);
        }
    }

知道為什么會這樣嗎?

我想到了。 這不是編碼問題。 這是一些底層數據庫視圖問題。

暫無
暫無

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

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