Предотвратите ошибку при отбрасывании не существующих последовательностей, создании существующих пользователей

Лучший способ взглянуть на ASP.NET MVC с QueryStrings - это воспринимать их как значения, о которых маршрут не знает. Как вы узнали, QueryString не является частью RouteData, поэтому вы должны хранить то, что вы передаете, в виде строки запроса отдельно от значений маршрута.

Способ обойти их - создать значения по умолчанию самостоятельно в действии, если значения, переданные из QueryString, равны нулю.

В вашем примере маршрут знает о x, поэтому ваш URL должен действительно выглядеть так:

/Test/Foo or /Test/Foo/5

и маршрут должен выглядеть так:

routes.MapRoute("test", "Test/Foo/{x}", new {controller = "Test", action = "Foo", x = 1});

Чтобы получить поведение, которое вы искали.

Если вы хотите передать значение QueryString, скажем, как номер страницы, вы должны сделать это:

/Test/Foo/5?page=1

И ваше действие должно измениться следующим образом:

public ActionResult Foo(int x, int? page)
{
    Trace.WriteLine(x);
    Trace.WriteLine(page.HasValue ? page.Value : 1);
    return new EmptyResult();
}

Сейчас тест:

Url:  /Test/Foo
Trace:
1
1

Url:  /Test/Foo/5
Trace:
5
1

Url:  /Test/Foo/5?page=2
Trace:
5
2

Url:  /Test/Foo?page=2
Trace:
1
2

Надеюсь, что это помогает прояснить некоторые вещи.

7
задан Tom 26 October 2009 в 17:00
поделиться

3 ответа

Liquibase имеет атрибут failOnError, который можно установить в значение false в наборах изменений, которые включают вызов, который может завершиться ошибкой.

<changeSet failOnError="false">
   <createSequence sequenceName="new_sequence"/>
</changeSet>

Это позволяет вам просто создать пользователя, создать последовательность, удалить пользователя и удалить набор изменений последовательности, и если оператор выдает ошибку, потому что эти пользователи / последовательности существуют / не существуют, они все равно будут помечены как запущенные, а обновление будет продолжаться.

Обратной стороной этого подхода является то, что он также помечает их как запущенные и продолжает работу, если они ошибаются по какой-либо другой причине (неправильные разрешения, сбой соединения, недопустимый SQL и т. д.). Более точный подход - использовать предварительные условия , например:

<changeSet>
   <preconditions onFail="MARK_RAN"><not><sequenceExists/></not></preconditions>
   <createSequence name="new_sequence"/>
</changeSet>

В настоящее время предварительного условия userExists нет, но вы можете создать собственные предварительные условия или вернуться к предварительному условию. См. http://www.liquibase.org/documentation/preconditions.

15
ответ дан 6 December 2019 в 07:27
поделиться

Напишите функцию do_ddl, подобную этой и перехватить все исключения, которые вы хотите перехватить:

DECLARE
   allready_null EXCEPTION;
   PRAGMA EXCEPTION_INIT(allready_null, -1451);
BEGIN
   execute immediate 'ALTER TABLE TAB MODIFY(COL  NULL)';
EXCEPTION
   WHEN allready_null THEN
      null; -- handle the error
END;
/
5
ответ дан 6 December 2019 в 07:27
поделиться

Я бы просто использовал анонимный блок PL / SQL.

begin
   for x in (select sequence_name
             from   user_sequences
              where sequence_name in ('SEQ1','SEQ2' ... 'SEQn'))
   loop
      execute immediate 'drop sequence '||x.sequence_name;
   end loop;
end;
/
2
ответ дан 6 December 2019 в 07:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: