
    Новые сообщения [новые:0]
  
  Дайджест 
  
  Горячие темы
    Избранное [новые:0]
  
Форумы 
 
Пользователи 
Статистика 
Статистика нагрузки 
    Мод. лог 
  
  Поиск 
  | 
| 
 05.09.2020, 18:12 
 | 
|||
|---|---|---|---|
  
  | 
|||
Sybase getUpdateCount  | 
|||
| 
 #18+ 
  
    
  Столкнулся со странным поведением PreparedStatement.getUpdateCount() в Sybase (ASE). При выполнении CRUD операций метод возвращает -1, хотя в других базах возвращается реальное число (например, кол-во удаленных записей). Пока что выкручиваюсь с помощью доп.запроса Код: sql 1. Пробовал оба драйвера (jtds, jconn) - с одинаковым результатом, set nocount on/off также не влияет. Что это может быть? Особенности СУБД или админы какие-то свойства в базе установили? Кто-нибудь сталкивался? ...  | 
|||
| 
 : 
 Нравится:
      
  Не нравится:
      
  
   | 
|||
| 
  
  
   | 
| 
 09.09.2020, 00:03 
 | 
|||
|---|---|---|---|
Sybase getUpdateCount  | 
|||
| 
 #18+ 
  
    
  ivanra, давай кусок кода как используешь getUpdateCount() ...  | 
|||
| 
 : 
 Нравится:
      
  Не нравится:
      
  
   | 
|||
| 
  
  
   | 
| 
 09.09.2020, 08:48 
 | 
|||
|---|---|---|---|
  
  | 
|||
Sybase getUpdateCount  | 
|||
| 
 #18+ 
  
    
  Вопрос больше про Sybase, чем про getUpdateCount. С другими серверами всё работает как надо. Тут ничего интересного, всё стандартно: Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. ...  | 
|||
| 
 : 
 Нравится:
      
  Не нравится:
      
  
   | 
|||
| 
  
  
   | 
| 
 09.09.2020, 13:40 
 | 
|||
|---|---|---|---|
  
  | 
|||
Sybase getUpdateCount  | 
|||
| 
 #18+ 
  
    
  Мне кажется, Вы неправильно используете getUpdateCount().  Retrieves the current result as an update count; if the result is a ResultSet object or there are no more results, -1 is returned. This method should be called only once per result. С Sybase не работал, но http://infocenter.sybase.com/help/index.jsp?topic=/com.sybase.infocenter.dc39001.0707/html/prjdbc0707/BHCBFAAB.htm наводит на мысль, что Sybase альтернативно одаренно на Update / Delete возврашает ResultSet'ы. Т.е. нужно обрабатывать ИЛИ ResultSet'ы ИЛИ вызывать getUpdateCount. IMHO. Не точно. Что делает Ваш код и зачем такая странно-сложная конструкция нужна, не знаю. Похоже какая-то универсальность, которая криво и некорректно задумана и в результате и работает не так, как ожидалось. ...  | 
|||
| 
 : 
 Нравится:
      
  Не нравится:
      
  
   | 
|||
| 
  
  
   | 
| 
 09.09.2020, 13:46 
 | 
|||
|---|---|---|---|
  
  | 
|||
Sybase getUpdateCount  | 
|||
| 
 #18+ 
  
    
  На JavaDoc про execute написано Returns: true if the first result is a ResultSet object; false if it is an update count or there are no results уточнение "the first result" как-то немного вводит в ступор. Я бы поэксперементировал и попытался понять, что для вашей команды DML выдают методы getResultSet / getMoreResults / getUpdateCount. ...  | 
|||
| 
 : 
 Нравится:
      
  Не нравится:
      
  
   | 
|||
| 
  
  
   | 
| 
 09.09.2020, 13:55 
 | 
|||
|---|---|---|---|
  
  | 
|||
Sybase getUpdateCount  | 
|||
| 
 #18+ 
  
    
  Я бы еще проверил: 1) это только на PreparedStatement бага или на просто Statement тоже. 2) это только на execute бага или на executeUpdate тоже В принципе, тип операции SELECT или DML должен быть понятен на фазе prepared. Возможно на фазе execute данные проверки (что возврашает команда), банально не реализованы - т.к. нафиг нормальным людям не надо. IMHO ...  | 
|||
| 
 : 
 Нравится:
      
  Не нравится:
      
  
   | 
|||
| 
  
  
   | 
| 
 09.09.2020, 15:48 
 | 
|||
|---|---|---|---|
  
  | 
|||
Sybase getUpdateCount  | 
|||
| 
 #18+ 
  
    
  Leonid Kudryavtsev, Тут действительно есть некая универсальность, поскольку этот код - просто выжимка и результат отладки кода компоненты camel-sql (org.apache.camel.component.sql.SqlProducer.java). Желающие могут увидеть полный код в методе Код: java 1. И дело тут именно в Sybase, поскольку весь этот код, с тем же самым драйвером jtds работает нормально в MSSQL. Сам sql в этом очень простой Код: sql 1. В нормальных условиях getUpdateCount() возвращает либо 0, либо 1. Но в данном случае - всегда -1 Пока пришлось дописать туда второй запрос Код: sql 1. 2. Соответственгно в приведенном java коде теперь попадаем не в else блок, а в блок if (isResultSet) и там получаем ожидаемый результат ...  | 
|||
| 
 : 
 Нравится:
      
  Не нравится:
      
  
   | 
|||
| 
  
  
   | 
| 
 09.09.2020, 17:14 
 | 
|||
|---|---|---|---|
  
  | 
|||
Sybase getUpdateCount  | 
|||
| 
 #18+ 
  
    
  Я немного не про это, проверьте, правильно ли возврашает результат PreparedStatement.executeUpdate и PreparedStatement.execute + getUpdateCount На мой взгляд, скорее всего бага - т.е. надо писать письмо в Sybase Если executeUpdate работает корректно, то наверное можно сделать свой мини-патч-workaround. Например подменив класс org.apache.camel.component.sql.SqlProducer.java или даже напрямую Sybase'вский PreparedStatement. IMHO ...  | 
|||
| 
 : 
 Нравится:
      
  Не нравится:
      
  
   | 
|||
| 
  
  
   | 
| 
 09.09.2020, 19:58 
 | 
|||
|---|---|---|---|
  
  | 
|||
Sybase getUpdateCount  | 
|||
| 
 #18+ 
  
    
  Leonid Kudryavtsev, в executeUpdate то же самое, только еще хуже. В драйвере jtds зачем-то вставлен такой костыль: Код: java 1. 2. 3. 4. 5. Тупо меняют эту -1 на 0. Видимо, разработчиков драйвера сервер Sybase тоже в тупик поставил ...  | 
|||
| 
 : 
 Нравится:
      
  Не нравится:
      
  
   | 
|||
| 
  
  
   | 
| 
 10.09.2020, 02:50 
 | 
|||
|---|---|---|---|
  
  | 
|||
Sybase getUpdateCount  | 
|||
| 
 #18+ 
  
    
  ivanra, Мрак какой-то ...  | 
|||
| 
 : 
 Нравится:
      
  Не нравится:
      
  
   | 
|||
| 
  
  
   | 
| 
 12.09.2020, 01:41 
 | 
|||
|---|---|---|---|
Sybase getUpdateCount  | 
|||
| 
 #18+ 
  
    
  ivanra, твой код в принципе верный и должен работать вот пример полного кода от сайбейз для получения всех резалтсетов: http://infocenter.sybase.com/help/index.jsp?topic=/com.sybase.help.sqlanywhere.12.0.1/ulj/ulj-api-resultset-int-getrowcount-met.html я вижу, что это для sybase sqlanywhere, но для ASE тоже подходит. в executeUpdate() для jtds код верный потому что этот метод не должен возвращать -1 согласно джавадок. в сайбейз есть параметр сессии: SET NOCOUNT ON его часто используют в процедурах но забывают вернуть обратно в нормальное положение "OFF" ...  | 
|||
| 
 : 
 Нравится:
      
  Не нравится:
      
  
   | 
|||
| 
  
  
   | 
  | 

start [/forum/topic.php?fid=59&tablet=1&tid=2120686]:  | 
    0ms | 
get settings:  | 
    7ms | 
get forum list:  | 
    12ms | 
check forum access:  | 
    3ms | 
check topic access:  | 
    3ms | 
track hit:  | 
    36ms | 
get topic data:  | 
    12ms | 
get forum data:  | 
    2ms | 
get page messages:  | 
    52ms | 
get tp. blocked users:  | 
    2ms | 
| others: | 228ms | 
| total: | 357ms | 

    | 0 / 0 | 

На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даете согласие с использованием данных технологий.