久久久久久久av_日韩在线中文_看一级毛片视频_日本精品二区_成人深夜福利视频_武道仙尊动漫在线观看

無法訪問 SqlTransaction 對象以在 catch 塊中回滾

Cannot access SqlTransaction object to rollback in catch block(無法訪問 SqlTransaction 對象以在 catch 塊中回滾)
本文介紹了無法訪問 SqlTransaction 對象以在 catch 塊中回滾的處理方法,對大家解決問題具有一定的參考價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧!

問題描述

我遇到了一個問題,我發(fā)現(xiàn)的所有文章或示例似乎都不關(guān)心它.

I've got a problem, and all articles or examples I found seem to not care about it.

我想在一個事務(wù)中做一些數(shù)據(jù)庫操作.我想要做的與大多??數(shù)示例非常相似:

I want to do some database actions in a transaction. What I want to do is very similar to most examples:

using (SqlConnection Conn = new SqlConnection(_ConnectionString))
{
    try
    {
        Conn.Open();
        SqlTransaction Trans = Conn.BeginTransaction();

        using (SqlCommand Com = new SqlCommand(ComText, Conn))
        {
            /* DB work */
        }
    }
    catch (Exception Ex)
    {
        Trans.Rollback();
        return -1;
    }
}

但問題在于 SqlTransaction Trans 是在 try 塊內(nèi)聲明的.所以它在 catch() 塊中是不可訪問的.大多數(shù)示例只是在 try 塊之前執(zhí)行 Conn.Open()Conn.BeginTransaction() ,但我認(rèn)為這有點冒險,因為兩者都可以拋出多個異常.

But the problem is that the SqlTransaction Trans is declared inside the try block. So it is not accessable in the catch() block. Most examples just do Conn.Open() and Conn.BeginTransaction() before the try block, but I think that's a bit risky, since both can throw multiple exceptions.

我錯了,還是大多數(shù)人只是忽略了這種風(fēng)險?如果發(fā)生異常,能夠回滾的最佳解決方案是什么?

Am I wrong, or do most people just ignore this risk? What's the best solution to be able to rollback, if an exception happens?

推薦答案

using (var Conn = new SqlConnection(_ConnectionString))
{
    SqlTransaction trans = null;
    try
    {
        Conn.Open();
        trans = Conn.BeginTransaction();

        using (SqlCommand Com = new SqlCommand(ComText, Conn, trans))
        {
            /* DB work */
        }
        trans.Commit();
    }
    catch (Exception Ex)
    {
        if (trans != null) trans.Rollback();
        return -1;
    }
}

或者你可以更簡潔、更輕松地使用它:

or you could go even cleaner and easier and use this:

using (var Conn = new SqlConnection(_ConnectionString))
{
    try
    {
        Conn.Open();
        using (var ts = new System.Transactions.TransactionScope())
        {
            using (SqlCommand Com = new SqlCommand(ComText, Conn))
            {
                /* DB work */
            }
            ts.Complete();
        }
    }
    catch (Exception Ex)
    {     
        return -1;
    }
}

這篇關(guān)于無法訪問 SqlTransaction 對象以在 catch 塊中回滾的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,也希望大家多多支持html5模板網(wǎng)!

【網(wǎng)站聲明】本站部分內(nèi)容來源于互聯(lián)網(wǎng),旨在幫助大家更快的解決問題,如果有圖片或者內(nèi)容侵犯了您的權(quán)益,請聯(lián)系我們刪除處理,感謝您的支持!

相關(guān)文檔推薦

LINQ to SQL and Concurrency Issues(LINQ to SQL 和并發(fā)問題)
SQL Server 2005 Transaction Level and Stored Procedures(SQL Server 2005 事務(wù)級和存儲過程)
Yield return from a try/catch block(try/catch 塊的收益回報)
Should I call Parameters.Clear when reusing a SqlCommand with a transation?(重用帶有事務(wù)的 SqlCommand 時,我應(yīng)該調(diào)用 Parameters.Clear 嗎?)
Does SqlTransaction need to have Dispose called?(SqlTransaction 是否需要調(diào)用 Dispose?)
Reason for System.Transactions.TransactionInDoubtException(System.Transactions.TransactionInDoubtException 的原因)
主站蜘蛛池模板: 亚洲免费在线观看 | 国产精品a久久久久 | 波多野结衣在线观看一区二区三区 | h视频免费在线观看 | 一区二区三区在线 | 91精品久久久久久久99 | 久久成人在线视频 | 亚洲自拍一区在线观看 | 亚洲日韩中文字幕 | 亚洲国产欧美国产综合一区 | 日韩中文字幕区 | 免费天天干 | 亚洲电影第三页 | 男人阁久久 | 亚州综合在线 | 久干网 | 国产精品久久久久无码av | 成人午夜影院 | 精品视频一区二区三区在线观看 | 国产色网 | 欧美一区二区三区在线播放 | 国产视频一二三区 | 视频二区 | 亚洲欧美一区二区三区1000 | 放个毛片看看 | 在线成人 | 久综合 | 日本一本视频 | 国产视频在线一区二区 | 成人在线免费视频观看 | 中文字幕福利 | 久久久久一区二区三区四区 | 天天爽夜夜爽精品视频婷婷 | 欧美一区二区三区在线观看 | 国产精品乱码一区二三区小蝌蚪 | 午夜影院在线观看免费 | 欧美精品久久久久 | 嫩草研究影院 | 中文字幕视频一区二区 | 久久er精品 | 九一视频在线播放 |