Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1608599
  • 博文数量: 585
  • 博客积分: 14610
  • 博客等级: 上将
  • 技术积分: 7402
  • 用 户 组: 普通用户
  • 注册时间: 2008-05-15 10:52
文章存档

2013年(5)

2012年(214)

2011年(56)

2010年(66)

2009年(44)

2008年(200)

分类: Java

2008-05-30 23:15:17




  【注】本文是斑竹从JDBC & Transaction版摘录广大站友的提问以及各种解答整理而来,如果您认为本文的内容已触犯了您的权益,请联系管理员进行修改。

1、[分享错误]Oracle long raw 类型字段读取问题

【问题描述】
  项目中用到了long raw 类型字段用于存放配置文件内容,一直相安无事。突然有一天需要修改设计,增加了一个字段"group_name",问题来了,读取long raw字段总是提是“流已关闭”,经过一番较量,才算解决,在此和大家分享一下。

  系统环境:windows 2003 enterprise/Oracle 9.2.1.0

原表结构:
create table bt_defination
(
  id number(32) not null,
  name varchar2(100) not null,
  data long raw not null,
  project_id number(32) not null,
  primary key(id)
)

具体执行步骤如下:
getConnection()....
createStatement()....
executeQuery("select * from bt_defination");
while(res.next())
{
  res.getLong("id");
  res.getString("name");
  res.getBytes("data");
  res.getLong("project_id");
}

执行一切正常。

【下面即为修改后执行出错的情况】
  修改后的表结构(增加了一个字段group_name,扩充为主键):

create table bt_defination
(
  id number(32) not null,
  name varchar2(100) not null,
  data long raw not null,
  group_name varchar(20) not null,
  project_id number(32) not null,
  primary key(id,name)
)

执行步骤修改为:
具体执行步骤如下:

getConnection()....
createStatement()....
executeQuery("select * from bt_defination");
while(res.next())
{
  res.getLong("id");
  res.getString("group_name");//new added
  res.getString("name");
  res.getBytes("data");
  res.getLong("project_id");
}

结果显示:SQLException("流已关闭")
分析修改前后,并无不妥之处,只是增加了一个字段而已。

【解决办法】
  修改sql语句-〉executeQuery("select id,group_name,name,data,project_id from bt_defination");
执行一切正常!

【错误分析】
  原来是select列表和res的get顺序不一致(这种问题在不含二进制字段的查询中不存在)。
得出结论——对于包含二进制字段的查询操作,需要严格按照select列表的顺序读取,对于select * from ...的情况,默认顺序时间表语句的字段顺序。
  或者更严格的说,二进制字段的数据可以提前读取,但是绝对不能延后。举个例子:

getConnection()....
createStatement()....
executeQuery("select id,group_name,name,data,project_id from bt_defination");
while(res.next())
{
  res.getBytes("data");//up 
  res.getLong("id");
  res.getString("group_name");//new added
  res.getString("name");
  res.getLong("project_id");
}
data字段提前读取也是完全可以的。

2、往mysql里插入Clob字段

【示例】

import java.io.*;
import java.sql.*;
                                                                              
public class DBTest {
    public static void main(String[] args) {
        String driver = "com.mysql.jdbc.Driver";
        String url = "jdbc:mysql://localhost:3306/upload?useUnicode=true&characterEncoding=Big5";
        String user = "caterpillar";
        String password = "123456";
        try {
            Class.forName(driver);
            Connection conn = DriverManager.getConnection(url, user, password);

           
            File file = new File("./logo_phpbb.jpg");
            int length = (int) file.length();
            InputStream fin = new FileInputStream(file);
           
            PreparedStatement pstmt = conn.prepareStatement(
                       "INSERT INTO files VALUES(?, ?)");
            pstmt.setString(1, "Logo");
            pstmt.setBinaryStream (2, fin, length);
            pstmt.executeUpdate();
            pstmt.clearParameters();
            pstmt.close();
            fin.close();
           
            Statement stmt = conn.createStatement();
            ResultSet result = stmt.executeQuery("SELECT * FROM files");
            result.next();
            String description = result.getString(1);
            Blob blob = result.getBlob(2);
            
            System.out.println("描述:" + description);
            FileOutputStream fout = new FileOutputStream("./logo_phpbb_2.jpg");             
            fout.write(blob.getBytes(1, (int)blob.length()));
            fout.flush();
            fout.close();
                                                                              
            stmt.close();
            conn.close();
        }
        catch(ClassNotFoundException e) {
            System.out.println("找不到驱动");
            e.printStackTrace();
        }
        catch(SQLException e) {
            e.printStackTrace();
        }
        catch(IOException e) {
            e.printStackTrace();
        }
    }
}

3、关于使用bea for oracle的驱动操作clob的问题

参见:http://dev2dev.bea.com.cn/bbs/thread.jspa?forumID=123&threadID=26495&tstart=60

4、db2 的type4驱动问题

【问题描述】
  用驱动com.ddtek.jdbc.db2.DB2Driver抛错误JDBC driver is not on the CLASSPATH;用驱动weblogic.jdbc.db2.DB2Driver抛错误BEA][DB2 JDBC Driver]Unsupported VM encoding Cp1385

【分析】
  第一个错误是windows的classpath路径中没有包含你的db2的驱动文件;参见置顶的帖子【常用数据库JDBC连接写法(整理)】,里面各种数据库的jdbc连接比较全;
  第二个可能是数据库和驱动的编码不符引起的。

5、如何不在weblogic控制台中设置数据源?

【解答】

(1)、用ANT + DbUnit吧
http://iamin.blogdriver.com/iamin/632909.html

(2)、动态加载
       Class driverClass = Class.forName("xxx");


Tags: JDBC

阅读(2052) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~