Java 无文件BLOB,通过JSON从ORACLE到SQL Server
我是一名学生,目前正在当地图书馆实习,在这种情况下,我有以下问题: 在我正在进行的项目中,我需要从一个时态表中检索图像数据,该时态表是在ORACLE中构建的,它从INFORMIX DB中的一些触发器接收数据,并通过JAVA制作的监视器以JSON格式解析到C#中发布的web服务,然后将该图像插入SQL Server DB中Java 无文件BLOB,通过JSON从ORACLE到SQL Server,java,c#,sql-server,json,oracle,Java,C#,Sql Server,Json,Oracle,我是一名学生,目前正在当地图书馆实习,在这种情况下,我有以下问题: 在我正在进行的项目中,我需要从一个时态表中检索图像数据,该时态表是在ORACLE中构建的,它从INFORMIX DB中的一些触发器接收数据,并通过JAVA制作的监视器以JSON格式解析到C#中发布的web服务,然后将该图像插入SQL Server DB中 我环顾四周,发现可以使用Base64编码等通过JSON解析图像,但当他们谈到它时,他们会说必须拥有图像路径文件并对其进行编码。正如您现在可能已经意识到的,我不能使用该路线,因为
我环顾四周,发现可以使用Base64编码等通过JSON解析图像,但当他们谈到它时,他们会说必须拥有图像路径文件并对其进行编码。正如您现在可能已经意识到的,我不能使用该路线,因为我没有这些图像,最好的情况是,触发器能够提供一些BLOB数据(据我所知)。但是我必须将它们作为Varbinary(MAX)插入SQLServerDB 总而言之:
-->Informix DB有图像
-->触发器提供ORACLE临时表(图像最多可能以BLOB或CLOB的形式发送)
-->用JAVA制作的监视器必须读取这些BLOB或CLOB并通过JSON发送它们
-->用C#创建的Web服务必须接收该JSON,并将图像插入SQL Server数据库(在需要可见图像的地方,无需参考物理文件) 我正在使用的模式(它是强加给我的,我在这方面没有一句话)与此类似:(它的代码非常长且乏味,所以我会尽量使其整洁) 这是java监视器的一部分,用于指定temp_表中的哪些字段正在为JSON结构中的哪些字段提供数据
public static BookRecordList viewBookRecordTable(Connection connection) throws ExceptionToOracleConcurrent
{
BookRecordList bookRecordList = new BookRecordList();
BookRecord bookRecord = new BookRecord();
Statement stmt = null;
String query = "SELECT operacion,"
+ "UTL_RAW.CAST_TO_VARCHAR2(DBMS_LOB.SUBSTR(img_logo,32670,1))"
+ "x_logo,"
+ "UTL_RAW.CAST_TO_VARCHAR2(DBMS_LOB.SUBSTR(img_logoGris,32760,1))"
+ "UTL_RAW.CAST_TO_VARCHAR2(DBMS_LOB.SUBSTR(r_firma,32670,1)),"
+ " FROM "
+ dataBaseConnectionData.getDB_SHCHEMA() + "."+ dataBaseConnectionData.getDB_TABLE_COLA()
+ " WHERE (some condition)";
try
{
stmt = connection.createStatement();
ResultSet rs = stmt.executeQuery(query);
while(rs.next())
{
try
{
bookRecord = new BookRecord();
bookRecord.setOperacion(rs.getInt("operacion"));
bookRecord.setImg_logo(rs.getString("img_logo"));
bookRecord.setImg_logoGris(rs.getString("img_logoGris"))
bookRecord.setR_firma(rs.getString("r_firma"));
bookRecord.print();
bookRecordList.getBookRecordList().add(bookRecord);
}
catch (Exception e)
{
logger.error("Some exception " + dataBaseConnectionData.getDB_TABLE_COLA() + ": " + e.toString());
e.printStackTrace();
//Process next order
continue;
}
}
}
catch (SQLException e )
{
logger.fatal("Some exception " + dataBaseConnectionData.getDB_TABLE_COLA() + ": " + e.toString());
throw new ExceptionToOracleConcurrent("exception definition " + dataBaseConnectionData.getDB_TABLE_COLA() + ": " + e.toString());
}
finally
{
if (stmt != null)
{
try
{
stmt.close();
}
catch (SQLException e)
{
logger.fatal("another exception " + e.toString());
}
}
}
return bookRecordList;
}
这是生成JSON的java监视器的一部分(空的用例包含另一个进入JSON的内容,但我已经整理好了)
web服务是在C#中创建的,它是另一个基于案例的程序,根据JSON中接收到的操作编号进行结构,它调用许多函数,最后归结为以下两个:
WS的这一部分接收已解析JSON的参数
public int ActualizarFichaLibro( String img_foto, String r_firma)
{
try
{
//Define query to insert
Cmd.CommandText = QueryCFA.ActualizarFicha();
//Define parameters types to insert
Cmd.Parameters.Add("@img_foto", SqlDbType.VarBinary, -1);
Cmd.Parameters.Add("@r_firma", SqlDbType.VarBinary, -1);
//Define parameters values to insert
Cmd.Parameters["@img_foto"].Value = img_foto;
Cmd.Parameters["@r_firma"].Value = r_firma;
int rowCount = Cmd.ExecuteNonQuery();
CerrarConexionBd();
return rowCount;
}
catch (Exception)
{
return 0;
}
}
最后,它调用了一个简单的查询,在这个特殊的情况下,调用这个查询:
public string ActualizarFicha()
{
Query = "UPDATE dbo.fichaEmpleado SET( CASE WHEN @img_foto = '' THEN NULL ELSE img_foto = CONVERT(VARBINARY(MAX), @img_foto, 2) END,"
+ "CASE WHEN @r_firma = '' THEN NULL ELSE img_firma = CONVERT(VARBINARY(MAX), @r_firma, 2) END,"
+"WHERE (some conditions)";
return Query;
}
我的问题是:有没有办法通过JSON实现这一点(将图像从一个数据库发送到另一个数据库),特别是在这个庞大的模式下?如果没有,有什么办法吗?
读取BLOB(可能的BLOB)和插入Varbinary的查询是否得到了很好的实现
很抱歉,我解释得太长了,我已经为此工作了一周,似乎找不到合适的方法来解决这个问题(至少不能用这个模式,但老板们不想改变它)你能试着把这个问题分解成几个不连续的部分吗?它既有太多的细节,也有太少的细节。例如,在c#中,您使用的是什么web服务技术?ASP.NET、WCF或其他什么?您使用的JSON序列化程序是什么?可以查看您的SQL代码的人员和可以建议如何进行JSON序列化的人员可能会有所不同,因此,阅读您的整个问题时,所有Oracle特定代码的出现可能会导致后者的出现。再次,很抱歉发布了这么长的问题。我正在使用.NETFramework3.5(ASP.NET)和序列化程序,我认为它是JSONSimple1.1.1,您建议我发布两个不同的问题?问题是,我想我的问题会被标记为已回答,许多人已经询问了解析图像,只是没有物理文件,但如果这是你的建议,我会尝试一下,谢谢。
public string ActualizarFicha()
{
Query = "UPDATE dbo.fichaEmpleado SET( CASE WHEN @img_foto = '' THEN NULL ELSE img_foto = CONVERT(VARBINARY(MAX), @img_foto, 2) END,"
+ "CASE WHEN @r_firma = '' THEN NULL ELSE img_firma = CONVERT(VARBINARY(MAX), @r_firma, 2) END,"
+"WHERE (some conditions)";
return Query;
}