package com.nfwork.dbfound.model.bean; import java.io.File; import java.io.FileOutputStream; import java.io.InputStream; import java.io.OutputStream; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.ResultSetMetaData; import java.sql.SQLException; import java.util.Map; import com.nfwork.dbfound.core.Context; import com.nfwork.dbfound.db.dialect.SqlDialect; import com.nfwork.dbfound.exception.DBFoundPackageException; import com.nfwork.dbfound.exception.ParamNotFoundException; import com.nfwork.dbfound.util.DBUtil; import com.nfwork.dbfound.util.ParseUtil; import com.nfwork.dbfound.util.UUIDUtil; import com.nfwork.dbfound.web.file.FileUtil; public class QuerySql extends SqlEntity { private static final long serialVersionUID = -8182147424516469176L; public void execute(Context context, Map<String, Param> params, String provideName) { Connection conn = context.getConn(provideName); SqlDialect dialect = context.getConnDialect(provideName); // 2012年8月14日22:01:04 添加静态参数设置 sql = ParseUtil.parse(sql, params); // end 添加 String esql = getExecuteSql(sql, params); // 方言处理 esql = dialect.parseSql(esql); PreparedStatement statement = null; ResultSet dataset = null; try { statement = conn.prepareStatement(esql); // 参数设定 initParam(statement, sql, params); dataset = statement.executeQuery(); ResultSetMetaData metaset = dataset.getMetaData(); if (dataset.next()) { for (int i = 1; i <= metaset.getColumnCount(); i++) { String value = dataset.getString(i); String columnName = metaset.getColumnLabel(i).toLowerCase(); Param param = params.get(columnName); if (param == null) { throw new ParamNotFoundException("param: " + columnName + " 没有定义"); } String paramType = param.getDataType(); if ("varchar".equals(paramType)) { param.setValue(value); } else if ("number".equals(paramType)) { if (value == null || value.endsWith(".0") || value.indexOf(".") == -1) { param.setValue(dataset.getLong(i)); } else { param.setValue(dataset.getDouble(i)); } } else if ("file".equals(paramType)) { blobExecute(columnName, dataset, params, param, i); } param.setSourcePathHistory("querySql"); } } } catch (SQLException e) { throw new DBFoundPackageException("querySql执行异常:" + e.getMessage(), e); } finally { DBUtil.closeResultSet(dataset); DBUtil.closeStatement(statement); log(esql, params); } } private void blobExecute(String columnName, ResultSet dataset, Map<String, Param> params, Param param, int index) { try { if ("out".equals(param.getIoType())) { if ("db".equals(param.getFileSaveType())) { OutputStream out = null; InputStream in = dataset.getBinaryStream(index); try { if (in != null) { String fileName = UUIDUtil.getUUID() + ".dbf"; File file = new File(FileUtil .getUploadFolder(null), fileName); out = new FileOutputStream(file); byte b[] = new byte[2048]; int i = in.read(b); while (i != -1) { out.write(b, 0, i); i = in.read(b); } param.setValue(file); } } finally { if (in != null) { in.close(); } if (out != null) { out.flush(); // 输入完毕,清除缓冲 out.close(); } } } else { param.setValue(dataset.getString(index)); } } } catch (Exception e) { throw new DBFoundPackageException("lob 字段处理异常:" + e.getMessage(), e); } } }