こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

MySQLへバイナリデータを挿入する際にエラー

現在、サーブレットの勉強をしています。
ブラウザからファイルアップロードをするプログラムを組んでおり、Jakartaプロジェクトのcommons FileUploadを使っています。通常のファイルへ書き込むwriteを使うやり方はうまく行くのですが、MySQLに挿入しようとすると以下のエラーが出ます。ただ、MySQLの接続についてはできることを確認済みです。
「java.lang.AbstractMethodError: org.apache.tomcat.dbcp.dbcp.DelegatingPreparedStatement.setBlob(ILjava/io/InputStream;J)V」

また、MySQLには以下のような構成でfileという名前のテーブルを作ってあります。
id INT型 auto_increment
file BLOB型
filename VarChar型

プログラムは以下のようにしてあります。(一部省略)
if (ServletFileUpload.isMultipartContent(request)) {
DiskFileItemFactory dfif = new DiskFileItemFactory();
ServletFileUpload sfu = new ServletFileUpload(dfif);
FileItem fi = null;
try {
ListIterator li = sfu.parseRequest(request).listIterator();
InitialContext ic = new InitialContext();
DataSource ds = (DataSource)ic.lookup("java:comp/env/jdbc/MySQL");
Connection db = ds.getConnection();
while (li.hasNext()) {
fi = (FileItem)li.next();
if (!fi.isFormField()) {
String filename = fi.getName();
String mime = fi.getContentType();
if ((filename != null) && (!filename.equals(""))) {
filename = (new File(filename)).getName();
}
PreparedStatement ps = db.prepareStatement("INSERT INTO `file` (`file`, `filename`) VALUES (?, ?");
ps.setBlob(1, fi.getInputStream(), fi.getSize());
//ps.setBinaryStream(1, fi.getInputStream(), fi.getSize());
ps.setString(2, filename);
ps.executeUpdate();
ps.close();
db.close();
ic.close();
}}}}

setBlobとsetBinaryStreamの両方を試してみたものの、同じエラーになりました。また、executeUpdate()をコメントアウトしてもエラーが出るので、SQLのエラーではないような気がします。エラーについても検索してみてもあまりヒットせず、何が悪いのかよくわからない状態です。
何か気付いた点があれば教えてください。

投稿日時 - 2007-10-23 23:19:57

QNo.3455885

困ってます

質問者が選んだベストアンサー

原因は分からないけど、いくつか調べる(と何か分かるかもしれない)ポイントがありそうなので参考までに。
1.BLOB型のフィールド使わない場合は問題なく動くか
2.サーブレットやFileUploadを利用しない、通常のJavaコードでも同じ現象がでるか
3.JDBCドライバのバージョンを変えてみてどうなるか(最新版、よく使われているバージョンなど)

2.を検証するコードを用意するのはちょっと大変かも。
3.については、AbstractMethodErrorがでているので、もしかしたら、というくらいです。
あとは、エラーの出ているのがどの行か、が分かると特定しやすいかもしれないです。

投稿日時 - 2007-10-24 22:57:18

お礼

回答ありがとうございます。いろいろと試してみたのですが、

ps.setBlob(1, fi.getInputStream(), fi.getSize());
//ps.setBinaryStream(1, fi.getInputStream(), fi.getSize());

この部分でエラーが出ていたので

ps.setBytes(1, fi.get());

としたところうまく行きました。

投稿日時 - 2007-10-25 10:48:13

このQ&Aは役に立ちましたか?

1人が「このQ&Aが役に立った」と投票しています

回答(1)

あなたにオススメの質問