string sql = "select register_content from table where no='20'";
OdbcDataReader dr = null;
try
{
OdbcCommand cmd = new OdbcCommand(sql,_conn);
_conn.Open();
dr = cmd.ExecuteReader();
}
catch(OdbcException ex)
{
MessageBox.Show(ex.Message);//这里会报"没有可用的错误信息"
}register_content是clob类型,但是select id,select no,或者select 其它字段,都不会有
任何的问题,为什么select clob就会报错呢?

解决方案 »

  1.   

    select出的是clob类型的值 c#中应该也定义一个clob类型的变量来接收吧
      

  2.   

    难道不可以用DataReader去读取吗,如果不可以又该如何呢?
      

  3.   

    select语句没问题的具体c#怎么做,不懂  可以去c#板块问问
      

  4.   

    OdbcDataReader读取不了clob,要用OracleDataReader,郁闷
      

  5.   

    一、BLOB操作  
    1、入库  
    (1)JDBC方式  
        //通过JDBC获得数据库连接   
        Class.forName("oracle.jdbc.driver.OracleDriver");  
        Connection con = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:testdb", "test", "test");  
        con.setAutoCommit(false);  
        Statement st = con.createStatement();  
        //插入一个空对象empty_blob()   
        st.executeUpdate("insert into TESTBLOB (ID, NAME, BLOBATTR) values (1, "thename", empty_blob())");  
        //锁定数据行进行更新,注意“for update”语句   
        ResultSet rs = st.executeQuery("select BLOBATTR from TESTBLOB where ID=1 for update");  
        if (rs.next())  
        {  
            //得到java.sql.Blob对象后强制转换为oracle.sql.BLOB   
            oracle.sql.BLOB blob = (oracle.sql.BLOB) rs.getBlob("BLOBATTR");  
            OutputStream outStream = blob.getBinaryOutputStream();  
            //data是传入的byte数组,定义:byte[] data   
            outStream.write(data, 0, data.length);  
        }  
        outStream.flush();  
        outStream.close();  
        con.commit();  
        con.close();  
    (2)JNDI方式  
        //通过JNDI获得数据库连接   
        Context context = new InitialContext();  
        ds = (DataSource) context.lookup("ORA_JNDI");  
        Connection con = ds.getConnection();  
        con.setAutoCommit(false);  
        Statement st = con.createStatement();  
        //插入一个空对象empty_blob()   
        st.executeUpdate("insert into TESTBLOB (ID, NAME, BLOBATTR) values (1, "thename", empty_blob())");  
        //锁定数据行进行更新,注意“for update”语句   
        ResultSet rs = st.executeQuery("select BLOBATTR from TESTBLOB where ID=1 for update");  
        if (rs.next())  
        {  
            //得到java.sql.Blob对象后强制转换为weblogic.jdbc.vendor.oracle.OracleThinBlob(不同的App Server对应的可能会不同)   
            weblogic.jdbc.vendor.oracle.OracleThinBlob blob = (weblogic.jdbc.vendor.oracle.OracleThinBlob) rs.getBlob("BLOBATTR");  
            OutputStream outStream = blob.getBinaryOutputStream();  
            //data是传入的byte数组,定义:byte[] data   
            outStream.write(data, 0, data.length);  
        }  
        outStream.flush();  
        outStream.close();  
        con.commit();  
        con.close();  
    2、出库  
        //获得数据库连接   
        Connection con = ConnectionFactory.getConnection();  
        con.setAutoCommit(false);  
        Statement st = con.createStatement();  
        //不需要“for update”   
        ResultSet rs = st.executeQuery("select BLOBATTR from TESTBLOB where ID=1");  
        if (rs.next())  
        {  
            java.sql.Blob blob = rs.getBlob("BLOBATTR");  
            InputStream inStream = blob.getBinaryStream();  
            //data是读出并需要返回的数据,类型是byte[]   
            data = new byte[input.available()];  
            inStream.read(data);  
            inStream.close();  
    <pre class="java" name="code">conn = this.getConnection();  
                conn.setAutoCommit(false);  
                java.sql.Statement st = conn.createStatement();  
                rs= st.executeQuery(sql);  
         BLOB inblob = null;  
         if (rs.next()) {  
        inblob = (BLOB) rs.getBlob("BLOBATTR");  
        }  
         data=inblob.getBytes(1,(int)inblob.length());//这个就是数据    
        }  
        inStream.close();  
        con.commit();  
        con.close();  
       
    二、CLOB操作  
    1、入库  
    (1)JDBC方式  
        //通过JDBC获得数据库连接   
        Class.forName("oracle.jdbc.driver.OracleDriver");  
        Connection con = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:testdb", "test", "test");  
        con.setAutoCommit(false);  
        Statement st = con.createStatement();  
        //插入一个空对象empty_clob()   
        st.executeUpdate("insert into TESTCLOB (ID, NAME, CLOBATTR) values (1, "thename", empty_clob())");  
        //锁定数据行进行更新,注意“for update”语句   
        ResultSet rs = st.executeQuery("select CLOBATTR from TESTCLOB where ID=1 for update");  
        if (rs.next())  
        {  
            //得到java.sql.Clob对象后强制转换为oracle.sql.CLOB   
            oracle.sql.CLOB clob = (oracle.sql.CLOB) rs.getClob("CLOBATTR");  
            Writer outStream = clob.getCharacterOutputStream();  
            //data是传入的字符串,定义:String data   
            char[] c = data.toCharArray();  
            outStream.write(c, 0, c.length);  
        }  
        outStream.flush();  
        outStream.close();  
        con.commit();  
        con.close();  
    (2)JNDI方式  
        //通过JNDI获得数据库连接   
        Context context = new InitialContext();  
        ds = (DataSource) context.lookup("ORA_JNDI");  
        Connection con = ds.getConnection();  
        con.setAutoCommit(false);  
        Statement st = con.createStatement();  
        //插入一个空对象empty_clob()   
        st.executeUpdate("insert into TESTCLOB (ID, NAME, CLOBATTR) values (1, "thename", empty_clob())");  
        //锁定数据行进行更新,注意“for update”语句   
        ResultSet rs = st.executeQuery("select CLOBATTR from TESTCLOB where ID=1 for update");  
        if (rs.next())  
        {  
            //得到java.sql.Clob对象后强制转换为weblogic.jdbc.vendor.oracle.OracleThinClob(不同的App Server对应的可能会不同)   
            weblogic.jdbc.vendor.oracle.OracleThinClob clob = (weblogic.jdbc.vendor.oracle.OracleThinClob) rs.getClob("CLOBATTR");  
            Writer outStream = clob.getCharacterOutputStream();  
            //data是传入的字符串,定义:String data   
            char[] c = data.toCharArray();  
            outStream.write(c, 0, c.length);  
        }  
        outStream.flush();  
        outStream.close();  
        con.commit();  
        con.close();  
    2、出库  
        //获得数据库连接   
        Connection con = ConnectionFactory.getConnection();  
        con.setAutoCommit(false);  
        Statement st = con.createStatement();  
        //不需要“for update”   
        ResultSet rs = st.executeQuery("select CLOBATTR from TESTCLOB where ID=1");  
        if (rs.next())  
        {  
            java.sql.Clob clob = rs.getClob("CLOBATTR");  
            Reader inStream = clob.getCharacterStream();  
            char[] c = new char[(int) clob.length()];  
            inStream.read(c);  
            //data是读出并需要返回的数据,类型是String   
            data = new String(c);  
            inStream.close();  
        }  
        inStream.close();  
        con.commit();  
        con.close();  
       
    需要注意的地方:  
    1、java.sql.Blob、oracle.sql.BLOB、weblogic.jdbc.vendor.oracle.OracleThinBlob几种类型的区别  
    2、java.sql.Clob、oracle.sql.CLOB、weblogic.jdbc.vendor.oracle.OracleThinClob几种类型的区别   
    公司项目中的用法(博客):  
    入库:先插一个oracle.sql.CLOB.empty_lob()进去,然后  
    String updateBaseSourceSql = "select content from mb_baseSource where id = ? for update";  
        conn.setAutoCommit(false);  
        ps = conn.prepareStatement(updateBaseSourceSql);  
        ps.setLong(1, result);  
        ResultSet rs = ps.executeQuery();  
        oracle.sql.CLOB clob = null;  
        if (rs.next()) {  
         clob = (oracle.sql.CLOB) rs.getClob(1);  
        }  
        Writer wr = clob.getCharacterOutputStream();  
        wr.write(baseSource[4]);  
        wr.flush();  
        wr.close();  
        rs.close();  
        ps.close();  
        conn.commit();  
    出库:  
    findBaseSourceSql = "select content from mb_baseSource where id = ?";  
       ps = conn.prepareStatement(findBaseSourceSql);  
       ps.setLong(1, sourceID);  
       rs = ps.executeQuery();  
       if (rs.next()) {  
        CLOB clob = (oracle.sql.CLOB) rs.getClob(1);  
        if (clob != null) {  
         Reader is = clob.getCharacterStream();  
         BufferedReader br = new BufferedReader(is);  
         String s = br.readLine();  
         while (s != null) {  
          result[6] += s;  
          s = br.readLine();  
         }  
        }  
       }  
       rs.close();  
       ps.close();