我正在使用Java / Swing / Oracle 10g数据库和员工管理系统
有一个名为photo的表格,其中photoID
为数字,photo
为blob,我使用JFileChooser
打开并显示照片,但不会将其保存到我的数据库中。
java.sql.SQLException: Invalid column index
enter code here
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
/*
* Photo.java
*
* Created on Mar 18, 2014, 5:51:22 PM
*/
package ems;
import java.io.*;
import javax.swing.ImageIcon;
import javax.swing.JFileChooser;
import java.sql.*;
/**
*
* @author css102134
*/
public class Photo extends javax.swing.JFrame {
/** Creates new form Photo */
public Photo() {
initComponents();
}
/** This method is called from within the constructor to
* initialize the form.
* WARNING: Do NOT modify this code. The content of this method is
* always regenerated by the Form Editor.
*/
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">
private void initComponents() {
Jlabel = new javax.swing.JLabel();
browseButton = new javax.swing.JButton();
jLabel2 = new javax.swing.JLabel();
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
Jlabel.setText("choose file:");
browseButton.setText("browse");
browseButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
browseButtonActionPerformed(evt);
}
});
jLabel2.setText("photo");
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
getContentPane().setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addGap(33, 33, 33)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
.addComponent(jLabel2)
.addComponent(Jlabel))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(browseButton)
.addContainerGap(241, Short.MAX_VALUE))
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addGap(28, 28, 28)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(Jlabel)
.addComponent(browseButton))
.addGap(29, 29, 29)
.addComponent(jLabel2)
.addContainerGap(206, Short.MAX_VALUE))
);
pack();
}// </editor-fold>
private void browseButtonActionPerformed(java.awt.event.ActionEvent evt) {
JFileChooser fc = new JFileChooser();
fc.showOpenDialog(this);
File f = fc.getSelectedFile();
String path = f.getAbsolutePath();
Jlabel.setIcon(new ImageIcon(path));
try
{
Class.forName("oracle.jdbc.driver.OracleDriver");
String url="jdbc:oracle:thin:@localhost:1521:XE";
String u="ems2";
String p="ems2";
Connection con = DriverManager.getConnection(url,u,p);
PreparedStatement ps = con.prepareStatement("insert into photo (photos) values(?)");
FileInputStream fin=new FileInputStream("D:/Workspace/ems_ui/photos/prasanth.jpg");
System.out.println("hi");
ps.setBinaryStream(3, fin);
int status = ps.executeUpdate();
if(status>0)
{
jLabel2.setText("successfully inserted in Db");
}
else
{
jLabel2.setText("Image not inserted in Db");
}
con.close();
}
catch(Exception e)
{
System.out.println(e);
}
}
/**
* @param args the command line arguments
*/
public static void main(String args[]) {
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new Photo().setVisible(true);
}
});
}
// Variables declaration - do not modify
private javax.swing.JLabel Jlabel;
private javax.swing.JButton browseButton;
private javax.swing.JLabel jLabel2;
// End of variables declaration
}
答案 0 :(得分:1)
有一些东西跳出来......
您创建了PreparedStatement
PreparedStatement ps = con.prepareStatement("insert into photo values(?,?)");
,但只绑定了一个值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) {
}
}