当前位置: 首页 > 知识库问答 >
问题:

存储过程的jdbc-varbinary(max)out参数被截断为8000字节

梁烨
2023-03-14
ALTER procedure [User].[pTest]
      @data varbinary(max) out
      ,@name nvarchar(max) = null
      ,@date datetime
as
begin
.
.
.
@Entity
@NamedStoredProcedureQuery(name = "User.getUser", procedureName = "User.pTest", parameters = {
        @StoredProcedureParameter(mode = ParameterMode.OUT, name = "data", type = byte[].class),  
        @StoredProcedureParameter(mode = ParameterMode.IN, name = "name", type = String.class),
        @StoredProcedureParameter(mode = ParameterMode.IN, name = "date", type = Date.class)
          })
@Data //lombok
public class User {


    // serves no purpose other than to meet
    // JPA requirement
    @Id
    private Long id;
}

存储库代码

public interface UserRepository  extends Repository<User, Long> {

    @Procedure("User.pTest")
    byte[] getUserSession(@Param("name") String name, 
            @Param("date") Date date
            );

}

我的测试代码如下所示,当我运行它时,我会得到错误:

@Test
public void testGettingApxSession() {
    Calendar cal = new GregorianCalendar(2016,6,5);
    byte[] b = userRepository.getUserSession("myName", cal.getTime());
}

当我注销@data时,使用:

    StringBuilder sb = new StringBuilder();
    for (byte a : b) {
        sb.append(String.format("%02X ", a));
    }

共有1个答案

汲灿
2023-03-14

使用Microsoft的JDBC驱动程序并将输出参数类型指定为blob:

@Entity
@NamedStoredProcedureQuery(name = "User.getUser", procedureName = "User.pTest", parameters = {
        @StoredProcedureParameter(mode = ParameterMode.OUT, name = "data", type = Blob.class),  
        @StoredProcedureParameter(mode = ParameterMode.IN, name = "name", type = String.class),
        @StoredProcedureParameter(mode = ParameterMode.IN, name = "date", type = Date.class)
          })

注意:这将不适用于JTDS。它仍然会截断任何大于8000字节的内容。

如果需要将blob传递回SQL Server,则必须按以下方式转换回字节数组:

byte[] bytes = blob.getBytes(1, (int) blob.length());
 类似资料:
  • 存储过程以完整的响应(>4000个字符)回答,但我无法从Java打开它。我尝试过jTDS和微软的JDBC驱动程序6.0。下面是我的代码: 这适用于Sybase中的存储过程。

  • 输入/输出示例: infoData序列化输入:总长度5191 当,NVARCHAR(1000),infoData值:总长度-1003 帮助我获得完整的info_Data原样,没有任何丢失或截断。 提前道谢。

  • 问题内容: 各自的优缺点是什么? 我的要求是: 我希望能够加密图像 可以通过Web服务器(RESTful API)在移动设备上轻松访问 可通过本地数据库(如SQLLite)在移动设备上轻松访问 服务器端使用的数据库是MS SQL2005。我相信SQLLite和MS SQL 2005可以同时支持varchar和varbinary(sqllite上的BLOB) 问题答案: Base64在一个字节中仅使

  • 我通过Hibernate调用了一个带有OUT参数的存储过程,得到了以下错误: 我的存储过程: Hibernate映射: 我按如下方式调用了存储过程: 有人能解释一下这段代码有什么问题吗?

  • 问题内容: 我已经使用PDO一段时间了,并且正在重构一个项目,以便它使用存储的proc而不是内联SQL。我收到一个我无法解释的错误。我正在使用PHP版本5.3.5和MySQL版本5.0.7。 我只是想获得一个带有输出的基本存储过程。这是存储的过程: 这是我用来调用proc的代码,$ db是PDO的一个实例: 简单吧?但是,它导致以下错误: 如果我直接这样调用proc: 它按预期工作,这使我相信PH

  • 我想用java调用一个记录类型表的存储过程。记录只包含数字,但我必须传递整数和小数。 我还没有为我的问题找到合适的解决方案(无论是OracleCallableStatement还是StoredProcedurey)。