Java 元模型-Sql Server 2008 LOB数据标识

Java 元模型-Sql Server 2008 LOB数据标识,java,sql-server,oracle,sql-server-2008,apache-metamodel,Java,Sql Server,Oracle,Sql Server 2008,Apache Metamodel,我们正在尝试使用Apache元模型将不同数据库中的数据提取成一些平面文件格式。使用ORACLE,对于LOB列(无论是CLOB还是BLOB),我们得到isLarge()=true。但是对于SQL Server 2008 R2的同一列,我们得到了它的false。在SQL Server 2008 R2中,对于CLOB,我们的LOB列是varChar(Max),对于BLOB,列是varbinary(Max) 有没有办法用一个解决方案处理两个数据库?一种可能的方法是使用。任何支持JDBC的数据库系统都应该

我们正在尝试使用
Apache元模型
将不同数据库中的数据提取成一些平面文件格式。使用
ORACLE
,对于
LOB
列(无论是
CLOB
还是
BLOB
),我们得到
isLarge()=true
。但是对于SQL Server 2008 R2的同一列,我们得到了它的
false
。在SQL Server 2008 R2中,对于CLOB,我们的
LOB
列是
varChar(Max)
,对于BLOB,列是
varbinary(Max)


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

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

JDBC定义方法,该方法返回有关ResultSet的所有列的信息。关键方法是返回上述sql类型的方法(例如,2004 fro BLOB)

这里是一个使用Groovy而不是Java来检查表的列的小示例my_选项卡

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方法的经验,但我认为这是解决此问题的最简单方法。

Apache元模型有一个可以设置的系统属性,它将自动将所有CLOB转换为字符串,将所有BLOB转换为字节数组

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

-Dmetamodel.jdbc.convert.lobs=true
或者您可以从代码中执行,在这种情况下,有一个方便的常数可供您使用:

System.setProperty(JdbcDataContext.SYSTEM_PROPERTY_CONVERT_LOBS, true);

祝你好运。

如果我和其他可能的人知道否决票是基于提议方法的某些问题,还是仅仅是主观问题,那将是很有价值的。