执行INSERT语句HSQL Java时出现异常

执行INSERT语句HSQL Java时出现异常,java,eclipse,hsqldb,sql-insert,Java,Eclipse,Hsqldb,Sql Insert,我有一个简单的代码,它让我发疯 public void insertVectorEstacionario() { DBManager dbM = DBManager.instance(); if(N == 3) { dbM.insert("INSERT INTO Markov(IdIndicador, FechaDesde, FechaHasta, Pv, Pa, Pr, Pn) VALUES(" + Integer.toStri

我有一个简单的代码,它让我发疯

public void insertVectorEstacionario() {
    DBManager dbM = DBManager.instance();
    if(N == 3) {
        dbM.insert("INSERT INTO Markov(IdIndicador, FechaDesde, FechaHasta, Pv, Pa, Pr, Pn) VALUES(" + 
                Integer.toString(idIndicador) + "," + "#" + inicio_periodo.toString() + "#" + "," + "#" + fin_periodo.toString() + "#" + "," +
                Double.toString(vector_estacionario[0]) + "," + Double.toString(vector_estacionario[1]) + "," + Double.toString(vector_estacionario[2]) + "," + Double.toString(0.0) + ")");

    }

    if(N == 4) {
        dbM.insert("INSERT INTO Markov(IdIndicador, FechaDesde, FechaHasta, Pv, Pa, Pr, Pn) VALUES(" + 
        Integer.toString(idIndicador) + "," + "#" + inicio_periodo.toString() + "#" + "," + "#" + fin_periodo.toString() + "#" + "," +
        Double.toString(vector_estacionario[0]) + "," + Double.toString(vector_estacionario[1]) + "," + Double.toString(vector_estacionario[2]) + "," + Double.toString(vector_estacionario[3]) + ")");
    }
}
现在,当N=4时执行的第二条insert语句工作正常,问题在于第一条语句(当N=3时)抛出的嵌套异常如下:

net.ucanaccess.jdbc.UcanaccessSQLException: unexpected token: Z_0536632167783088E required: )
at net.ucanaccess.jdbc.UcanaccessStatement.execute(UcanaccessStatement.java:110)
at com.operativa.quartilegenerator.datamodel.DBManager.insert(DBManager.java:71)
at com.operativa.quartilegenerator.GenerarMarkov.insertVectorEstacionario(GenerarMarkov.java:85)
at com.operativa.quartilegenerator.QuartileGUI$16$1.doInBackground(QuartileGUI.java:969)
at com.operativa.quartilegenerator.QuartileGUI$16$1.doInBackground(QuartileGUI.java:1)
at javax.swing.SwingWorker$1.call(Unknown Source)
at java.util.concurrent.FutureTask.run(Unknown Source)
at javax.swing.SwingWorker.run(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
Caused by: java.sql.SQLSyntaxErrorException: unexpected token: Z_0536632167783088E required: )
at org.hsqldb.jdbc.JDBCUtil.sqlException(Unknown Source)
at org.hsqldb.jdbc.JDBCUtil.sqlException(Unknown Source)
at org.hsqldb.jdbc.JDBCStatement.fetchResult(Unknown Source)
at org.hsqldb.jdbc.JDBCStatement.execute(Unknown Source)
at net.ucanaccess.jdbc.Execute.executeWrapped(Execute.java:62)
at net.ucanaccess.jdbc.AbstractExecute.executeBase(AbstractExecute.java:121)
at net.ucanaccess.jdbc.Execute.execute(Execute.java:52)
at net.ucanaccess.jdbc.UcanaccessStatement.execute(UcanaccessStatement.java:107)
... 10 more
Caused by: org.hsqldb.HsqlException: unexpected token: Z_0536632167783088E required: )
at org.hsqldb.error.Error.parseError(Unknown Source)
at org.hsqldb.ParserBase.unexpectedTokenRequire(Unknown Source)
at org.hsqldb.ParserBase.readThis(Unknown Source)
at org.hsqldb.ParserDQL.XreadAllTypesValueExpressionPrimary(Unknown Source)
at org.hsqldb.ParserDQL.XreadAllTypesPrimary(Unknown Source)
at org.hsqldb.ParserDQL.XreadAllTypesFactor(Unknown Source)
at org.hsqldb.ParserDQL.XreadAllTypesTerm(Unknown Source)
at org.hsqldb.ParserDQL.XreadAllTypesCommonValueExpression(Unknown Source)
at org.hsqldb.ParserDQL.XreadValueExpressionOrNull(Unknown Source)
at org.hsqldb.ParserDQL.XreadValueExpressionWithContext(Unknown Source)
at org.hsqldb.ParserDQL.readRow(Unknown Source)
at org.hsqldb.ParserDQL.XreadContextuallyTypedTable(Unknown Source)
at org.hsqldb.ParserDML.compileInsertStatement(Unknown Source)
at org.hsqldb.ParserCommand.compilePart(Unknown Source)
at org.hsqldb.ParserCommand.compileStatements(Unknown Source)
at org.hsqldb.Session.executeDirectStatement(Unknown Source)
at org.hsqldb.Session.execute(Unknown Source)
... 16 more
两个语句几乎相同,它只改变了第四个参数。我什么都试过了,但都做不到。提前感谢您提供的任何帮助

准备好你的声明:

public void insertVectorEstacionario() {
    DBManager dbM = DBManager.instance();
    PreparedStatement n3 = null;

    String strn3 = String.format("INSERT INTO Markov(IdIndicador, FechaDesde, FechaHasta, Pv, Pa, Pr, Pn) VALUES(" + 
            Integer.toString(idIndicador) + "," + "#" + inicio_periodo.toString() + "#" + "," + "#" + fin_periodo.toString() + "#" + "," +
            Double.toString(vector_estacionario[0]) + "," + Double.toString(vector_estacionario[1]) + "," + Double.toString(vector_estacionario[2]) + "," + "0.823749287592)");

    if(N == 3) {

        try {
            n3 = dbM.getConnection().prepareStatement(strn3);
            n3.execute();
        } catch(Exception e){e.printStackTrace();}
    }
}

这是堆栈:

net.ucanaccess.jdbc.UcanaccessSQLException: unexpected token: Z_8901313574667937E required: )
at net.ucanaccess.jdbc.UcanaccessConnection.prepareStatement(UcanaccessConnection.java:455)
at com.operativa.quartilegenerator.GenerarMarkov.insertVectorEstacionario(GenerarMarkov.java:101)
at com.operativa.quartilegenerator.QuartileGUI$16$1.doInBackground(QuartileGUI.java:969)
at com.operativa.quartilegenerator.QuartileGUI$16$1.doInBackground(QuartileGUI.java:1)
at javax.swing.SwingWorker$1.call(Unknown Source)
at java.util.concurrent.FutureTask.run(Unknown Source)
at javax.swing.SwingWorker.run(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
Caused by: java.sql.SQLSyntaxErrorException: unexpected token: Z_8901313574667937E required: )
at org.hsqldb.jdbc.JDBCUtil.sqlException(Unknown Source)
at org.hsqldb.jdbc.JDBCUtil.sqlException(Unknown Source)
at org.hsqldb.jdbc.JDBCPreparedStatement.<init>(Unknown Source)
at org.hsqldb.jdbc.JDBCConnection.prepareStatement(Unknown Source)
at net.ucanaccess.jdbc.UcanaccessConnection.prepareStatement(UcanaccessConnection.java:453)
... 9 more
Caused by: org.hsqldb.HsqlException: unexpected token: Z_8901313574667937E required: )
at org.hsqldb.error.Error.parseError(Unknown Source)
at org.hsqldb.ParserBase.unexpectedTokenRequire(Unknown Source)
at org.hsqldb.ParserBase.readThis(Unknown Source)
at org.hsqldb.ParserDQL.XreadAllTypesValueExpressionPrimary(Unknown Source)
at org.hsqldb.ParserDQL.XreadAllTypesPrimary(Unknown Source)
at org.hsqldb.ParserDQL.XreadAllTypesFactor(Unknown Source)
at org.hsqldb.ParserDQL.XreadAllTypesTerm(Unknown Source)
at org.hsqldb.ParserDQL.XreadAllTypesCommonValueExpression(Unknown Source)
at org.hsqldb.ParserDQL.XreadValueExpressionOrNull(Unknown Source)
at org.hsqldb.ParserDQL.XreadValueExpressionWithContext(Unknown Source)
at org.hsqldb.ParserDQL.readRow(Unknown Source)
at org.hsqldb.ParserDQL.XreadContextuallyTypedTable(Unknown Source)
at org.hsqldb.ParserDML.compileInsertStatement(Unknown Source)
at org.hsqldb.ParserCommand.compilePart(Unknown Source)
at org.hsqldb.ParserCommand.compileStatement(Unknown Source)
at org.hsqldb.Session.compileStatement(Unknown Source)
at org.hsqldb.StatementManager.compile(Unknown Source)
at org.hsqldb.Session.execute(Unknown Source)
... 12 more
net.ucanaccess.jdbc.UcanaccessSQLException:意外标记:需要Z_8901313574667937E:)
位于net.ucanaccess.jdbc.UcanaccessConnection.prepareStatement(UcanaccessConnection.java:455)
在com.operativa.quartilegenerator.GenerarMarkov.insertvectorestationario(GenerarMarkov.java:101)上
位于com.operativa.quartilegenerator.QuartileGUI$16$1.doInBackground(QuartileGUI.java:969)
在com.operativa.quartilegenerator.QuartileGUI$16$1.doInBackground(QuartileGUI.java:1)
位于javax.swing.SwingWorker$1.call(未知源)
位于java.util.concurrent.FutureTask.run(未知源)
位于javax.swing.SwingWorker.run(未知源)
位于java.util.concurrent.ThreadPoolExecutor.runWorker(未知源)
位于java.util.concurrent.ThreadPoolExecutor$Worker.run(未知源)
位于java.lang.Thread.run(未知源)
原因:java.sql.SQLSyntaxErrorException:意外标记:Z_8901313574667937E必需:)
位于org.hsqldb.jdbc.jdbcuti.sqlException(未知源)
位于org.hsqldb.jdbc.jdbcuti.sqlException(未知源)
位于org.hsqldb.jdbc.JDBCPreparedStatement。(来源未知)
位于org.hsqldb.jdbc.JDBCConnection.prepareStatement(未知源)
位于net.ucanaccess.jdbc.UcanaccessConnection.prepareStatement(UcanaccessConnection.java:453)
... 9更多
原因:org.hsqldb.hsqldb异常:意外令牌:Z_8901313574667937E必需:)
位于org.hsqldb.error.error.parseError(未知源)
位于org.hsqldb.ParserBase.unexpectedTokenRequire(未知来源)
位于org.hsqldb.ParserBase.readThis(未知来源)
位于org.hsqldb.ParserDQL.XreadAllTypesValueExpressionPrimary(未知源)
位于org.hsqldb.ParserDQL.XreadAllTypesPrimary(未知源)
位于org.hsqldb.ParserDQL.XreadAllTypesFactor(未知源)
位于org.hsqldb.ParserDQL.XreadAllTypesTerm(未知源)
位于org.hsqldb.ParserDQL.XreadAllTypesCommonValueExpression(未知源)
位于org.hsqldb.ParserDQL.XreadValueExpressionOrNull(未知源)
位于org.hsqldb.ParserDQL.XreadValueExpressionWithContext(未知源)
位于org.hsqldb.ParserDQL.readRow(未知源)
位于org.hsqldb.ParserDQL.XreadContextuallyTypedTable(未知源)
位于org.hsqldb.ParserDML.compileInsertStatement(未知源)
位于org.hsqldb.ParserCommand.compilePart(未知源)
位于org.hsqldb.ParserCommand.compileStatement(未知源)
位于org.hsqldb.Session.compileStatement(未知源)
位于org.hsqldb.StatementManager.compile(未知源)
位于org.hsqldb.Session.execute(未知源)
... 还有12个

以上述方式生成的sql语句可以包含一个科学符号,如下所示:

insert into T1(xxx) values(4.0E-16);
UCanAccess不识别这种数字格式。
您应该使用带有参数值的准备语句或正确设置双值格式(例如使用DecimalFormat)。

您在db中的第四个标记值是什么?使用准备语句:。您在查询中忘记了许多引号,并且在参数值中没有转义它们。准备好的语句将为您完成所有这些,并将避免SQL注入攻击。代码也会更容易阅读。这越来越让人厌烦了。必须有人编写for people的变体来连接字符串,而不是使用预先准备好的语句。大家好,谢谢你们的快速响应。你说的我都试过了。。。这一切对我都不起作用,当我尝试PreparedStatement时,它抛出了一个类似的异常。真正困扰我的是,第二条insert语句(虽然很邋遢)工作正常,而且两者几乎相同。使用准备好的语句显示您的代码,并显示异常的完整堆栈跟踪。我没有意识到这可能是问题所在,但我尝试了您在这段代码中所说的:DecimalFormat df=new DecimalFormat(“#.###########“);这是输出:插入Markov(idididicador,FechaDesde,FechaHasta,Pv,Pa,Pr,Pn)值(1,#2000-08-08#,#2010-08-08#,050177,049822,000002,0.0)出于某种该死的原因,十进制分隔符在输出中从点变为逗号,甚至很难,我明确地将其设置为格式,因此现在throwned异常表示存在列错误计数,这是正确的,因为逗号是列分隔符。我最终修复了它,正如jamadei所说,这是科学符号。分隔符问题这与语言环境有关,我在这篇文章后修复了它。谢谢大家的帮助。我真的很感激。