2007/03/31

WebObjectsで直接SQL実行


WebObjectsで、直接SQLを実行したい場合、よく目にするのは「EOUtilities.rawRowsForSQL」です。
今までずっとこいつを使っていたのですが、こいつでINSERTを実行したあとに、「ec.saveChanges()」をやると、以下のエラーが出るようです。


: Exception occurred while handling request:
java.lang.IllegalArgumentException: Array is empty
at com.webobjects.foundation.NSArray.objectAtIndex(NSArray.java:488)
at com.webobjects.jdbcadaptor.JDBCPlugIn.newPrimaryKeys(JDBCPlugIn.java:611)
:
:


なぜだかまったく分からず、色々調べてみると、

Are you expecting rows from your UPDATE statements? If not, why do you use rawRowsForSQL() in preference of evaluateExpression()?

どうやら、結果を求める場合はrawRowsForSQL()を使い、実行するだけの場合はevaluateExpression()を使うようです。



というわけで、以下のようにevaluateExpressionを使用するようにしました。

もちろんエラーはなくなりました。


EODatabaseContext dbContext = EOUtilities.databaseContextForModelNamed(ec, "model");
EOAdaptorContext adContext = dbContext.adaptorContext();
EOAdaptorChannel adCannel = (EOAdaptorChannel)adContext.channels().lastObject();
EOSQLExpressionFactory factory = new EOSQLExpressionFactory(adContext.adaptor());
EOSQLExpression expression = factory.expressionForString("sql");
adCannel.evaluateExpression(expression);

0 件のコメント: