【问题标题】:The conversion from UNKNOWN to UNKNOWN is unsupported不支持从 UNKNOWN 到 UNKNOWN 的转换
【发布时间】:2013-07-15 02:49:11
【问题描述】:

运行存储过程时出现以下异常:

com.microsoft.sqlserver.jdbc.SQLServerException:不支持从 UNKNOWN 到 UNKNOWN 的转换。

过程定义如下:

CREATE PROCEDURE spTest (
@p1 varchar(1024) ,
@p2 varchar(1024) ,
@p3 char(1) ,
@p4 varchar(254),
@p5 varchar(254),
@debug bit )

我在 Java 中的参数是这样定义的:

Object[] 参数 = {"1,2,3", "d", '2', "", "", 1};

我认为这是由角色造成的。任何想法为什么?

【问题讨论】:

  • 尝试使用String "2",因为'char'实际上仍然是字符串数据(毕竟它可以有多个长度)。否则,我怀疑“位”,因为 Java 并没有真正的等效类型......
  • 是的,这是导致悲伤的 char 类型。转换成字符串就可以了。
  • 在处理 Java 枚举时发现了这个问题 - 在添加到 param 数组时显式转换 toString() 解决了我的问题。

标签: java sql sql-server jdbc


【解决方案1】:

如果您使用jdbcTemplate.update(sql, List<Object[]>, int[]),但您想使用jdbcTemplate.batchUpdate(sql, List<Object[]>, int[]),则可能会出现此错误。

它可以编译,因为jdbcTemplate中有一个jdbcTemplate.update(sql, Object...)方法,但是它会产生“不支持从UNKNOWN到UNKNOWN的转换。”,因为它不能使用List<Object[]>作为参数。

【讨论】:

  • 解决办法是什么?
  • @ammy 使用batchUpdate 而不是update
【解决方案2】:

我找到了。发条缪斯让我走上了这条道路。设置参数时,char 类型不会转换为 Object。以下将起作用:

     try (PreparedStatement st = con.prepareStatement(query)) {
        int n = 1;
        for (Object o : params) {

            if (o instanceof Character) {
                o = "" + o;
            }

            st.setObject(n, o);
            n++;
        }
        st.executeQuery();
    }

【讨论】:

  • 实际上,它可能是,它只是最终被自动装箱到它的object representation,而恰好不是String。最好在设置实际参数时转换它,因为这样可以更清楚地知道你在做什么。另外,如果需要索引,就用传统的for循环,不要这样混用。
  • 同样,Optional 在 SQL Server 驱动程序中没有转换,所以如果忘记将Optional 拆箱(大多数情况下使用orElse(null))就会出现此错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-16
  • 2014-03-01
  • 2014-06-13
  • 2018-08-03
  • 2019-08-27
相关资源
最近更新 更多