使用 Worklight 适配器从 derby 检索存储为 CLOB 的 base64 图像
Posted
技术标签:
【中文标题】使用 Worklight 适配器从 derby 检索存储为 CLOB 的 base64 图像【英文标题】:Retrieve base64 image stored as a CLOB from derby with Worklight adapter 【发布时间】:2013-11-10 14:55:53 【问题描述】:我正在尝试通过 Worklight SQL 适配器检索在 Derby DB 中存储为 CLOB 的图像。我想做一些类似于这里写的东西: https://www.ibm.com/developerworks/community/blogs/dhuyvett/entry/jsonstore_revisited_in_worklight_v6_part_1_the_adapter?lang=en 除了引用的文章作者使用的是 DB2。有谁知道我如何在德比做到这一点?目前,当我去检索执行 SQL 选择的图像时,返回的字符串是
“图像”:“org.apache.derby.impl.jdbc.EmbedClob@2d236”
我也会考虑使用 mysql 作为替代方案。感谢您的任何建议。
JT
【问题讨论】:
【参考方案1】:org.apache.derby.impl.jdbc.EmbedClob 是 java.sql.Clob,所以如果你在 var 中有 CLOB,你应该能够通过以下方式获取数据:
var dataAsString = theClob.getSubString(1, theClob.length()); // Assumes all CLOBS are < 2G
【讨论】:
大卫,感谢您的帮助。我已经尝试在适配器代码和客户端代码中使用 subString 方法。当我在适配器上调用 getSubString 方法时,我看到了错误: 大卫,感谢您的帮助。我已经尝试在适配器代码和客户端代码中使用 subString 方法。当我在适配器上调用 getSubString 方法时,我看到错误:“在调用 free() 方法或提交 Blob/Clob 的事务之后,您无法调用其他 java.sql.Clob/java.sql.Blob 方法或回滚。”如果我尝试对已分配 CLOB 的变量调用任何方法,则该方法未定义。谢谢!! 这看起来与我在 DB2 中遇到的问题相同,我通过设置 fullyMaterializeLobData="true" 解决了这个问题,但 Derby 似乎没有类似的选项。您可能必须使用 Java/JDBC 来查询数据库。这样,您可以关闭 autoCommit,并且在检索到 CLOB 数据之前不提交事务。您可以从适配器调用 Java/JDBC 方法,而不是调用 WL.Server.invokeSQLStatement【参考方案2】:感谢您提供的所有重要信息。我最终使用 MySQL 完成了这项工作。 Base64 编码的图像存储在 BLOB 列中。为了检索数据,我的适配器 SELECT 语句如下所示:
selectStatement = WL.Server.createSQLStatement("select *, convert(IMAGE USING utf8) as CONVERTEDIMAGE from report");
然后在我的客户端代码中,我循环遍历结果集以获取我通过信息窗口中的谷歌地图标记显示的图像
incidentRec.image = result.invocationResult.resultSet[i].CONVERTEDIMAGE;
$marker.click(function()
$('#map_canvas').gmap('openInfoWindow', 'content': '<p> ' + incidentArray[this.id].description + '</br>' + '<image + src="data:image/jpg;base64,'+ incidentArray[this.id].image + '"/>' + '</p>', this);
);
如果时间允许,我可以试试德比。再次感谢!
【讨论】:
以上是关于使用 Worklight 适配器从 derby 检索存储为 CLOB 的 base64 图像的主要内容,如果未能解决你的问题,请参考以下文章
Worklight 从不同的服务器 mobilewebapp 访问远程适配器
使用 Worklight SQL 适配器从 DB2 存储和检索图像?