Java 如何同时执行两个查询?

Java 如何同时执行两个查询?,java,sql,database,Java,Sql,Database,我正在处理一个项目,我想插入到两个不同的表中,所以我编写了这两个查询(query1,query2),当我只使用一个查询运行程序时,我没有得到任何异常,但当一起执行时,我有一堆异常,我使用了preparedStatement execute(),但不起作用 注:我不是很有经验,请简单解释 private void loadBusesToDB() throws SQLException{ Connection connection = connect();

我正在处理一个项目,我想插入到两个不同的表中,所以我编写了这两个查询(query1,query2),当我只使用一个查询运行程序时,我没有得到任何异常,但当一起执行时,我有一堆异常,我使用了preparedStatement execute(),但不起作用 注:我不是很有经验,请简单解释

private void loadBusesToDB() throws SQLException{
            Connection connection = connect();

            String query = "INSERT INTO Bus (nomLigne, Marque, Matricule, Capacite)"
                    + "VALUES (?, ?, ?, ?)";

            String query2 = "INSERT INTO Lignes (nomLigne, Sntv Depart, SNTV Arrive, prix)"
                    + "VALUES (?, ?, ?, ?)";

            PreparedStatement ps = null;
            PreparedStatement ps2 = null;
        try {

            ps = connection.prepareStatement(query);
            ps2 = connection.prepareStatement(query2);

            for(Bus bus : Bus.buses){
                ps.setString(1, bus.getNomLigne());
                ps.setString(2, bus.getMarque());
                ps.setString(3, bus.getMatricule());
                ps.setInt(4, bus.getCapacite());
                ps.addBatch();   // THE INSERT HAPPENS HERE
            }
            ps.executeBatch();


            for(Lignes ligne : Lignes.lignes){
                ps2.setString(1, ligne.getNomLigne());
                ps2.setString(2, ligne.getDepart());
                ps2.setString(3, ligne.getArrive());
                ps2.setFloat(4, ligne.getPrix());
                ps2.addBatch();   // THE INSERT HAPPENS HERE
            }
            ps2.executeBatch();

        } catch (SQLException ex) {
            ex.printStackTrace();
            System.out.println("ERROR HERE");
            throw ex;
        }finally{
            ps.close();
            ps2.close();
            connection.close();
        }
        }
错误:

net.ucanaccess.jdbc.UcanaccessSQLException:UCAExc:::3.0.2用户缺少权限或找不到对象:SNTV 位于net.ucanaccess.jdbc.UcanaccessConnection.prepareStatement(UcanaccessConnection.java:509) 在sntv.MainMenuController.loadBusesToDB(MainMenuController.java:135) 在sntv.MainMenuController.initialize(MainMenuController.java:277) 在javafx.fxml.fxmloader.loadImpl(fxmloader.java:2548) 在javafx.fxml.fxmloader.loadImpl(fxmloader.java:2441)


正如@uaraven所指出的,第二个查询中的列名存在语法错误。在SQL中,任何标识符(包括表、列、存储过程、函数等)的名称或名称中带有空格或特殊字符/符号,与保留字匹配,在任何子句中引用时都需要转义(
选择
加入
其中
分组依据
拥有
订单依据

现在,不同的RDBMS的处理方式不同。根据数据库考虑以下事项:SQLite可能是包含所有的.R/DBMS的唯一RDBMS。 双引号(ANSI-SQL标准)(Oracle、DB2、Postgres、RedShift、Teradata、SQLite,其中一些添加了大写规则;SQL Server/MySQL支持模式更改)

String query2=“插入队列(nomLigne、\'SNTV出发\'、\'SNTV到达\'、prix)”
+“值(?,?,?)”;
方括号(SQL Server、Sybase、SQLite、MS Access)

String query2=“插入路线(nomLigne、[Sntv出发]、[Sntv到达]、大奖赛)”
+“值(?,?,?)”;
回执(MySQL、MariaDB、Google BigQuery标准SQL、SQLite、MS Access)

String query2=“插入队列(nomLigne、`Sntv Depart`、`Sntv arrival`、prix)”
+“值(?,?,?)”;

正如@uaraven所指出的,第二个查询中的列名存在语法错误。在SQL中,任何名称或名称中带有空格或特殊字符/符号的标识符(包括表、列、存储过程、函数等)在任何子句中引用时都需要转义(
选择
加入
其中
分组依据
拥有
订单依据

现在,不同的RDBMS的处理方式不同。根据数据库考虑以下事项:SQLite可能是包含所有的.R/DBMS的唯一RDBMS。 双引号(ANSI-SQL标准)(Oracle、DB2、Postgres、RedShift、Teradata、SQLite,其中一些添加了大写规则;SQL Server/MySQL支持模式更改)

String query2=“插入队列(nomLigne、\'SNTV出发\'、\'SNTV到达\'、prix)”
+“值(?,?,?)”;
方括号(SQL Server、Sybase、SQLite、MS Access)

String query2=“插入路线(nomLigne、[Sntv出发]、[Sntv到达]、大奖赛)”
+“值(?,?,?)”;
回执(MySQL、MariaDB、Google BigQuery标准SQL、SQLite、MS Access)

String query2=“插入队列(nomLigne、`Sntv Depart`、`Sntv arrival`、prix)”
+“值(?,?,?)”;

错误消息似乎是某种数据库管道消息。您可以尝试一些简单的方法,比如在任一表上执行
SELECT*
,看看是否至少可以正常工作吗?另外,我建议使用
try with
资源,这样您就不需要在finally块中关闭
ps
,这样就可以了看起来像这样
try(PreparedStatement ps=connection.prepareStatement(query)){}
(如果您至少使用Java 8)。要缩小问题范围,请首先尝试插入到一个表中并查看。这
插入到Lignes(nomLigne、Sntv Depart、Sntv arrival、prix)
,是
Sntv Depart
列名还是您正试图为该列设置别名?如果该列名中确实包含空格(从错误消息判断为是)然后,您需要引用它,例如,请参见删除第一个表时第二个表是否有效?错误消息似乎是某种数据库管道消息。您可以尝试一些简单的操作,例如在任一表上执行
SELECT*
,以查看是否至少可以正常工作?另外,我建议使用
try with
resources,这样您就不需要关闭finally块中的
ps
,它看起来像是
try(PreparedStatement ps=connection.prepareStatement(query)){}
(如果您至少使用Java 8)。要缩小问题范围,请首先尝试插入一个表,然后查看.this
insert-into-Lignes(nomLigne,Sntv Depart,Sntv arrime,prix)
,Sntv Depart是列名还是您正试图为该列设置别名?如果该列名中确实有空格(从错误消息判断,是这样的)然后,你需要引用它,例如,当你删除第一个时,第二个会工作吗?谢谢,我做了回退,它工作了,谢谢你这么多的伟大的听到和乐于助人。考虑StopExcel的方式说。谢谢我做的背板,它的工作,谢谢你这么多伟大的听到和高兴的帮助!说得对。