Почему использование подготовленного оператора терпит неудачу с нулями и преуспевает с GStrings? - PullRequest
1 голос
/ 25 сентября 2010

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

Вот что происходит, когда вы пытаетесь вставить строку с несколькими пустыми столбцами, используя подготовленный оператор и 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?Следуя той же логике, разве он не вводит информацию даже о пустых столбцах, так почему же это работает?

Ответы [ 2 ]

1 голос
/ 25 сентября 2010

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

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

0 голосов
/ 25 сентября 2010

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

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

...