zoukankan      html  css  js  c++  java
  • Oracle long raw 类型字段读取问题

    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字段提前读取也是完全可以的。

  • 相关阅读:
    C#(winform)浏览按钮
    C#操作CSV存取类
    忘记windows的登陆密码
    exe文件打开方式(恢复EXE文件关联)
    MongoDB 搭建副本集
    Performance Monitor3:监控SQL Server的内存压力
    大数据操作:删除和去重
    SSRS配置2:加密管理
    SSISDB7:当前正在运行的Package及其Executable
    不再迷惑,无值和NULL值
  • 原文地址:https://www.cnblogs.com/danghuijian/p/4400235.html
Copyright © 2011-2022 走看看