久久久久久久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 的原因)
主站蜘蛛池模板: 中文字幕一区二区三区四区五区 | 国产婷婷色一区二区三区 | 欧美精品乱码久久久久久按摩 | 久久久精品 | 91精品国产综合久久精品 | 国产精品毛片一区二区三区 | 亚洲欧美中文日韩在线v日本 | 日日噜噜噜夜夜爽爽狠狠视频, | 久久久精选 | 色综合久久天天综合网 | 免费看a| 黄a免费看 | www.青青草 | 成人在线一区二区 | 黄色大片免费播放 | 精品国产视频在线观看 | 一区二区三区在线免费观看 | 国产精品一区二区视频 | 欧美日韩国产免费 | 国产精品久久久久久久久久久久久久 | 午夜精品视频在线观看 | 亚洲成人国产综合 | av资源中文在线天堂 | 久久国内精品 | 久久久久91 | 国产亚洲精品久久久久久牛牛 | 日韩一区二区三区精品 | 性一交一乱一伦视频免费观看 | a级片网站 | 毛片网站在线观看 | 国产清纯白嫩初高生视频在线观看 | 亚洲免费在线观看 | 亚洲一区免费在线 | 免费二区| 亚洲精品乱码久久久久久9色 | 成人午夜免费视频 | 一级黄色片免费 | 狠狠综合网| 国产激情一区二区三区 | 欧美日韩中文在线 | 成人精品国产免费网站 |