如何使用SQL浏览并将图像保存到Oracle DB中?

时间:2014-03-19 05:32:44

标签: java sql oracle jdbc runtime-error

我正在使用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

}

1 个答案:

答案 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) {
    }
}