簡體   English   中英

SQL Server 2008 R2 Express和每晚的C#數據庫更新作業需要在發生故障時“回滾”整個數據庫

[英]SQL Server 2008 R2 Express and nightly C# database update job needs to “rollback” entire database on failure

我有一個C#程序,它將每晚運行。 它從平面文件中讀取記錄,並根據每個記錄的內容對SQL Server數據庫進行許多不同的插入和更新。

盡管在存儲過程中使用事務塊和Try...Catch ,在C#中使用Try...Catch ,但我確實需要這些更新全部或全部。

由於我們使用的是SQL Server 2008 R2 Express版,因此無法拍攝db的快照。

如果C#程序捕獲到錯誤,誰能解釋一個好方法(如果有)將SQL Server數據庫返回到夜間C#作業運行之前的狀態? 基本上,如果C#程序捕獲到錯誤,我希望它停止運行,並且希望將數據庫“回滾”到C#程序進行任何更改之前。 我需要這是一個自動化的解決方案,而不是從備份中手動還原。

從某種意義上說,我想要C#程序周圍的Transaction塊可以回滾C#程序所做的一切。

該數據庫處於具有完整恢復模型的Multi_User模式(具有每晚計划的數據庫和日志備份)。 有一個與此數據庫相關聯的Web應用程序,但最終用戶實際上絕對不需要在深夜訪問該Web應用程序。

我到處都在尋找解決方案,但是沒有運氣。 也許不使用正確的關鍵字。

我期待收到反饋。

預先感謝大衛

過去,我通過讀取文件,將其插入到臨時表中,然后調用單個存儲過程來將實際存儲從臨時表​​插入生產表中來解決此問題。

如果讀取文件時出錯,則截斷暫存表(或使用某種導入標識符)。 如果數據中存在錯誤,則應該很容易地知道在存儲過程方面,並且易於使用事務中包裝的一個或兩個基於集合的操作。

這樣做還有一個好處,就是如果有數據問題,可以在登台表中輕松查看數據,可以手動修復它,然后再次運行導入存儲過程。

對不起,但這就是我認為數據庫事務的目的。 首先,您連接到數據庫,然后啟動數據庫事務,然后對每個操作使用相同的連接和事務:

using ( SqlConnection conn = new SqlConnection( . . . ) ) {
    using ( SqlTransaction tran = new conn.BeginTransaction() ) {
        try {
            // Data processing operation #1
            using ( SqlCommand command = new SqlCommand( ". . .", conn, tran ) {
                // Your processing code here
            }

            // Repeat the pattern used for Data Processing Operation #1 for all other operations

            // Commit the transaction if everything completed without error.
            tran.Commit();
        } catch ( SqlException ) {
            // An error occurred.  Roll the transaction back.
            tran.Rollback();

            // Other error handling code if needed.
        }
    }
}

由於只有一個事務,因此如果出現任何問題,一切都會回滾到初始狀態。 如果由於其他原因需要取消操作,請調用tran.Rollback() &return。 這正是發明交易的原因。 我不明白他們為什么不替您做這項工作。

暫無
暫無

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

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