OracleCommand застрял - PullRequest
       8

OracleCommand застрял

0 голосов
/ 13 октября 2019

У меня есть этот код:

                using (OracleConnection conn = new OracleConnection(config.ConnectionStringLms))
                {

                    conn.Open();

                    using (OracleCommand cmd = conn.CreateCommand())
                    {
                        NLog.LogManager.GetCurrentClassLogger().Trace("Clearing temp lms users table...");

                        cmd.CommandText = "DELETE FROM TMPTABLEFORUSERSUPDATING;";
                        cmd.ExecuteNonQuery();

                        NLog.LogManager.GetCurrentClassLogger().Trace("Done clearing temp lms users table...");
                    }
                 }

Но когда я его выполняю, он просто застревает в cmd.ExecuteNonQuery () и не переходит к NLog. Любой другой запрос работает. Когда я пытаюсь выполнить точно такой же запрос к самой БД, он работает просто отлично. Не исключение не выбрасывается. Oracle 11.2 express.

EDIT: код для воспроизведения проблемы:

    public void ClearTempLmsUsersTable()
    {
                try
                {
                    using (OracleConnection conn = new OracleConnection(config.ConnectionStringLms))
                    {

                        conn.Open();

                        using (OracleCommand cmd = conn.CreateCommand())
                        {
                            NLog.LogManager.GetCurrentClassLogger().Trace("Clearing temp lms users table...");

                            cmd.CommandText = "DELETE FROM TMPTABLEFORUSERSUPDATING";
                            cmd.ExecuteNonQuery();

                            NLog.LogManager.GetCurrentClassLogger().Trace("Done clearing temp lms users table...");
                        }
                    }
                }
                catch (Exception exx)
                {
                    NLog.LogManager.GetCurrentClassLogger().Error(exx);
                }
    }

Я также установил точку останова в NLog.LogManager.GetCurrentClassLogger (). Error (exx);и он не попадает в него.

Вызывается контроллером:

    [HttpPost]
    public HttpResponseMessage Post([FromBody] Request req)
    {
        Dal dal = new Dal();
        dal.ClearTempLmsUsersTable();
    }

Пока config.ConnectionStringLms допустим, не равен нулю и может подключаться.

1 Ответ

0 голосов
/ 13 октября 2019

Но когда я его выполняю, он просто застревает в cmd.ExecuteNonQuery ()

Да, потому что все еще выполняется оператор DELETE FROM....

Выполнениеоператор DELETE FROM... стоит дорого!

Однако, поскольку ваш оператор DELETE FROM... не имеет предиката (нет критериев WHERE или JOIN), он сигнализирует о намерении просто очиститьвесь стол. Если вы хотите очистить таблицу, лучше использовать вместо нее TRUNCATE TABLE.

(Обратите внимание, что если вы используете TRUNCATE TABLE, вам может потребоваться отключить ограничения по ссылкам и целостности - это, как правило, причинычто DELETE FROM... тоже медленный).

Oracle располагает документацией о TRUNCATE TABLE: https://docs.oracle.com/cd/B28359_01/server.111/b28286/statements_10007.htm#SQLRF01707

using( OracleConnection conn = new OracleConnection( config.ConnectionStringLms ) )
using( OracleCommand cmd = conn.CreateCommand() )
{
    await conn.OpenAsync().ConfigureAwait(false);
    NLog.LogManager.GetCurrentClassLogger().Trace("Clearing temp lms users table...");

     cmd.CommandText = "TRUNCATE TABLE TMPTABLEFORUSERSUPDATING;";
     await cmd.ExecuteNonQueryAsync().ConfigureAwait(false);

     NLog.LogManager.GetCurrentClassLogger().Trace("Done clearing temp lms users table...");
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...