元模型 - LOB数据的{sql Server 2008标识

时间:2015-12-25 12:19:03

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

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

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

2 个答案:

答案 0 :(得分:0)

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

您可以通过命令行上的字符串值等设置此属性:

-Dmetamodel.jdbc.convert.lobs=true

或者您可以通过代码完成此操作,在这种情况下,您可以使用方便的常量:

System.setProperty(JdbcDataContext.SYSTEM_PROPERTY_CONVERT_LOBS, true);
祝你好运。

答案 1 :(得分:-1)

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

JDBC定义getMetaData方法,该方法返回有关ResultSet的所有列的信息。关键方法是返回上述sql类型的getColumnType(例如2004年来自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

除了使用getMetaData方法,我在Oracle之外没有多少经验,但在我看来,这是解决此问题的最简单方法。