- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试构建一个 Java 应用程序,用于使用 sqlite 训练外语词汇,目前没有任何 GUI 或太多功能。 sqlite 数据库非常小:它只有一张表(名为 vocabulary
)和两列(名为 english
和 german
)。项目上传至Github .
我的词汇列表以 csv 文件形式存储在外部存储库中。文件 LoadVocabularyListIntoDB.java
的唯一目的是解析该文件并将每一行插入 sqlite 数据库。
我认为,maven编译
日志中的这些行很重要:
java.lang.reflect.InvocationTargetException
[...]
Caused by: java.lang.RuntimeException: Cannot insert word pair into SQL Database.
at voc.Database.insertWordPairIntoTable(Database.java:79)
at voc.LoadVocabularyListIntoDB.insertVocabularyListIntoDB(LoadVocabularyListIntoDB.java:52)
[...]
Caused by: java.sql.SQLException: no such column: accountant
[...]
at voc.Database.insertWordPairIntoTable(Database.java:76)
最后两行,特别是错误消息no such column: account
证明我的解析有效,因为这实际上是第一行的第一列。
但我不明白,为什么 accountant
被解释为一列,因为我对该方法的测试返回 true,这意味着方法 insertWordPairIntoTable()
应该可以工作.
@Test
public void TestDataInsertion() {
db = null;
db = new Database();
String f = "/tmp/test.db";
db.setDBfilename(f);
db.createNewEmptyDbFile();
db.establishConnection();
db.createBasicSqlTable();
db.insertWordPairIntoTable("'time'", "'zeit'");
assertEquals(db.getGermanTranslation("'time'"), "zeit");
}
<小时/>
其次,我不明白在我的例子中,InitationTargetException
是什么意思。我读过这个 stackOverflow 线程:Java: InvocationTargetException ,但是用 try/catch block 包围 theDB.insertWordPairIntoTable(englishWord, germanWord);
行并没有帮助——这是我根据这行 Maven 日志的调用方法:
at voc.LoadVocabularyListIntoDB.insertVocabularyListIntoDB(LoadVocabularyListIntoDB.java:52)
从来没有在那里抛出过InitationTargetException
。
请注意:由于文件 LoadVocabularyListIntoDB.java
是在构建项目时执行的,因此我无法调试该文件,例如带有断点之类的(至少,我还没有找到解决方案)
目录列表
.
├── package-list
├── pom.xml
├── src
│ ├── main
│ │ └── java
│ │ └── voc
│ │ ├── Control.java
│ │ ├── Database.java
│ │ └── LoadVocabularyListIntoDB.java
│ └── test
│ └── java
│ └── voc
│ └── DatabaseTest.java
└── voc.iml
<小时/>
maven编译日志
$ mvn compile
[INFO] Scanning for projects...
[WARNING]
[WARNING] Some problems were encountered while building the effective model for voc:voc:jar:1.0-SNAPSHOT
[WARNING] 'build.plugins.plugin.version' for org.apache.maven.plugins:maven-jar-plugin is missing. @ line 76, column 21
[WARNING]
[WARNING] It is highly recommended to fix these problems because they threaten the stability of your build.
[WARNING]
[WARNING] For this reason, future Maven versions might no longer support building such malformed projects.
[WARNING]
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Building voc 1.0-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ voc ---
[WARNING] Using platform encoding (UTF-8 actually) to copy filtered resources, i.e. build is platform dependent!
[INFO] skip non existing resourceDirectory /home/toogley/src/voc/src/main/resources
[INFO]
[INFO] --- maven-compiler-plugin:3.1:compile (default-compile) @ voc ---
[INFO] Changes detected - recompiling the module!
[WARNING] File encoding has not been set, using platform encoding UTF-8, i.e. build is platform dependent!
[INFO] Compiling 3 source files to /home/toogley/src/voc/target/classes
[INFO]
[INFO] --- exec-maven-plugin:1.5.0:java (compilation preparations) @ voc ---
[WARNING]
java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.codehaus.mojo.exec.ExecJavaMojo$1.run(ExecJavaMojo.java:294)
at java.lang.Thread.run(Thread.java:745)
Caused by: java.lang.RuntimeException: Cannot insert word pair into SQL Database.
at voc.Database.insertWordPairIntoTable(Database.java:79)
at voc.LoadVocabularyListIntoDB.insertVocabularyListIntoDB(LoadVocabularyListIntoDB.java:52)
at voc.LoadVocabularyListIntoDB.<init>(LoadVocabularyListIntoDB.java:25)
at voc.LoadVocabularyListIntoDB.main(LoadVocabularyListIntoDB.java:57)
... 6 more
Caused by: java.sql.SQLException: no such column: accountant
at org.sqlite.core.NativeDB.throwex(NativeDB.java:397)
at org.sqlite.core.NativeDB._exec(Native Method)
at org.sqlite.jdbc3.JDBC3Statement.executeUpdate(JDBC3Statement.java:116)
at voc.Database.insertWordPairIntoTable(Database.java:76)
... 9 more
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 2.962 s
[INFO] Finished at: 2016-07-22T22:40:31+02:00
[INFO] Final Memory: 16M/159M
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal org.codehaus.mojo:exec-maven-plugin:1.5.0:java (compilation preparations) on project voc: An exception occured while executing the Java class. null: InvocationTargetException: Cannot insert word pair into SQL Database. no such column: accountant -> [Help 1]
[ERROR]
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
[ERROR] Re-run Maven using the -X switch to enable full debug logging.
[ERROR]
[ERROR] For more information about the errors and possible solutions, please read the following articles:
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoExecutionException
<小时/>
数据库.java
package voc;
import java.io.File;
import java.sql.*;
import java.util.ArrayList;
public class Database {
private Connection conn = null;
private Statement st = null;
private String DBfilename = null;
public void setDBfilename(String pFilename)
{
this.DBfilename = pFilename;
}
public void createNewEmptyDbFile() {
try {
File file = new File(this.DBfilename);
file.delete();
} catch (Exception e) {
throw new RuntimeException("Cannot create a new database file.",e);
}
}
public void establishConnection() {
try {
// create database connection
conn = DriverManager.getConnection("jdbc:sqlite:" + this.DBfilename);
st = conn.createStatement();
st.setQueryTimeout(30);
} catch (SQLException e) {
throw new RuntimeException("Cannont create a connection to the SQL database.",e);
}
}
public void createBasicSqlTable() {
try {
String s = "create table vocabulary (english string, german string);";
st.executeUpdate(s);
} catch (SQLException e) {
throw new RuntimeException("Cannot create a basic SQL Table.",e);
}
}
/**
* @returns the names of the SQL tables.
*/
public ArrayList<String> showTables() {
try {
String s = "SELECT name FROM sqlite_master WHERE type='table';";
ResultSet rs = st.executeQuery(s);
ArrayList<String> SQLTableNames = new ArrayList<String>();
while (rs.next())
{
SQLTableNames.add(rs.getString(1));
}
return SQLTableNames;
} catch (SQLException e) {
throw new RuntimeException("SQL command to select all tables failed", e);
}
}
/**
* @param englishVoc: given word we want to learn
* @param germanTranslation: translation of the given word
*/
public void insertWordPairIntoTable(String englishVoc, String germanTranslation) {
try {
String s = "insert into vocabulary values("
+ englishVoc + "," + germanTranslation + ");";
st.executeUpdate(s);
} catch (SQLException e) {
throw new RuntimeException("Cannot insert word pair into SQL Database.", e);
}
}
/**
* @param pEnglishVoc: english word we want to learn (1st column of db)
* @return the german translation of the parameter (2nd column of db)
*/
public String getGermanTranslation(String pEnglishVoc) {
ResultSet rs;
try {
String s = "select german from vocabulary where english="
+ pEnglishVoc + ";";
rs = st.executeQuery(s);
return rs.getString(1);
} catch (SQLException e) {
throw new RuntimeException("Cannot get german translation for given english word.", e);
}
}
}
<小时/>
LoadVocabularyListIntoDB.java
package voc;
import org.apache.commons.csv.CSVFormat;
import org.apache.commons.csv.CSVParser;
import org.apache.commons.csv.CSVRecord;
import java.io.IOException;
import java.nio.charset.Charset;
import java.net.MalformedURLException;
import java.net.URL;
import static java.nio.charset.Charset.forName;
public class LoadVocabularyListIntoDB {
private Database theDB;
public LoadVocabularyListIntoDB() {
theDB = new Database();
theDB.setDBfilename("database.db");
theDB.createNewEmptyDbFile();
theDB.establishConnection();
theDB.createBasicSqlTable();
this.insertVocabularyListIntoDB();
}
public void insertVocabularyListIntoDB() {
URL url = null;
try {
url = new URL("https://raw.githubusercontent.com/toogley/voc-data/master/technology_and_society");
} catch (MalformedURLException e) {
throw new RuntimeException("URL of VocabularyList(" + url +") is malformed", e);
}
// CSVParser.parse(url,...) needs a Charset object
Charset charset = forName("UTF-8");
CSVParser parser = null;
try {
parser = CSVParser.parse(url, charset, CSVFormat.RFC4180);
} catch (IOException e) {
throw new RuntimeException("Failed to read from" + url, e);
}
for (CSVRecord csvRecord : parser) {
String englishWord = csvRecord.get(0);
String germanWord = csvRecord.get(1);
theDB.insertWordPairIntoTable(englishWord, germanWord);
}
}
public static void main(String[] args) {
new LoadVocabularyListIntoDB();
}
}
<小时/>
pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>voc</groupId>
<artifactId>voc</artifactId>
<packaging>jar</packaging>
<version>1.0-SNAPSHOT</version>
<name>voc</name>
<url>http://maven.apache.org</url>
<repositories>
<repository>
<id>tmate</id>
<url>http://maven.tmatesoft.com/content/repositories/releases</url>
</repository>
</repositories>
<dependencies>
<dependency>
<groupId>org.xerial</groupId>
<artifactId>sqlite-jdbc</artifactId>
<version>3.8.11.2</version>
</dependency>
<!-- http://mvnrepository.com/artifact/juni1t/junit -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
<dependency>
<groupId>org.dbunit</groupId>
<artifactId>dbunit</artifactId>
<version>2.5.2</version>
<scope>test</scope>
</dependency>
<!-- The dependencies below are needed for inserting the vocabularyList into DB. -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-csv</artifactId>
<version>1.3</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.5</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
<version>1.5.0</version>
<executions>
<execution>
<id>compilation preparations</id>
<phase>compile</phase>
<goals>
<goal>java</goal>
</goals>
</execution>
<execution>
<id>test preparations</id>
<phase>test</phase>
<goals>
<goal>java</goal>
</goals>
</execution>
</executions>
<configuration>
<!-- adds every word pair of vocabulary csv list (https://github.com/toogley/voc-data)
to the SQL Database (while building) -->
<mainClass>voc.LoadVocabularyListIntoDB</mainClass>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<archive>
<manifest>
<mainClass>voc.Control</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
</plugins>
</build>
</project>
<小时/>
最佳答案
这就是为什么您应该使用带有参数占位符的 PreparedStatement
而不是将值连接到查询字符串中。问题是在您的测试中您在值周围添加了引号。这避免了语句中最基本的问题,但是您使用的数据源没有这些引号,因此输入:
accountant,Buchhalter
执行的查询是:
insert into vocabulary values(accountant,Buchalter)
而不是你的意图:
insert into vocabulary values('accountant','Buchalter')
解决方案是不添加引号,而是重写您的方法以使用准备好的语句:
public void insertWordPairIntoTable(String englishVoc, String germanTranslation) {
try (PreparedStatement insert = connection.prepareStatement(
"insert into vocabulary values(?,?)")) {
insert.setString(1, englishVoc);
insert.setString(2, germanTranslation);
insert.executeUpdate();
} catch (SQLException e) {
throw new RuntimeException("Cannot insert word pair into SQL Database.", e);
}
}
您可能需要考虑准备一次语句,以便可以重复使用它。
下面是您其他问题的附录。如果您需要更多信息,您确实需要针对每个问题提出一个单独的问题来仅解决该单个问题。
java.lang.reflect.InitationTargetException
是通过 Maven 执行此操作引起的。 Maven 通过反射执行您的代码,代码中引发的任何异常都会在进入 Maven 之前被包装在 java.lang.reflect.InvocatTargetException
中。
关于您的调试:我不确定您的意思。你应该能够在任何像样的 IDE 中调试它;在构建期间执行的代码(我认为不是:maven 在构建阶段之后执行它)始终可以通过单独执行来进行调试。
关于java.sql.SQLException : no such column with the value I'm trying to insert,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38535221/
在过去的几个月里,我一直在研究 Haskell,我遇到了一个我不太确定如何处理的单子(monad)的情况。 我有一个 a -> m a 类型的值第二个类型为 m (a -> a)我需要对它们进行组合,
仿函数有 (a -> b) -> m a -> m b 应用程序有 f (a -> b) -> f a -> f b Monad 有 m a -> (a -> m b) -> m b 但是,是否有扩展
我是 Haskell 的新手,我想知道是否有比 Hoogle 更好的方法来确定一个库功能是否重复? 举个例子:我有很多函数f :: Monad a => a -> m a我想链接在一起,比如 f123
将存储在一系列列表中的 m、m、n 维数组组合成一个 m、m、n 维数组的方法是什么? 示例: 这是三个包含 m,m,n 维数组的列表: list1 <- array (1, dim = c(5, 5
有没有办法写一个函数f::(a -> b -> ... -> t) -> (Monad m => m a -> m b -> ... -> m t ),基本上是 liftMn 对于任何 n? (编辑:
我有一个像这样的 pandas 数据框: df = pd.DataFrame({'A':[1,3,2,9],'B':[2,1,2,7],'C':[7,2,4,6],'D':[8,1,6,4]},ind
这个问题来自文章“Trivial Monad”,地址:http://blog.sigfpe.com/2007/04/trivial-monad.html 。提供的答案是 h x y = x >>= (
所以>>= :: m a -> (a -> m b) -> m b和>> :: m a -> m b -> m b . 而 f b -> f a . 但我想要一些能m a -> (a -> m b)
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 这个问题似乎与 help center 中定义的范围内的编程无关。 . 关闭 3 年前。 Improve
当我安装 rakudo来源: $ git clone git@github.com:rakudo/rakudo.git $ cd rakudo $ perl Configure.pl --gen-mo
我正在尝试通过查看一些练习来提高我的 Idris 技能 Software Foundations (最初是为 Coq 设计的,但我希望对 Idris 的翻译不会太糟糕)。我在使用 "Exercise:
我想知道以下是否可行。 与服务器交换密码时,应保护密码。因此,用户可以使用生成的 key kUser 来加密密码。 Encrypt(m, kUser) 生成加密消息 eU(m)。现在用户将此信息发送到
这两个表之间存在什么样的关系(1:1、1:m、m:m,等等)? CREATE TABLE IF NOT EXISTS `my_product` ( `id` int(11) NOT NULL au
有人可以解释类型的含义以及如何实现吗? class Foldable f where foldMap :: (Monoid m) => (a -> m) -> f a -> m 基于 https:
例如,在 MVC 应用程序中,我可以使用 Html 助手来创建这样的标签: @Html.LabelFor(m => m.ProductName) 我没有在任何地方声明变量“m”,但 IDE 会自动找出
更新:澄清、更明确的重点和缩短的示例: 我可以避免 M op+(M&&,M&&) 过载吗?假设,我想很好地处理 RValues?我想其他三个重载是必需的。 我首先使用 (&&,&&) 重载的原因: 通
假设我有一个函数,它接受两个向量并返回一个整数,例如一个向量中也存在另一个向量中的元素数量。喜欢: f m [,1] [,2] [,3] [1,] "c" "i" "c" [2,] "
我想将字符串(字幕)转换为: 585 00:59:59,237 --> 01:00:01,105 - It's all right. - He saw us! 586 01:00:01,139 -->
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 要求提供代码的问题必须表现出对所解决问题的最低限度理解。包括尝试过的解决方案、为什么它们不起作用,以及预
是否可以将 Linux 中的大文件将 d.m.Y h:m:s 转换为 Y-d-m h:m:s? 示例数据 "30.07.2016 00:00:00",DN123,PAPN,PAPN,TEST,9189
我是一名优秀的程序员,十分优秀!