大家帮帮忙解决oracle大对象的问题吧。来者有分。

悠悠的爸爸 2002-09-07 09:37:28
这是在网上抄袭Brain(无缺公子)的代码,少作修改,没有结果。不改,也不能运行。请大家指出一下错误吧。

package mshtang.large;


import java.sql.*;
import java.io.*;
import oracle.sql.BLOB;
import oracle.jdbc.*;
import mshtang.html.DatabaseForHtml;

public class LargeObjectAction
{
public void orablob()
{
}
public static void insertblob()
{
try
{
//首先是将文件输入到数据库。
Class.forName("oracle.jdbc.driver.OracleDriver");//注册数据库引擎。
String dbURL = "jdbc:oracle:thin:@127.0.0.1:1521:orcl";
String user = "mshtang";
String passWord = "zixiatang";
Connection conn = DriverManager.getConnection(dbURL, user, passWord);
conn.setAutoCommit(false);//关闭自动提交,以提高性能。
Statement stmt = conn.createStatement();//建立会话
DatabaseForHtml sqlBean = new DatabaseForHtml();
String sqlStr = "";
String fileName = "";
String displayMessage 3D "";
try
{
sqlStr = "select table_name from user_tables where table_name='JPGTEST'";
if(!sqlBean.hasResult(conn, sqlStr))
{
displayMessage = (stmt.executeUpdate("create table JPGTEST (fname varchar2(600), bx blob)") == 0) ? "table created successfuly" : "table created failure";
System.out.println(displayMessage);
}
File file = new File("C:\\程序员.doc");0D fileName = file.getName();
InputStream inputStream = new FileInputStream(file);//创建输入流,将外部文件输入到InputStream 中。
sqlStr = "INSERT INTO JPGTEST VALUES (?, ?)";
PreparedStatement pstmt = conn.prepareStatement(sqlStr);
pstmt.setString(1, fileName);
pstmt.setBinaryStream(2, inputStream, inputStream.available());
pstmt.execute();
pstmt.close();
}
catch(SQLException e)
{
e.printStackTrace();0D System.out.println("数据库异常:" + e.getMessage());
}
//以下是从库中读取文件。
sqlStr = "SELECT * from JPGTEST where fname='" + fileName + "'";
System.out.println(sqlStr);
ResultSet rset = stmt.executeQuery(sqlStr);
if(rset.next())
{
BLOB blob = ((OracleResultSet)rset).getBLOB(2);//获取文件字段。
File binaryFile = new File("D:\\test\\程序员.doc");
FileOutputStream fileOutStream = new FileOutputStream(binaryFile);//创建文件输出流。
InputStream instream 3D blob.getBinaryStream();//建立输入流,并将字段comment的值以流的形式,放入instream变量。0D byte[] buffer = new byte[instream.available()];
instream.read(buffer);//将文件流存入变量buffer,以buffer为中转
fileOutStream.write(buffer, 0, buffer.length);//将buffer写入文件输出流。
instream.close();//关闭流
fileOutStream.close();
}
rset.close();
stmt.close();
conn.close();
System.out.print("ok");0D }
catch(Exception ee)
{
System.out.println(ee.getMessage());
}
}

public static void main(String args[])
{
insertblob();
}
}

================================================================

CSDN 论坛助手 Ver 1.0 B0402提供下载。 改进了很多,功能完备!

★ 浏览帖子速度极快![建议系统使用ie5.5以上]。 ★ 多种帖子实现界面。
★ 保存帖子到本地[html格式]★ 监视您关注帖子的回复更新。0D ★ 可以直接发贴、回复帖子★ 采用XML接口,可以一次性显示4页帖子,同时支持自定义每次显示帖子数量。可以浏览历史记录!
★ 支持在线检测程序升级情况,可及时获得程序更新的信息。
0A
★★ 签名 ●
可以在您的每个帖子的后面自动加上一个自己设计的签名哟。

Http://www.ChinaOK.net/csdn/csdn.zip
Http://www.ChinaOK.net/csdn/csdn.rar
...全文
169 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
悠悠的爸爸 2002-09-08
  • 打赏
  • 举报
回复
谢谢有人关注我的问题,只是才一人,不知大家为什么这么不热心。不过,现在,问题已经解决了,不用大家费心了。

我现在把正确的代码贴出来,给大家看看,效率上的问题,容后修改,欢迎大家讨论。

package mshtang.large;


import java.sql.*;
import java.io.*;
import oracle.sql.*;
import oracle.jdbc.driver.*;

import mshtang.html.DatabaseForHtml;

public class LargeObjectAction
{
public void orablob()
{
}
public static void insertblob()
{
try
{
//首先是将文件输入到数据库。
Class.forName("oracle.jdbc.driver.OracleDriver");//注册数据库引擎。
String dbURL = "jdbc:oracle:thin:@192.168.0.74:1521:orcl";
String user = "pm";
String passWord = "pm";
Connection conn = DriverManager.getConnection(dbURL, user, passWord);
conn.setAutoCommit(false);//关闭自动提交,以提高性能。
Statement stmt = conn.createStatement();//建立会话
DatabaseForHtml sqlBean = new DatabaseForHtml();
String sqlStr = "";
String fileName = "";
String displayMessage = "";
try
{
sqlStr = "select table_name from user_tables where table_name='JPGTEST'";
if(!sqlBean.hasResult(conn, sqlStr))
{
displayMessage = (stmt.executeUpdate("create table JPGTEST (fname varchar2(600), bx blob)") == 0) ? "table created successfuly" : "table created failure";
System.out.println(displayMessage);
}
File file = new File("D:\\tomcat-3.3.rar");
fileName = file.getName();
FileInputStream inStream = new FileInputStream(file);//创建输入流,将外部文件输入到InputStream 中。
byte[] buffer = new byte[inStream.available()];
sqlStr = "INSERT INTO JPGTEST VALUES ('" + fileName + "', empty_blob())";
stmt.execute(sqlStr);
ResultSet rs = stmt.executeQuery("select bx from JPGTEST where fname='" + fileName + "' for update");
if(rs.next())
{
BLOB blob = ((OracleResultSet)rs).getBLOB("bx");
OutputStream outStream = blob.getBinaryOutputStream();

int length = -1;
while((length = inStream.read(buffer)) != -1)
outStream.write(buffer);
outStream.flush();
stmt.execute("commit");
outStream.close();
System.out.println("文件成功写入数据库");
}
inStream.close();
rs.close();
}
catch(SQLException e)
{
e.printStackTrace();
System.out.println("数据库异常:" + e.getMessage());
}
//以下是从库中读取文件。
sqlStr = "SELECT * from JPGTEST where fname='" + fileName + "'";
System.out.println(sqlStr);
ResultSet rset = stmt.executeQuery(sqlStr);
if(rset.next())
{
BLOB blob = ((OracleResultSet)rset).getBLOB(2);//获取文件字段。
File binaryFile = new File("D:\\test\\" + fileName);
FileOutputStream fileOutStream = new FileOutputStream(binaryFile);//创建文件输出流。
long length = blob.getLength();
System.out.println("length=" + length);
InputStream inStream = blob.getBinaryStream();//建立输入流,并将字段bx的值以流的形式,放入inStream变量。
System.out.println("before reading :" + inStream.available());
byte[] buffer = new byte[inStream.available()];
System.out.println("before reading :" + inStream.available());
int by = inStream.read();//将文件流存入变量buffer,以buffer为中转
while(by != -1){
fileOutStream.write(by);
by = inStream.read();
}
//fileOutStream.write(buffer, 0, buffer.length);//将buffer写入文件输出流。
fileOutStream.flush();
System.out.println("文件从数据库中成功读出");
inStream.close();//关闭流
fileOutStream.close();
}
rset.close();
stmt.close();
conn.close();
// System.out.print("ok");
}
catch(Exception ee)
{
System.out.println(ee.getMessage());
}
}

public static void main(String args[])
{
insertblob();
}
}
悠悠的爸爸 2002-09-07
  • 打赏
  • 举报
回复
异常如下:

D:\JBuilder7\jdk1.3.1\bin\javaw -classpath "C:\Documents and Settings\mshtang\jbproject\myPrivateClass\classes;D:\j2sdkee1.3\lib\j2ee.jar;D:\tomcat-3.3\webapps\ROOT\WEB-INF\classes;D:\JBuilder7\jakarta-tomcat-3.3.1\lib\common\servlet.jar;D:\JBuilder7\lib\dbswing.jar;D:\JBuilder7\lib\dx.jar;D:\JBuilder7\lib\beandt.jar;D:\JBuilder7\jdk1.3.1\demo\jfc\Java2D\Java2Demo.jar;D:\JBuilder7\jdk1.3.1\jre\lib\i18n.jar;D:\JBuilder7\jdk1.3.1\jre\lib\jaws.jar;D:\JBuilder7\jdk1.3.1\jre\lib\rt.jar;D:\JBuilder7\jdk1.3.1\jre\lib\sunrsasign.jar;D:\JBuilder7\jdk1.3.1\lib\dt.jar;D:\JBuilder7\jdk1.3.1\lib\htmlconverter.jar;D:\JBuilder7\jdk1.3.1\lib\tools.jar" mshtang.large.LargeObjectAction
java.sql.SQLException: ORA-01465: 无效的十六进制数字


at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:168)

at oracle.jdbc.ttc7.TTIoer.processError(TTIoer.java:208)

at oracle.jdbc.ttc7.Oall7.receive(Oall7.java:543)

at oracle.jdbc.ttc7.TTC7Protocol.doOall7(TTC7Protocol.java:1405)

at oracle.jdbc.ttc7.TTC7Protocol.parseExecuteFetch(TTC7Protocol.java:822)

at oracle.jdbc.driver.OracleStatement.executeNonQuery(OracleStatement.java:1446)

at oracle.jdbc.driver.OracleStatement.doExecuteOther(OracleStatement.java:1371)

at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1900)

at oracle.jdbc.driver.OracleStatement.execute(OracleStatement.java:737)

at mshtang.large.LargeObjectAction.insertblob(LargeObjectAction.java:45)

at mshtang.large.LargeObjectAction.main(LargeObjectAction.java:101)

数据库异常:ORA-01465: 无效的十六进制数字


SELECT * from JPGTEST where fname='25.jpg'

悠悠的爸爸 2002-09-07
  • 打赏
  • 举报
回复
现在代码修改如下,还是有异常抛出。

package mshtang.large;


import java.sql.*;
import java.io.*;
import oracle.sql.*;
import oracle.jdbc.driver.*;

import mshtang.html.DatabaseForHtml;

public class LargeObjectAction
{
public void orablob()
{
}
public static void insertblob()
{
try
{
//首先是将文件输入到数据库。
Class.forName("oracle.jdbc.driver.OracleDriver");//注册数据库引擎。
String dbURL = "jdbc:oracle:thin:@192.168.0.74:1521:orcl";
String user = "pm";
String passWord = "pm";
Connection conn = DriverManager.getConnection(dbURL, user, passWord);
conn.setAutoCommit(false);//关闭自动提交,以提高性能。
Statement stmt = conn.createStatement();//建立会话
DatabaseForHtml sqlBean = new DatabaseForHtml();
String sqlStr = "";
String fileName = "";
String displayMessage = "";
try
{
sqlStr = "select table_name from user_tables where table_name='JPGTEST'";
if(!sqlBean.hasResult(conn, sqlStr))
{
displayMessage = (stmt.executeUpdate("create table JPGTEST (fname varchar2(600), bx blob)") == 0) ? "table created successfuly" : "table created failure";
System.out.println(displayMessage);
}
File file = new File("C:\\25.jpg");
fileName = file.getName();
FileInputStream inStream = new FileInputStream(file);//创建输入流,将外部文件输入到InputStream 中。

sqlStr = "INSERT INTO JPGTEST VALUES ('" + fileName + "', '" + BLOB.empty_lob() + "')";
stmt.execute(sqlStr);
ResultSet rs = stmt.executeQuery("select * from JPGTEST where fname='" + fileName + "' for update");
if(rs.next())
{
BLOB blob = ((OracleResultSet)rs).getBLOB(2);
OutputStream outStream = blob.getBinaryOutputStream();
byte[] buffer = new byte[blob.getChunkSize()];
int length = -1;
while((length = inStream.read(buffer)) != -1)
outStream.write(buffer, 0, length);
outStream.close();
System.out.println("文件成功写入数据库");
}
inStream.close();
rs.close();
}
catch(SQLException e)
{
e.printStackTrace();
System.out.println("数据库异常:" + e.getMessage());
}
//以下是从库中读取文件。
sqlStr = "SELECT * from JPGTEST where fname='" + fileName + "'";
System.out.println(sqlStr);
ResultSet rset = stmt.executeQuery(sqlStr);
if(rset.next())
{
BLOB blob = ((OracleResultSet)rset).getBLOB(2);//获取文件字段。
File binaryFile = new File("D:\\test\\25.jpg");
FileOutputStream fileOutStream = new FileOutputStream(binaryFile);//创建文件输出流。
long length = blob.getLength();
System.out.println("length=" + length);
InputStream inStream = blob.getBinaryStream();//建立输入流,并将字段bx的值以流的形式,放入inStream变量。
System.out.println("before reading :" + inStream.available());
byte[] buffer = new byte[inStream.available()];
System.out.println("before reading :" + inStream.available());
inStream.read(buffer);//将文件流存入变量buffer,以buffer为中转
fileOutStream.write(buffer, 0, buffer.length);//将buffer写入文件输出流。
fileOutStream.flush();
System.out.println("文件从数据库中成功读出");
inStream.close();//关闭流
fileOutStream.close();
}
rset.close();
stmt.close();
conn.close();
// System.out.print("ok");
}
catch(Exception ee)
{
System.out.println(ee.getMessage());
}
}

public static void main(String args[])
{
insertblob();
}
}
lzasp800 2002-09-07
  • 打赏
  • 举报
回复
用getObject()方法可以很好地完成。
网络咖啡 2002-09-07
  • 打赏
  • 举报
回复
up

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧