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);
祝你好运。如果我和其他可能的人知道否决票是基于提议方法的某些问题,还是仅仅是主观问题,那将是很有价值的。