Java 无文件BLOB,通过JSON从ORACLE到SQL Server

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解析图像,但当他们谈到它时,他们会说必须拥有图像路径文件并对其进行编码。正如您现在可能已经意识到的,我不能使用该路线,因为

我是一名学生,目前正在当地图书馆实习,在这种情况下,我有以下问题:

在我正在进行的项目中,我需要从一个时态表中检索图像数据,该时态表是在ORACLE中构建的,它从INFORMIX DB中的一些触发器接收数据,并通过JAVA制作的监视器以JSON格式解析到C#中发布的web服务,然后将该图像插入SQL Server DB中

我环顾四周,发现可以使用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;
    }