首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Transaction.Commit()是否也关闭基础连接。C#

Transaction.Commit()是否也关闭基础连接。C#
EN

Stack Overflow用户
提问于 2022-05-09 11:40:08
回答 1查看 360关注 0票数 0

在Transaction.Commit()`之后,我的事务的connection属性被设置为null。我想知道连接对象发生了什么,它也被关闭了吗?

我想确保连接也被关闭。请建议一下。

因此,在调用方法时,我编写如下代码。

代码语言:javascript
运行
复制
System.Data.SQLClient.SQLTransaction trans = null;
System.Data.SQLClient.SQLConnection oConn = null;
trans = oConn.GetIWSTransaction();

trans.commit();

and in GetIWSTransaction() as
Private System.Data.SQLClient.SQLTransaction m_oIWSTransaction = 
null;
Private System.Data.SQLClient.SQLConnection m_oIWSConnection = null;

if(this.m_oIWSConnection.State = System.Data.ConnectionState.Closed)
this.m_oIWSConnection.Open();
this.m_oIWSTransaction = this.m_oIWSConnection.BeginTransaction();

return this.m_oIWSTransaction;

现在的问题是,调用方法中的trans.commit()是否也终止了连接,还是将其设置为null。如果它只是将其设置为null,那么我们如何处理连接闭包?(除了使用块之外,还有其他选择)

EN

回答 1

Stack Overflow用户

发布于 2022-05-09 11:53:04

不,不需要。如果要关闭连接,建议的方法是将连接放在using块中。例如。

代码语言:javascript
运行
复制
using (DbConnection db = GetDbConnection())
{
  db.Open();
}

当对象被释放时,连接将被关闭。

编辑:就像Charlie说的,理想情况下,事务也应该包含在一个using块中。

您甚至可以使用TransactionScope

#编辑:如果你正在学习,请遵循指南。例如这一个

此外,这种低级别的starters (SqlClient和ADO.NET)不适合初学者使用。您应该考虑学习实体框架,或者可能是脱衣舞 (尽管后者已经适合更高级/更有经验的开发人员)。

回到你的密码。它的设计似乎没有很好的组织。试着遵循习惯性的设计,把事情保持在一起。

还有关于using块。System.Data.SqlClient.SqlConnection来源于DbConnection,因此是IDisposableSqlTransactionDbTransactionIDisposable也是如此。

因此,您的代码可能如下所示:

代码语言:javascript
运行
复制
using System.Data.SqlClient;

using (SqlConnection connection = new SqlConnection(...connection string...))
{
    connection.Open();

    SqlCommand command = connection.CreateCommand();
    using (SqlTransaction transaction = connection.BeginTransaction("SampleTransaction"))
    {
        command.Transaction = transaction;
        command.CommandText = ...your SQL...;

        try
        {
            command.ExecuteNonQuery();
            transaction.Commit();
        }
        catch (Exception ex)
        {
            try
            {
                transaction.Rollback();
            }
            catch (Exception ex2)
            {
                // This catch block will handle any errors that may have occurred
                // on the server that would cause the rollback to fail, such as
                // a closed connection.
            }
        }
    }
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72171385

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档