【问题标题】:Metamodel - Sql Server 2008 identification for LOB data元模型 - LOB 数据的 Sql Server 2008 识别
【发布时间】:2015-12-25 12:19:03
【问题描述】:

我们正在尝试使用Apache MetaModel 将来自不同数据库的数据提取为某种平面文件格式。对于ORACLE,对于LOB 列(CLOBBLOB),我们得到isLarge()=true。但是对于与SQL Server 2008 R2 相同的列,我们得到了false。在SQL Server 2008 R2 中,我们的LOB 列对于CLOB 是varChar(Max),对于BLOB 是varbinary(Max)

有没有办法用一个解决方案处理两个数据库?

【问题讨论】:

    标签: java sql-server oracle sql-server-2008 apache-metamodel


    【解决方案1】:

    Apache MetaModel 有一个您可以设置的系统属性,它会自动将所有 CLOB 转换为字符串,并将所有 BLOB 转换为字节数组。

    您可以通过命令行上的字符串值或其他方式设置此属性:

    -Dmetamodel.jdbc.convert.lobs=true
    

    或者您可以通过代码来实现,在这种情况下,有一个方便的常量可供您使用:

    System.setProperty(JdbcDataContext.SYSTEM_PROPERTY_CONVERT_LOBS, true);
    

    祝你好运。

    【讨论】:

      【解决方案2】:

      一种可能的方法是使用java.sql.Types。任何支持 JDBC 的数据库系统都应该可靠地映射到这种类型。

      JDBC 定义了getMetaData 方法,它返回一个ResultSet 的所有列的信息。关键方法是返回上述sql类型的getColumnType,(例如2004 from BLOB)。

      这里是一个使用 Groovy 而不是 Java 来检查表列的小例子 my_tab

      def stmt = con.createStatement() 
      
      def rs = stmt.executeQuery('select * from my_tab')
      
      def rsmd = rs.getMetaData();
      def colCount = rsmd.getColumnCount()
      
      println "getColumnCount ${colCount}"
      
      colCount.times {i ->
        println "---------------------------------"
        println "columnName ${rsmd.getColumnName(i+1)}"
        println "columnTypeName ${rsmd.getColumnTypeName(i+1)}" 
        println "columnType ${rsmd.getColumnType(i+1)}"   
      } 
      

      结果

      getColumnCount 3
      ---------------------------------
      columnName C1
      columnTypeName BLOB
      columnType 2004
      
      ---------------------------------
      columnName C2
      columnTypeName CLOB
      columnType 2005
      
      ---------------------------------
      columnName C3
      columnTypeName DATE
      columnType 93
      

      除了 Oracle 之外,我在 getMetaData 方法方面没有太多经验,但我认为这是解决此问题的最简单方法。

      【讨论】:

      • 让我和可能的其他人知道否决票是基于提议的方法的某些问题还是只是主观问题,这将是很有价值的。
      猜你喜欢
      • 2010-12-04
      • 2011-01-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多