Bezdepbonusu7Программирование: статьи и ответы

Вопрос

Почему использование подготовленного оператора завершается ошибкой с нулевыми значениями и успешным с GStrings?

Автор вопроса: Tomislav Nakic-AlfirevicОтветов: 2

В двух словах о проблеме:

Вот что происходит при попытке вставить строку с несколькими пустыми столбцами с помощью подготовленного оператора и groovy.sql.Sql:

groovy:000> val
===> [123123123, 2, null, 0, 0, , null, , 1213020112511801, 1283425009158952, 1, 2, null, 0, 0, , null, , 1213020112511801, 1283425009158952]
groovy:000> destSql.execute "insert into my_table values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", val
ERROR java.sql.SQLException: Type is not supported.
        at org.apache.derby.client.am.SQLExceptionFactory40.getSQLException (Unknown Source)
        at org.apache.derby.client.am.SqlException.getSQLException (Unknown Source)
        at org.apache.derby.client.am.PreparedStatement.setObject (Unknown Source)
        at groovysh_evaluate.run (groovysh_evaluate:3)
        ...
groovy:000>

Я получаю аналогичный результат с destSql.dataSet("my_table").add valueMap.

Вот что происходит при попытке вставить ту же строку, что и GString:

groovy:000> destSql.execute "insert into my_table values (${val[0]}, ${val[1]}, ${val[2]}, ${val[3]}, ${val[4]}, ${val[5]}, ${val[6]}, ${val[7]}, ${val[8]}, ${val[9]})"
===> false
groovy:000>

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

Я хотел бы понять следующее:

1) Мне трудно поверить, что вставка нулей с помощью подготовленных операторов невозможна, так почему это иногда вызывает проблемы? Менее совершенные драйверы JDBC, движки баз данных?

2) Почему работает пример с GString? Следуя той же логике, он по-прежнему не набирает информацию даже о нулевых столбцах, так как же это работает?

nullsqlgroovyderby

Ответы

Ответ 1 · рейтинг 1 · Bryan Pendleton

Вы получите лучшие ответы, если включите фактическое исключение, с которым столкнулись. Вы можете найти исключение в файле derby.log вашего сервера Derby или изменить свое приложение, чтобы распечатать всю цепочку исключений, а не только самое внешнее исключение на стороне клиента: http://wiki.apache.org/db-derby/UnwindExceptionChain

Не видя фактического исключения, вам довольно сложно помочь, но рискну предположить, что вы видите https://issues.apache.org/jira/browse/DERBY-1938

Ответ 2 · Aaron Saunders

пример gstring работает, потому что код ${val[0]} вернет null, если элемент массива равен нулю.

если код, который вы вставили в вопрос, правильный, некоторые из ваших элементов не имеют значения null ... это просто предположение

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы