在 Virtuoso 中使用 Sql Workbench/J 导入具有空数字字段的 csv 文件

Posted

技术标签:

【中文标题】在 Virtuoso 中使用 Sql Workbench/J 导入具有空数字字段的 csv 文件【英文标题】:Import with Sql Workbench/J in Virtuoso a csv file with empty numeric fields 【发布时间】:2017-04-25 14:46:08 【问题描述】:

使用 Sql Workbench/J 我想将 csv 文件加载到 Virtuoso 表中。当文件中的数字字段为空时,我得到一个NullPointerException。 目标表有一个空字段的可为空列。错误如下。

java.lang.NullPointerException
java.lang.NullPointerException
        at virtuoso.jdbc4.VirtuosoPreparedStatement.setObject(VirtuosoPreparedStatement.java:846)
        at virtuoso.jdbc4.VirtuosoPreparedStatement.setObject(VirtuosoPreparedStatement.java:789)
        at virtuoso.jdbc4.VirtuosoPreparedStatement.setObject(VirtuosoPreparedStatement.java:773)
        at workbench.db.compare.BatchedStatement.setObject(BatchedStatement.java:120)
        at workbench.db.importer.DataImporter.processRowData(DataImporter.java:1368)
        at workbench.db.importer.DataImporter.insertRow(DataImporter.java:1297)
        at workbench.db.importer.DataImporter.processRow(DataImporter.java:1054)
        at workbench.db.importer.TextFileParser.processOneFile(TextFileParser.java:743)
        at workbench.db.importer.AbstractImportFileParser.start(AbstractImportFileParser.java:390)
        at workbench.db.importer.DataImporter.startImport(DataImporter.java:761)
        at workbench.sql.wbcommands.WbImport.execute(WbImport.java:827)
        at workbench.sql.StatementRunner.runStatement(StatementRunner.java:582)
        at workbench.sql.BatchRunner.executeScript(BatchRunner.java:877)
        at workbench.sql.BatchRunner.executeScript(BatchRunner.java:784)
        at workbench.sql.BatchRunner.runFiles(BatchRunner.java:642)
        at workbench.sql.BatchRunner.execute(BatchRunner.java:596)
        at workbench.WbManager.runBatch(WbManager.java:1075)
        at workbench.WbManager.startApplication(WbManager.java:929)
        at workbench.WbManager.main(WbManager.java:1227)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
        at java.lang.reflect.Method.invoke(Unknown Source)
        at workbench.WbStarter.main(WbStarter.java:143)
Importing file 'C:\dev\csvFiles\CLASSIFICATION_CODE.csv' into table CLASSIFICATION_CODE
The file "C:\dev\csvFiles\CLASSIFICATION_CODE.csv" was not imported

我的表结构如下。

CREATE TABLE CLASSIFICATION_CODE 
(
  CLASSIFICATION_CODE_ID NUMERIC NOT NULL ,
  CLASSIFICATION_CATEGORY VARCHAR(1) NOT NULL ,
  CLASSIFICATION_PRIORITY NUMERIC 
  CONSTRAINT PK_CLASS_CODE PRIMARY KEY (CLASSIFICATION_CODE_ID)   
);

我要上传的文件有以下内容(最后一个字段为空)。

CLASSIFICATION_CODE_ID,CLASSIFICATION_CATEGORY,CLASSIFICATION_PRIORITY
1,^3^,
2,^2^,
3,^2^,
4,^2^,
5,^2^,
6,^3^,

最后这是我用来导入它的WbImport 命令。

WbImport -type=text
-file='C:\dev\csvFiles\CLASSIFICATION_CODE.csv'
-delimiter=,
-table=DB.PEST.CLASSIFICATION_CODE
-quoteChar=^
-badfile='C:\dev\csvFiles\rejected'
-emptyStringIsNull=false;

我没有看到任何参数告诉 Sql Workbench/J CLASSIFICATION_PRIORITY 列的字段可以为空。我错过了什么吗?

我正在使用

Virtuoso Open Source Edition 版本 7.2.4.3217-threads 截至 2016 年 4 月 25 日为 Win64 编译 (x86_64-generic-win-64)

针对 jdk1.8 的修补 Virtuoso JDBC 驱动程序 virtjdbc4_2.jar 位于 this link。

【问题讨论】:

您没有提供版本信息,所以我想知道是否所有组件都是最新的?我会检查 Java、Virtuoso 的 JDBC 驱动程序和 SQL Workbench/J;可能还值得检查 Virtuoso 本身,认为它与报告的错误无关。 @TallTed 我添加了对 JDBC 驱动程序的引用。实际上,我已经使用了 4 周前由 Sergey 修补的那个。也许现在它也可以在存储库中使用,我不确定。 好的,Virtuoso 是 Windows 的最新稳定 VOS 版本,我猜您使用的是 Java 8(可能是最新最好的)。 SQL Workbench/J 怎么样,可能是这里的罪魁祸首?最后,我猜您直接与 Sergey 合作获得了预发布的 JDBC 驱动程序。在这个问题上可能值得做同样的事情! 【参考方案1】:

该错误是由驱动程序中的错误引起的virtjdbc4_2.jar 同一链接的当前版本的驱动程序修复了该问题。

驱动程序也可以在 Virtuoso github 存储库中找到。

【讨论】:

以上是关于在 Virtuoso 中使用 Sql Workbench/J 导入具有空数字字段的 csv 文件的主要内容,如果未能解决你的问题,请参考以下文章

virtuoso如何将label名字调用放大

EDA - 在virtuoso集成StarRC

怎么把freebase.nt导入virtuoso

virtuoso装载大的rdf文件的方法

virtuoso f3快捷键用不了怎么办

virtuoso的main Form怎么打开?