簡體   English   中英

Transaction.Commit() 是否也會關閉底層連接。 C#

[英]Does Transaction.Commit() closes the underlying connection as well. C#

在 Transaction.Commit()` 之后,我的事務的連接屬性設置為 null。 我想知道連接對象會發生什么,它也會關閉嗎?

我想確保連接也關閉。 請建議。

所以在調用方法中我編碼如下。

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 那么我們如何處理連接關閉?(除了使用塊之外的任何替代方法)

不,不是的。 如果要關閉連接,建議的方法是將連接放在using塊中。 例如

using (DbConnection db = GetDbConnection())
{
  db.Open();
}

釋放對象時,連接將關閉。

編輯:就像查理說的那樣,理想情況下,交易也應該包含在 using 塊中。

您甚至可以使用TransactionScope

#edit:如果您正在學習,請遵循指南。 例如這個

此外,這類低級 SQL 訪問(SqlClient 和 ADO.NET)不適合初學者。 您應該研究傾斜的實體框架,或者可能是Dapper (盡管后者已經適用於更高級/有經驗的開發人員)。

回到你的代碼。 它的設計似乎沒有很好的組織。 嘗試遵循慣用的設計並將事物保持在一起。

關於using塊。 System.Data.SqlClient.SqlConnection派生自DbConnection ,因此是IDisposable SqlTransactionDbTransactionIDisposable相同。

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

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.
            }
        }
    }
}

暫無
暫無

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

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