Возвращаемое значение от сохраненного proc на ошибке

Быстрый ответ:

override func viewDidLoad() {
    super.viewDidLoad()
    let tapGestureReconizer = UITapGestureRecognizer(target: self, action: "tap:")
    view.addGestureRecognizer(tapGestureReconizer)
}

func tap(sender: UITapGestureRecognizer) {
    view.endEditing(true)
}
23
задан marc_s 5 November 2011 в 14:27
поделиться

4 ответа

Нет стандарта для кодов возврата. Вам нужно будет выяснить, что означает -4 в этой конкретной хранимой процедуре. На самом деле, не все коды возврата являются ошибками.


РЕДАКТИРОВАТЬ: counter-example

SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE PROCEDURE [dbo].[RetValTest] 
AS
BEGIN
    select 1/0;
END

GO

Выполнение:

DECLARE @return_value int

EXEC    @return_value = [dbo].[RetValTest]

SELECT  'Return Value' = @return_value

GO

Результат:

Msg 8134, Level 16, State 1, Procedure RetValTest, Line 9
Divide by zero error encountered.

Это для SQL Server 2008.


Некоторые исследования показывают, что такое поведение можно оставить. из SQL Server 6.0. Если это так, то вы можете решить для себя, насколько он может быть надежным, учитывая, что они перестали документировать его (и перестали гарантировать его точность) так давно.


Мое «исследование» должно быть, с благодарностью, SQL Server MVP Тибор Караси . Его источник - это электронная документация по SQL Server 6.5. В разделе «Язык управления потоком», RETURN он обнаружил

«SQL Server резервирует 0 для обозначения успешного возврата и резервирует отрицательные значения от - 1 до - 99, чтобы указать разные причины неудач. Если не определенное пользователем возвращаемое значение при условии, что используется значение SQL Server. Пользовательский статус возврата значения не должны конфликтовать со значениями, зарезервированными SQL Server. В значения от 0 до -14 в настоящее время используются.
10
ответ дан 29 November 2019 в 01:55
поделиться

Если у вас есть оператор RETURN с явным возвращаемым значением, это, конечно, возврат значение.

Но если оператора RETURN нет, но во время выполнения возникает ошибка, возвращаемое значение - 10 минус уровень серьезности ошибки. Деление на ноль - это уровень 16, поэтому возвращаемое значение - -6. Ошибки прав доступа - типичный уровень 14, поэтому возвращаемое значение - 4.

Как вы можете догадаться, это не очень полезно, но это: 0 - успех, а все остальное - ошибка.

28
ответ дан 29 November 2019 в 01:55
поделиться

Хороший совет, который я часто слышал процитировать, звучит так:

Будьте либеральны в том, что вы принимаете, и точнее в том, что вы предоставляете.

С точки зрения разработки вашего API , Я бы посоветовал вам возвращать интерфейс, а не конкретный тип.

Взяв ваш пример метода, я бы переписал его следующим образом:

public IList<object> Foo() 
{
    List<object> retList = new List<object>();
    // Blah, blah, [snip]
    return retList;
}

Ключ в том, что ваш внутренний выбор реализации - использовать список - не раскрывается вызывающему, но вы возвращаете соответствующий интерфейс.

Собственные рекомендации Microsoft по разработке фреймворка не рекомендуют возвращать определенные типы, отдавая предпочтение интерфейсам. (К сожалению, мне не удалось найти для этого ссылку)

Точно так же ваши параметры должны быть как можно более общими - вместо того, чтобы принимать массив, примите IEnumerable соответствующего типа. у вас нет оператора RETURN в ваша сохраненная процедура?

Что-то, что я нашел, было по этой ссылке www.redware.com/handbooks/sql_server_handbook/sql_server_stored_procedures.html

SQL Server будет возвращать по умолчанию значение до нуля. Возвращаемые значения: обычно используется для возврата флага состояния из хранимой процедуры с ненулевое значение, обычно указывающее сбой во время обработки.

Возвращаемые значения сложно доступ с использованием ODBC, их использование рекомендуется только для того, чтобы вернуть успех или сбой хранимой процедуры при общении с другими сохраненными процедуры.

По этой ссылке - sqlserverpedia.com/wiki/Stored_Procedures _-_ Output_Parameters _ & _ Return_Values ​​

Возвращаемые значения от -99 до 0 являются зарезервировано для внутреннего использования SQL Server. Вы можете создавать свои собственные параметры который может быть передан обратно вызывающему

Также еще одна ссылка (я полагаю) от @Erland Sommarskog www.sommarskog.se/error-handling-I.html

Возвращаемые значения из хранимых процедур

Все хранимые процедуры имеют возврат значение, определяемое ВОЗВРАТОМ заявление. Оператор RETURN принимает один необязательный аргумент, который должен быть числовое значение. Если вы скажете ВОЗВРАТ без указания значения, возврат значение 0, если во время исполнение. Если во время выполнение процедуры, возврат значение может быть 0, или это может быть отрицательное число. То же верно, если нет оператора RETURN вообще в процедура: возвращаемое значение может быть отрицательное число или может быть 0.

Имеют ли эти отрицательные числа любое значение, немного сложно сказать. Раньше было так, что возвращаемые значения от -1 до -99 были зарезервированы для возвращаемых значений, сгенерированных системой, и электронной документации для более ранних версий из значений, указанных в SQL Server для значения от -1 до -14. Однако книги Online for SQL 2000 не говорит ни о каких такие оговорки, и не объясните, что будет означать от -1 до -14.

За некоторыми исключениями, системные хранимые процедуры, которые Microsoft поставляется с возвратом SQL Server 0 для обозначения успеха и любое ненулевое значение значение указывает на сбой.

Получение информации об ошибке

Также, если вам нужно выяснить, что это за ошибка (а не то, что означает -6), вы можете попробовать поместить свой sql в ловушку попытки, т.е.

begin try

    select 1/0 as 'an error'

end try

begin catch

    select ERROR_NUMBER() as 'ERROR_NUMBER', 
           ERROR_SEVERITY() as 'ERROR_SEVERITY',
           ERROR_STATE() as 'ERROR_STATE',
           LEFT(ERROR_PROCEDURE(),50) as 'ERROR_PROCEDURE',
           ERROR_LINE() as 'ERROR_LINE' , 
           LEFT(ERROR_MESSAGE(),40) as 'ERROR_MESSAGE'    
end catch 
3
ответ дан 29 November 2019 в 01:55
поделиться

Я не уверен, что есть способ узнать это, не спрашивая разработчиков SQL Server. Это что-то более низкое, чем ваш хранимый процесс, который оценивает то, что вы его отправляете, и генерирует этот код возврата. Если в вашем коде специально не указано RETURN -4 , вероятно, оно исходит от анализатора SQL.

-1
ответ дан 29 November 2019 в 01:55
поделиться
Другие вопросы по тегам:

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