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);
答案 0 :(得分:2)
请记住,我从未使用过Netezza,并且无法尝试任何操作。这是在IBM Netezza官方文档中找到的信息的集合。
如果我正在阅读此权利,则将文本值“ null”进行显式转换以识别出external table缺少值...。原因很简单,外部表是一个平面文件,因此它可能将所有内容存储为TEXT(不带分隔符),但文件大小不定。
在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'