2009-04-16 3 views
1

Я использую официальный драйвер Sybase JDBC для подключения к базе данных и вызова хранимой процедуры, создав CallableStatement, привязывая к нему параметры и вызывая на нем .execute().Почему драйвер Sybase JDBC «ест» исключения?

Однако я обнаружил, что исключение не выбрасывается, даже если хранимая процедура не выполняется. Я могу проверить, что отказ распространяется на меня, обнюхивая трафик в базу данных с помощью Wireshark и наблюдая за возвратом сообщений об ошибках.

Наконец, я обнаружил, что использование .executeUpdate() вместо .Execute() ли дать мне исключения, но я до сих пор два вопроса осталось:

  1. Почему .Execute() и .executeUpdate() ведут себя по-другому? Из документации по интерфейсу SUN кажется, что они должны делать (почти) одно и то же ...
  2. Всегда ли заменять .execute() на .executeUpdate() при вызове хранимой процедуры? Должна ли хранимая процедура соответствовать определенным требованиям, подлежащим вызову с помощью .executeUpdate()? (Например, должен ли он иметь обновление/удаление вставки о/в качестве последнего шага?)

Update: Я пробовал jTDS, и он ведет себя правильно (например: он бросает SQLException в обоих case - с .execute() и с .executeUpdate()). Однако из-за ограничений, находящихся вне моего контроля, выключение драйвера на самом деле невозможно.

Также: меня не интересует результат, возвращаемый этой хранимой процедурой, это процедура типа вставки/обновления. Я бы только вставлял, чтобы видеть (и уметь ловить/лог), если он терпит неудачу или нет. Другая вещь, которую я пробовал, - это получить предупреждения от соединения после .execute(), но в нем тоже ничего не было.

+1

Другие водители ведут себя одинаково? Что относительно jTDS? http://jtds.sourceforge.net/ –

ответ

5

Потому что эти люди Sybase сумасшедшие, поэтому он ест Исключения! Нет причин избегать использования executeUpdate() для подготовленных/вызываемых операторов. Если это то, что вам нужно использовать, чтобы заставить его работать, продолжайте и делайте это. Но вы должны подать отчет об ошибке с Sybase - нет причин, по которым водитель должен это делать.

0

ничего не знает о Sybase, но

executeUpdate возвращает более подробную информацию, чем выполнить: на # строк, вставленных/обновлено/удален

-> она пригодна для работы с UPDATE INSERT DELETE, и операции DML в соответствии к джавадоку.

executeQuery возвращает ResultSet, это для операторов SELECT.

1

не уверен, являются ли люди сибазы «сумасшедшими». Может быть.

С другой стороны, одновременное получение результатов, когда вы не проводите активную проверку кода возврата вызываемого оператора, может иметь смысл в отношении производительности. Я еще не тестировал его полностью, но есть простой способ решения этой проблемы (ASE 15.5, jconn 7):

исключение будет срабатывать при выборке установлен его параметров из сохраненного прока (по крайней мере, при вызове хранимых процедур):

// one may force the error check by retrieving the return code! 
    cs = conn.prepareCall("{ ? = call sp_nested_error @nNestLevels = 1 }"); 
    cs.registerOutParameter(1, Types.INTEGER); 
    cs.execute(); 
    try { 
     cs.getInt(1); 
     fail(); 
    } catch(SQLException e) { 
     assertTrue(e.getMessage().indexOf("some error") > -1); 
    } 

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

Смежные вопросы