gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 13:15:38 24 4
gpt4 key购买 nike

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

}

最佳答案

有一些事情会跳出来......

您创建一个 PreparedStatement PreparedStatement ps = con.prepareStatement("insert into photovalues(?,?)"); 但仅绑定(bind)单个值 ps.setBinaryStream(3, fin, len); 甚至没有有效的参数...

需要从查询中排除 photoID 参数,或者需要将值绑定(bind)到该参数。

假设 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) {
}
}

关于java - 如何使用 SQL 浏览图像并将其保存到 Oracle DB 中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22497083/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com