Java 如何使用SQL浏览图像并将其保存到Oracle数据库中?

Java 如何使用SQL浏览图像并将其保存到Oracle数据库中?,java,sql,oracle,jdbc,runtime-error,Java,Sql,Oracle,Jdbc,Runtime Error,我正在使用Java/Swing/Oracle 10g数据库和 有一个名为photo的表,其编号为photoID,blob为photo,我正在使用JFileChooser打开并显示一张照片,但它不会将其保存到我的数据库中 错误 代码 在此处输入代码 /* *要更改此模板,请选择工具|模板 *然后在编辑器中打开模板。 */ /* *Photo.java * *创建于2014年3月18日下午5:51:22 */ 包装ems; 导入java.io.*; 导入javax.swing.ImageIcon;

我正在使用Java/Swing/Oracle 10g数据库和
有一个名为photo的表,其编号为
photoID
,blob为
photo
,我正在使用
JFileChooser
打开并显示一张照片,但它不会将其保存到我的数据库中

错误 代码
在此处输入代码
/*
*要更改此模板,请选择工具|模板
*然后在编辑器中打开模板。
*/
/*
*Photo.java
*
*创建于2014年3月18日下午5:51:22
*/
包装ems;
导入java.io.*;
导入javax.swing.ImageIcon;
导入javax.swing.JFileChooser;
导入java.sql.*;
/**
*
*@作者css102134
*/
公共类Photo扩展了javax.swing.JFrame{
/**创建新表单照片*/
公众照片(){
初始化组件();
}
/**此方法从构造函数中调用,以
*初始化表单。
*警告:请勿修改此代码。此方法的内容为
*始终由表单编辑器重新生成。
*/
@抑制警告(“未选中”)
// 
私有组件(){
Jlabel=newjavax.swing.Jlabel();
browseButton=newjavax.swing.JButton();
jLabel2=newjavax.swing.JLabel();
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
setText(“选择文件:”);
setText(“浏览”);
addActionListener(新java.awt.event.ActionListener()){
public void actionPerformed(java.awt.event.ActionEvent evt){
执行浏览按钮操作(evt);
}
});
jLabel2.setText(“照片”);
javax.swing.GroupLayout=newjavax.swing.GroupLayout(getContentPane());
getContentPane().setLayout(布局);
layout.setHorizontalGroup(
createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addGap(33,33,33)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.training)
.addComponent(jLabel2)
.addComponent(Jlabel))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(浏览按钮)
.addContainerGap(241,简称最大值))
);
layout.setVerticalGroup(
createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addGap(28,28,28)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(Jlabel)
.addComponent(浏览按钮))
.addGap(29,29,29)
.addComponent(jLabel2)
.addContainerGap(206,简称最大值))
);
包装();
}// 
私有void browseButtonActionPerformed(java.awt.event.ActionEvent evt){
JFileChooser fc=新的JFileChooser();
fc.showOpenDialog(本);
文件f=fc.getSelectedFile();
字符串路径=f.getAbsolutePath();
Jlabel.setIcon(新图像图标(路径));
尝试
{
类forName(“oracle.jdbc.driver.OracleDriver”);
String url=“jdbc:oracle:thin:@localhost:1521:XE”;
字符串u=“ems2”;
字符串p=“ems2”;
Connection con=DriverManager.getConnection(url、u、p);
PreparedStatement ps=con.prepareStatement(“插入照片(照片)值(?));
FileInputStream fin=newfileinputstream(“D:/Workspace/ems_ui/photos/prasanth.jpg”);
System.out.println(“hi”);
ps.setBinaryStream(3,fin);
int status=ps.executeUpdate();
如果(状态>0)
{
jLabel2.setText(“成功插入数据库”);
}
其他的
{
jLabel2.setText(“图像未插入数据库”);
}
con.close();
}
捕获(例外e)
{
系统输出打印ln(e);
}
}
/**
*@param指定命令行参数
*/
公共静态void main(字符串参数[]){
invokeLater(new Runnable()){
公开募捐{
新照片().setVisible(true);
}
});
}
//变量声明-不修改
私有javax.swing.JLabel JLabel;
私有javax.swing.JButton浏览器按钮;
私有javax.swing.JLabel jLabel2;
//变量结束声明
}

有一些东西会跳出来

创建一个
PreparedStatement
PreparedStatement ps=con.preparest陈述(“插入到照片值(?,)”)但仅绑定单个值
ps.setBinaryStream(3,fin,len)甚至不是一个有效的参数

photoID
参数需要从查询中排除,或者需要将值绑定到参数

假设ID是由数据库自动生成的,那么您可以使用

PreparedStatement ps = con.prepareStatement("insert into photo (photo) values(?)");
ps.setBinaryStream(1, fin);
如果不是,你需要使用更像

PreparedStatement ps = con.prepareStatement("insert into photo (photoID, photo) values(?, ?)");
ps.setInt(1, id);
ps.setBinaryStream(2, fin);
而且,您永远不会关闭流,这会使资源保持打开状态,并防止它们被标记为进行垃圾收集。黄金法则,如果你打开它,你就关闭它

如果您使用的是Java 7

try (FileInputStream fin = new FileInputStream(f); Connection con = DriverManager.getConnection(url, u, p)) {...
否则

FileInputStream fin = null;
Connection con = null;
try {
    fin = new FileInputStream(f);
    con = DriverManager.getConnection(url, u, p);
    //...
} catch (...) {
    //..
} finally {
    try {
        fin.close();
    } catch (Excepiton exp) {
    }
    try {
        con.close();
    } catch (Excepiton exp) {
    }
}

我看不到saveButtonActionPerformed(evt);函数实现在您的帖子中出现,但您正在调用该方法..该方法代码在哪里?.java.sql.SQLException:无效列索引是错误我在gettingHi@Stunner我想保留保存按钮,但我在browse中实现了保存操作我认为Hi@madProgrammer,现在我正确地关闭了连接,我已经使photoid自动生成,并从3开始使用序列和触发器,当我使用ps.setBinaryStream(1,fin);此语句及其添加显示了线程“AWT-EventQueue-0”java.lang.AbstractMethodError:oracle.jdbc.driver.T4CPreparedStatement.setBinaryStream(ILjava/io/InputStream;您是否尝试过
ps.setBinaryStream(int,InputStream,long);
像原始代码一样?您可能还需要打开
try (FileInputStream fin = new FileInputStream(f); Connection con = DriverManager.getConnection(url, u, p)) {...
FileInputStream fin = null;
Connection con = null;
try {
    fin = new FileInputStream(f);
    con = DriverManager.getConnection(url, u, p);
    //...
} catch (...) {
    //..
} finally {
    try {
        fin.close();
    } catch (Excepiton exp) {
    }
    try {
        con.close();
    } catch (Excepiton exp) {
    }
}