java.sql.SQLException:ORA-01461:只能为插入到长列中绑定长值
我使用一个简单的界面(在JSF1.2和RichFaces3.3.2、Oracle11GR1中)让用户通过rich:fileUpload选择图片并保存在表中。 作为测试,我创建了下表java.sql.SQLException:ORA-01461:只能为插入到长列中绑定长值,java,jdbc,oracle11g,blob,Java,Jdbc,Oracle11g,Blob,我使用一个简单的界面(在JSF1.2和RichFaces3.3.2、Oracle11GR1中)让用户通过rich:fileUpload选择图片并保存在表中。 作为测试,我创建了下表 CREATE TABLE TEST ( MIME_TYPE VARCHAR2 (1000), PHOTO BLOB, STUDENT_ID NUMBER NOT NULL ) 将图片保存到BLOB字段的代码片段如下所示 //......From the uploadFile Listener public v
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
请问代码中的错误在哪里
谢谢。您将
学生id
指定为编号
,它似乎映射到大整数
。见例
您可以提供一个biginger
,或者您需要更改正在调用的student\u id
的类型
pstmt.setLong(3,studentId);
您将列指定为
STUDENT_ID NUMBER NOT NULL
医生是怎么说的:
试图将长数据类型中的值插入到
另一个数据类型。这是不允许的
就这样吧:
STUDENT_ID INTEGER NOT NULL
pstmt.setInt(3, studentId);
看看:
“LONG是用于存储字符数据的Oracle数据类型…”。甲骨文中的数字不是那么长。这是一篇课文
我想你之所以会犯这个错误是因为:
pstmt.setascistream(1,(InputStream)bis,data.length)代码>
尝试使用pstmt.setBinaryStream(int,InputStream,int)
或pstmt.setBinaryStream(int,InputStream,long)
将大型二进制流绑定到Oracle中的BLOB列时,请使用PreparedStatement.setBinaryStream()
而不是setascistream()
或setBinaryStream()
我想应该归咎于使用ASCII流
pstmt.setAsciiStream(1, (InputStream) bis, data.length);
试一试
(看起来Oracle将带有长度参数的ASCII流解释为长度不能超过4000字节。但这只是一个未经证实的猜测。)SQL类型编号似乎与Java类型LONG不兼容。在Oracle中,LONG是文本类型,而不是数字类型。这些答案中的大多数都找错了地方。谢谢你的回复。我确实把学生id转换成了BigInteger。但如何将其映射到preparedStatement参数。由于没有pstmt.setBigInteger方法…使用了此错误,但错误相同:biginger bi=biginger.valueOf(studentId.longValue());String query=“更新测试集照片=?,MIME_类型=?其中STUDENT_ID=“+bi+”;试着用setObject()
instead来设置它。你能输入一些代码吗?如何使用setObject()(我在这里是初学者)不能更改数字的列。(这是一种强迫,我可以告诉你,但我必须*我会告诉你的;)。整数oracle数据类型相当于数字(28)。这里的问题与第一个绑定值有关,而不是第三个…pstmt。当数据超过4000时,setBinaryStream(int,InputStream,int)抛出相同的异常bytes@AjaySharma,证明plz。我无法在测试中重现它。
pstmt.setBinaryStream(1, new ByteArrayInputStream(data));