4

我正在使用一个简单的界面(在 jsf 1.2 和 Rich faces 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 number,它似乎映射到BigInteger. 参见例如这张表

您要么提供 a 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 回答
0

我想使用 ASCII 流是罪魁祸首。

pstmt.setAsciiStream(1, (InputStream) bis, data.length);

尝试

pstmt.setBinaryStream(1, new ByteArrayInputStream(data));

(看起来 Oracle 将带有长度参数的 ASCII 流解释为不能超过 4000 字节的 LONG。但这只是一个未经证实的猜测。)

于 2017-05-18T17:12:44.027 回答