簡體   English   中英

ADO.Net事務不起作用

[英]ADO.Net Transaction Not Working

我有以下代碼(我是.NET事務的新手),它似乎根本沒有執行。 它是通過Web服務調用的,我很難調試:

 public void UpdateJailFiles(List<RMS.NameFile> names, RMS.Incident incident, int currentDate, int currentTime, int incidentKey)
    {
        String library = RMSLIBRARY;

        IDbTransaction transaction;

        using (IDbConnection conn = Connection)
        {
            conn.Open();
            transaction = conn.BeginTransaction();
            try
            {
                names.ForEach(nameFile =>
                    {
                        IDbCommand command = conn.CreateCommand();
                        command.CommandText = "call " + library + ".SP_NAMEFILE_UPDATE(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)";
                        command.CommandType = CommandType.StoredProcedure;
                        command.CommandTimeout = 0;
                        command.Transaction = transaction;

                        IDbDataParameter param = command.CreateParameter();
                        param.ParameterName = "@INCIDENTKEY";
                        param.DbType = DbType.Int32;
                        param.Value = nameFile.IncidentKey;
                        command.Parameters.Add(param);

                        ///Many more params...

                        command.ExecuteNonQuery();
                    });

                IDbCommand command2 = conn.CreateCommand();
                command2.CommandText = "call " + library + ".SP_INCIDENTFILE_UPDATE(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)";
                command2.CommandType = CommandType.StoredProcedure;
                command2.Transaction = transaction;

                IDbDataParameter param1b = command2.CreateParameter();
                param1b.ParameterName = "@CASENUMBER";
                param1b.DbType = DbType.String;
                param1b.Value = incident.CaseNumber;
                command2.Parameters.Add(param1b);

                IDbDataParameter param2b = command2.CreateParameter();
                param2b.ParameterName = "@INCIDENTFROMDATE";
                param2b.DbType = DbType.Int32;
                param2b.Value = incident.IncidentFromDate;
                command2.Parameters.Add(param2b);

                ///Many more params...

                command2.ExecuteNonQuery();

                transaction.Commit();
            } // end try
            catch (Exception)
            {
                transaction.Rollback();
            }
        } // end using

    }

看到這段代碼有什么問題嗎?

我懷疑您使用屬性( Connection )來加載using語句。 通常在新的本地對象實例上using ,如下所示:

    using (IDbConnection conn = new MyConnectionClass())
    {
    }

當您退出using語句時,您的IDbConnection會調用它的Dispose() ,但是在任何地方都看不到它被更新以反映該狀態的屬性。 那是你要的嗎?

您可能還需要Dispose()您的IDbCommand ,在這里還不清楚-但是對於SqlCommand ,這是事實。

將嘗試訪問數據庫的全部代碼包裝在try..except可能也很有幫助,這樣您就可以診斷和/或傳播任何數據庫異常。

暫無
暫無

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

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