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

问题描述 投票:2回答:2

PreparedStatement setString采用“null”(如String a = "null"),并在.addBatch之后将其转换为正常的null(就像String a = null一样)。

我不知道如何能够绕过这种误解,因为在将它们全部添加为批处理后,很多行都被立即执行...(sql语句是INSERT INTO ...)(VarChar不能为null但是String a = "null"可以被表接受,如果它没有批量发送...整个程序由于服务器的错误消息而停止)

错误消息:将数据写入数据库时​​出错... 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);
java jdbc prepared-statement netezza
2个回答
2
投票

请记住,我从未使用过Netezza,我无法尝试任何东西。这是IBM Netezza官方文档中的信息集合。

如果我正在阅读此权利,则会明确转换文本值“null”以识别缺少值...对于external table。原因很简单,外部表是一个平面文件,因此它可能将所有内容存储为没有分隔符的TEXT,但带有分隔的大小文件。

Handle the absence of a value

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

然后,我们可以在The NullValue option看到相同的想法

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

您可以使用任何其他String替换此表的此选项,但我相信这只会移动问题...

所以我的解决方案,将你的桌子的NullValue设置为" "(一个空格),并在你的项目中修剪每个值,你将永远不能有一个" ",因为它将被修剪为""


1
投票

鉴于你的问题,我认为你试图插入String null,除非另有说明。这个问题的最简单的解决方案是将列的默认值设置为字符串null,这样您就不必担心在代码中指定它可能会也可能不会将其解释为空。即在列定义NOT NULL DEFAULT 'null'上添加约束

© www.soinside.com 2019 - 2024. All rights reserved.