4

シンプルなインターフェイス (jsf 1.2 およびリッチフェイス 3.3.2、Oracle 11g R1) を使用して、ユーザーが rich:fileUpload で画像を選択し、テーブルに保存できるようにしています。テストとして、次の表を作成しました。

CREATE TABLE TEST
(
 MIME_TYPE VARCHAR2 (1000),
 PHOTO BLOB,
 STUDENT_ID NUMBER NOT NULL
)

画像を BLOB フィールドに保存するコード スニペットは次のとおりです。

//......From the uploadFile Listener
public void listener(UploadEvent event) throws Exception {
...      
item = event.getUploadItem();
...
StudentPhotoDAO dao = new StudentPhotoDAO();
dao.storePhoto(item.getData(),item.getContentType(),studentId);
...
}


//......From the PhotoDAO ..........................


public void storePhoto(byte data[],String mimeType, Long studentId){
{
 ...
  ByteArrayInputStream bis=new ByteArrayInputStream(data);
  String query = "update  TEST set PHOTO = ? ,MIME_TYPE = ?  where STUDENT_ID=?";
  pstmt = conn.prepareStatement(query);
  pstmt.setAsciiStream(1,(InputStream)bis,data.length);
  pstmt.setString(2,mimeType.toString());
  pstmt.setLong(3,studentId);
  pstmt.executeUpdate();
 }

次のエラーが表示されます。

java.sql.SQLException: ORA-01461: can bind a LONG value only for insert into a LONG column

コードのどこにエラーがありますか。

ありがとう。

4

5 に答える 5

1

にマップされているように見えるstudent_idasを指定します。たとえば、この表を参照してください。numberBigInteger

を指定するかBigInteger、 のタイプを変更する必要がありますstudent_id

于 2012-07-09T11:10:49.177 に答える
1

OracleのLONG型の説明を見てください:「LONGは文字データを格納するためのOracleデータ型です...」。したがって、LONG は Oracle の数値ではありません。テキストです。

これが原因でこのエラーが発生したと思います: pstmt.setAsciiStream(1,(InputStream)bis,data.length);

pstmt.setBinaryStream(int, InputStream, int)またはを使用してみてくださいpstmt.setBinaryStream(int, InputStream, long)

于 2013-03-14T13:07:39.167 に答える
0

あなたが呼んでいます

pstmt.setLong(3,studentId);

列を次のように指定しました

STUDENT_ID NUMBER NOT NULL

そしてどのようにドキュメントが言うか:

LONG データ型の値を別のデータ型に挿入しようとしました。これは許可されていません。

したがって、次のようにします。

STUDENT_ID INTEGER NOT NULL
pstmt.setInt(3, studentId);
于 2012-07-09T19:40:08.293 に答える
0

Oracle で大きなバイナリ ストリームを BLOB 列にバインドする場合は、またはPreparedStatement.setBlob()ではなくを使用します。setAsciiStream()setBinaryStream()

于 2014-12-08T22:36:25.753 に答える