prepareStatement.setString(1,“ null”),被解释为null而不是字符串(在prepareStatement.addBatch()之后)

时间:2019-04-18 10:24:09

标签: java jdbc prepared-statement netezza

PreparedStatement setString取一个“ null”(就像String a = "null"一样),然后在.addBatch之后将其转换成一个普通的null(像String a = null一样)。

我不知道如何绕开这种误解,因为很多行在全部添加为批处理之后立即执行。(sql语句是INSERT INTO ...) (VarChar不能为空,但是如果String a = "null"可以不接受批处理而被表接受,则整个程序由于来自服务器的msg错误而停止)

错误消息: 将数据写入数据库时​​出错... org.netezza.error.NzSQLException:错误:列17:字段不能包含空值

代码:

preparedStatement.setString(17, x); //currently x was recieved as "null"
preparedStatement.addBatch() //after other parameters were filled then this statement
preparedStatement.executeBatch(); //after the logs this statement is executed.

希望有一个快速的解决方法

我使用了这种旁路,但认为可能会有更好的选择...(因为我无法更改数据库的默认值或操作数据...)

if(helper.toLowerCase().equals("null"))
    helper = (helper.equals("null") ? "null ":"NULL ");

preparedStatement.setString(17, helper);

2 个答案:

答案 0 :(得分:2)

请记住,我从未使用过Netezza,并且无法尝试任何操作。这是在IBM Netezza官方文档中找到的信息的集合。

如果我正在阅读此权利,则将文本值“ null”进行显式转换以识别出external table缺少值...。原因很简单,外部表是一个平面文件,因此它可能将所有内容存储为TEXT(不带分隔符),但文件大小不定。

Handle the absence of a value

  

在SQL中,如果列被声明为非null,则记录中必须包含一个值。当记录不包含任何列的值时,该列被视为空。该系统提供了一种显式和隐式的方法来传达无效性。
  -显式方法在字段中包含特定标记而不是值。 默认情况下,此令牌是单词“ null”(不区分大小写)您可以使用nullValue选项将此令牌更改为任何其他1-4个字符的字母令牌。您可以在带有相邻空格的非字符串字段中出现显式null标记之前或之后。为了使系统能够识别字符串字段中的显式空标记,标记不能具有前面或后面的相邻空格。显式的null令牌方法使得无法表达完全由null令牌的文本组成的字符串。

然后,我们可以在The NullValue option

中看到相同的想法
  

指定用于空值的字符串,最大为4字节的UTF-8字符串。默认值为“ NULL”。

您可以将此表的此选项替换为其他任何String,但我相信这会解决问题...

因此,我的解决方案是将表的NullValue设置为" "(一个空格),然后在项目中修剪每个值,因为它永远不会有" "会被修剪为""

答案 1 :(得分:1)

鉴于您的问题,除非另有说明,否则我认为您正在尝试插入字符串null。 解决此问题的最简单方法是将列的默认值设置为字符串null,因此您不必担心在代码中将其指定为空白或不将其解释为空的担心。 即在列定义NOT NULL DEFAULT 'null'

上添加约束