`

循环读取图片入库

    博客分类:
  • java
阅读更多

 

工作总结备份,见代码如下:

 

package com.yusj;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;

public class TestImage {

	private static Connection conn = null;
	private static Statement stmt = null;
	private ResultSet rs = null;

	static {
		try {
			// 加载Oracle驱动
			Class.forName("oracle.jdbc.driver.OracleDriver");
			// 获得连接
			conn = DriverManager.getConnection(
					"jdbc:oracle:thin:@10.117.10.5:1521:dqjz1", "jwzh",
					"jwzh");
			stmt = conn.createStatement();
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}

	/**
	 * 关闭所有与数据库相关的连接
	 * 
	 * @param conn
	 * @param stmt
	 * @param rs
	 */
	public void closeAll(ResultSet rs, Statement stmt, Connection conn) {
		if (rs != null) {
			try {
				rs.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
		if (stmt != null) {
			try {
				stmt.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
		if (conn != null) {
			try {
				conn.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
	}

	/**
	 * 读取图片并入库
	 */
	public void insertDB() {
		// 历史表与路径表关联查询
		String sql = " select rownum, t2.oldfwbh, t2.olddybh, t2.oldbzdzbm, t1.tplj,t2.newfwbh from test_jgt t1, test_jgt_lsb_20130401 t2 where t1.fwbh = t2.oldfwbh and t1.sfdrcg='0' ";  
		String dir = "";
		String[][] res;
		try {
			res = querySql(conn, sql);
			if (res != null) {
				// 循环取出照片
				for (int i = 0; i < res.length; i++) {
					dir = "C:\\test\\images\\images";
					dir += "\\" + res[i][3] + "\\" + res[i][2] + "\\"
							+ res[i][1] + "\\" + res[i][4];
					// 获得fjbh(主键)
					String seqId = getSequenceValue("SEQ_COMMON_SERIVAL_NUMBER",conn) ;
					//String seqId = "1" ;
					System.out.println(seqId+"----"+dir);
					// 逐个插入
					String[] args = {seqId,res[i][5],res[i][4],"image/pjpeg",res[i][1]} ;
					inputImage(args,dir) ;
				}
			}
		} catch (SQLException e) {
			e.printStackTrace();
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			// 关闭相应数据库连接
			closeAll(rs, stmt, conn);
		}
	}

	/**
	 * 向数据库中插入图片
	 * @param args
	 * @param impImageDir
	 */
	public void inputImage(String[] args, String impImageDir) {
		try {
			
			conn.setAutoCommit(false);// 取消自动提交功能
			OutputStream os = null;
			// 插入一个空对象empty_blob()
			//stmt.executeUpdate("insert into image_lob (t_id, t_image) values ('"+args[0]+"', empty_blob())");
			stmt.executeUpdate("insert into test_attachment (fjbh, dah, filename, data, cjsj, fjlx) values ('"+args[0]+"','"+args[1]+"','"+args[2]+"', empty_blob(), sysdate, '"+args[3]+"')");
			
			// 锁定数据行进行更新,注意"for update"语句 
			//rs = stmt.executeQuery("select t_image from image_lob where t_id='" + args[0] + "' for update");
			rs = stmt.executeQuery("select data from test_attachment where fjbh='" + args[0] + "' for update");
			
			if (rs.next()) {
				// 得到java.sql.Blob对象后强制转换为oracle.sql.BLOB
				oracle.sql.BLOB blob = (oracle.sql.BLOB) rs.getBlob("data");
				// 通过getBinaryOutputStream()方法获得向数据库中插入图片的"管道"
				os = blob.getBinaryOutputStream();
				// 读取想要存储的图片文件
				InputStream is = new FileInputStream(impImageDir);
				// 依次读取流字节,并输出到已定义好的数据库字段中.
				int i = 0;
				while ((i = is.read()) != -1) {
					os.write(i);
				}
			}
			os.flush();
			os.close();
			// 图片入库成功
			stmt.executeUpdate("update test_jgt set sfdrcg='1' where fwbh = '"+args[4]+"'") ;
			conn.commit();
			conn.setAutoCommit(true);// 恢复现场
		} catch (SQLException e) {
			e.printStackTrace();
			try {
				conn.rollback();
			} catch (SQLException e1) {
				// TODO Auto-generated catch block
				e1.printStackTrace();
			}
		} catch (IOException e) {
			//e.printStackTrace();
			try {
				conn.rollback();
				// 本地图片不存在
				stmt.executeUpdate("update test_jgt set sfdrcg='2' where fwbh = '"+args[4]+"'") ;
				conn.commit();
			} catch (SQLException e1) {
				e1.printStackTrace();
			}
		}
	}

	/**
	 * 从数据库里检索出图片
	 */
	public void outputImage() {
		try {
			String sql = "select image from t_image where id=1";
			stmt = conn.createStatement();
			rs = stmt.executeQuery(sql);
			if (rs.next()) {
				oracle.sql.BLOB b = (oracle.sql.BLOB) rs.getBlob(1);
				InputStream is = b.getBinaryStream();
				FileOutputStream fos = new FileOutputStream(
						"E:\\outputImage.jpg");
				int i = 0;
				while ((i = is.read()) != -1) {
					fos.write(i);
				}
				fos.flush();
				fos.close();
				is.close();
			}
		} catch (SQLException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			closeAll(rs, stmt, conn);
		}
	}

	/**
	 * 执行查询语句,获得返回结果
	 * @param conn
	 * @param sql
	 * @return
	 * @throws SQLException
	 * @throws Exception
	 */
	public String[][] querySql(Connection conn, String sql)
			throws SQLException, Exception {
		if (sql == null)
			throw new Exception("无效的SQL语句!");
		if (conn == null)
			throw new Exception("获取数据库连接失败!");
		conn.setAutoCommit(false);
		ResultSet rs = null;
		Statement stmt = null;
		ResultSetMetaData md = null;

		ArrayList aList = new ArrayList();
		int rows = 0, cols;
		try {
			stmt = conn.createStatement();
			rs = stmt.executeQuery(sql);
			md = rs.getMetaData();
			cols = md.getColumnCount();
			while (rs.next()) {
				String[] row = new String[md.getColumnCount() + 1];
				for (int i = 0; i < md.getColumnCount(); i++) {
					row[i] = rs.getString(i + 1);
				}
				aList.add(row);
			}
			rs.close();
			rs = null;
			stmt.close();
			stmt = null;
		} catch (SQLException e) {
			e.printStackTrace(System.out);
			throw new SQLException("#71:" + e.toString());
		} catch (Exception e) {
			e.printStackTrace(System.out);
			throw e;
		} finally {
			if (stmt != null)
				stmt.close();
			stmt = null;
		}

		rows = aList.size();
		if (rows == 0 || cols == 0) {
			aList.clear();
			aList = null;
			return null;
		}
		String[][] res = new String[rows][cols];
		for (int i = 0; i < rows; i++) {
			Object[] row = (Object[]) aList.toArray()[i];
			for (int j = 0; j < cols; j++) {
				if (row[j] == null)
					res[i][j] = new String("");
				else
					res[i][j] = new String(row[j].toString());
			}
		}
		aList.clear();
		aList = null;
		return res;
	}

	/**
	 * 获得序列
	 * @param seqname
	 * @param conn
	 * @return
	 * @throws SQLException
	 */
	public static String getSequenceValue(String seqname, Connection conn)
			throws SQLException {
		ResultSet rs = null;
		Statement stmt = null;
		String res = null;
		try {
			stmt = conn.createStatement();
			rs = stmt.executeQuery("select " + seqname + ".nextval from dual");
			if (rs.next()) {
				res = rs.getString(1);
			}
			rs.close();
			rs = null;
			stmt.close();
			stmt = null;
		} catch (SQLException e) {
			e.printStackTrace(System.out);
			throw e;
		}
		return res;
	}

	public static void main(String[] args) {
		// 从硬盘提取图片插入到数据库中
		// new TestImage().inputImage();
		// 从数据库中检索图片到硬盘
		// new TestImage().outputImage();
		new TestImage().insertDB();
	}
}

 

 

 

 

0
0
分享到:
评论

相关推荐

    基于C#利用S7.net库与西门子S7-1200PLC进行通信的具体方法(利用线程循环读取).docx

    在本文档中,我们将深入探讨如何使用C#编程语言,结合S7.net库与西门子S7-1200 PLC进行通信,并利用线程循环读取数据。首先,确保PLC设置允许PUT/GET通信访问,并取消优化的块访问,以便查看变量的偏移量。 在...

    ASP读取本地Excel、Word文件转成html入库

    数据可以是表格形式,通过循环遍历Recordset,将其存储在变量中。 4. **读取Word文件**:类似地,使用Word的COM对象,可以打开Word文档并访问其内容。通过遍历文档的段落或形状,提取文本或图像数据。 5. **转换为...

    使用递归循环读取省市区json文件数据,并保存到数据库中

    例如,`json.load()`函数用于将JSON格式的文本数据读取为Python对象,`json.dumps()`则将Python对象转换为JSON字符串。在本例中,我们需要读取的JSON文件可能包含省市区的层级结构,如中国-&gt;省份-&gt;城市-&gt;区县,这种...

    delphi读数据库图片与批量图片入库源码

    以上就是在Delphi 2010中读取数据库中的图片和批量入库图片的基本过程。实际应用中,可能还需要考虑错误处理、数据库事务管理、性能优化等细节。提供的"Projects"文件可能包含了实现这些功能的具体源代码,通过分析...

    读取execl文件,并写入 Oracle

    6. **执行批量插入**:开启事务,使用Oracle数据库的批处理功能,循环遍历Excel数据,为每个行数据创建一个参数化SQL命令,并执行插入操作。这样可以提高数据导入的效率。 7. **错误处理**:在整个过程中,应捕获...

    C#读取Excel内容入库MYSQL数据库客户端操作,(支持切换为MSSQL Oracle )

    3. **遍历工作表和行**: 通过循环遍历每个工作表,然后逐行读取数据。每一行的数据可以存储在一个`List&lt;string&gt;`或其他适当的数据结构中。 4. **构建数据库连接**: 使用ADO.NET或MySql.Data创建数据库连接字符串,...

    php读取xls文件内容

    1. **引入库**: 首先,在你的PHP脚本中引入所需的类库。 ```php use PhpOffice\PhpSpreadsheet\IOFactory; ``` 2. **加载文件**: 使用`IOFactory::load()`方法加载XLS文件。确保文件路径正确。 ```php $...

    【PLC课程设计】车辆出入库管理系统.pdf

    PLC的工作循环包括输入刷新、程序执行和输出刷新三个阶段。输入刷新阶段读取输入设备的状态;程序执行阶段根据梯形图逻辑计算输出状态;输出刷新阶段更新输出设备的状态。 2. 车辆出入库管理系统的构成: 系统由...

    android二维码入库

    4. **实时扫描(Continuous Scanning)**:实现连续扫描,通常需要开启一个循环或使用SurfaceView来持续捕获相机预览图像,并在后台不断分析图片以检测二维码。 5. **数据存储**:扫描结果通常会被保存到本地,此处...

    c实现dbf文件入库

    3. **处理记录数据**:虽然示例代码中未完整展示,但通常涉及逐行读取数据并将其转换为相应的数据类型,再进行数据库入库操作。 ### 数据库入库操作 代码中使用了SQL*Loader工具来执行入库操作。SQL*Loader是...

    php读取excel类

    6. **循环遍历数据**:如果你想要读取整个工作表的数据,可以使用迭代器: ```php foreach ($worksheet-&gt;getRowIterator() as $row) { $cellIterator = $row-&gt;getCellIterator(); $cellIterator-&gt;...

    C语言大作业——产品入库操作管理系统(常工院)

    4. 流程控制:为了实现入库操作的逻辑,如检查库存、计算总价、更新库存状态等,需要使用条件语句(if-else)、循环(for、while)等流程控制结构。 5. 函数编程:通过封装不同的功能到函数中,可以使代码更模块化...

    php读取xls文件

    5. **遍历单元格数据**:通过循环遍历行和列来获取单元格的值: ```php $highestRow = $worksheet-&gt;getHighestRow(); // 获取最后一行号 $highestColumn = $worksheet-&gt;getHighestColumn(); // 获取最后一列的...

    车辆出入库管理PLC专业系统设计.doc

    工作原理是通过循环扫描的方式不断读取输入信号,执行预编写的程序,然后更新输出状态。在车辆出入库管理中,PLC扮演着核心控制器的角色。 车辆出入库管理系统主要由以下几个部分组成: 1. 光传感器:作为数据采集...

    matlab车牌出入库计费系统(教程,系统框架GUI).rar

    本教程将详尽地讲解以上各环节,从理论到实践,从基本的MATLAB语法到高级的图像处理和数据库操作,逐步引领读者构建一个完整的车牌出入库计费系统。无论你是MATLAB初学者还是有一定经验的开发者,都能从中受益,提升...

    车辆出入库管理PLC系统设计.doc

    - 循环扫描:PLC不断读取输入状态,执行用户程序,更新输出状态,形成一个周期性的扫描过程。 - 状态转移:根据程序逻辑,PLC会根据输入状态改变输出状态。 4. 车辆出入库管理系统构成: - 光传感器:作为主要的...

    VB 仓库管理系统 入库 出库 TXT文件顺序操作.rar

    例如,可以使用Select Case或If...Then语句进行条件判断,Array函数创建数组,Sort函数(自定义实现)进行排序,以及For Each循环进行遍历。 总的来说,这个VB 仓库管理系统巧妙地利用了TXT文件进行数据存储,结合...

    使用Python读取Excel数据的教程.docx

    1. **导入库** ```python import pandas as pd ``` 2. **读取Excel文件** - **单个工作表**:默认情况下,`read_excel`函数会读取第一个工作表。 ```python df = pd.read_excel('data.xlsx') ``` - **指定...

    c++课程设计-产品入库管理操作系统.zip

    9. **控制结构**:在处理用户输入和执行流程时,会用到条件语句(如`if...else`)和循环(如`for`、`while`)。 10. **设计模式**:虽然对于课程设计项目不一定需要深入应用设计模式,但理解如单例模式(用于管理...

Global site tag (gtag.js) - Google Analytics