【问题标题】:SQLSyntaxError: Reading queries from text file: derbySQLSyntaxError:从文本文件中读取查询:derby
【发布时间】:2015-01-25 13:37:07
【问题描述】:

我认为从文本文件中读取 sql 查询会很好。 这是我所做的:

  1. 获取连接(看起来不错)
  2. 已创建语句对象 (-do-)
  3. 将自动提交设置为 false (-do-)
  4. 从文本文件中将查询读入集合 (-do-)
  5. 问题:在语句中使用 execute(String)...

之后我回滚并关闭连接...

这是我的代码:现在放在一个类中

    import java.sql.*;
    import java.util.*;
    import java.io.*;

   class Test2{
    private static void execute(Collection<String> queries,
        Statement stmt) throws SQLException{
        for(String query : queries){
            query.trim();
            stmt.execute(query);
        }
    }
    private static Collection<String> getQueries(String s)
        throws IOException{
        InputStream is = new BufferedInputStream
            (new FileInputStream(s));

        int content = 0;
        StringBuilder sb = new StringBuilder();
        while((content = is.read()) != -1){
            sb.append((char)content);
        }

        String s2 = sb.toString();
        Collection<String> queries = Arrays.asList(s2.split(";"));
        return queries;
    }
    private static Connection getConnection()
        throws SQLException{
        Connection conn = DriverManager
            .getConnection("jdbc:derby:testDB", 
            "", "");

        return conn;
    }
    private static void display(ResultSet set, int columnNos) 
        throws SQLException{
        while(set.next()){
            int i = 1;
            while(i <= columnNos){
                String s = set.getString(i);
                System.out.println(s + " ");
                i++;
            }
        }
    }
    public static void main(String args[]) throws Exception{
        Connection conn = getConnection();          
        Statement stmt = conn.createStatement();
        conn.setAutoCommit(false);
        Collection<String> queries = getQueries("queries.txt");
        System.out.println(queries);
        try{
            execute(queries, stmt);
        }
        catch(Exception e){
            System.out.println(e);
            conn.rollback();
        }
        conn.close();
    }
}

我是否忽略了什么?通常作为字符串传递的查询工作正常......

[Create table test(message varchar(20)),
Insert into test values('Hello World'),
Select * from test,
Drop table test,
]
java.sql.SQLSyntaxErrorException: Syntax error: Encountered "<EOF>" at line 1, c
olumn 2.

【问题讨论】:

  • 我刚开始使用数据库......显示方法只是开箱即用,因为我对 api 了解不多......反正这里没有使用它

标签: java mysql sql derby


【解决方案1】:

您的日志显示查询列表包含一个空白字符串作为其最后一个元素。空白字符串不是有效的 SQL 查询。

只是一个建议:这是一种使用调试器很容易发现的问题。学习使用它。它非常简单直观,可以节省您的生命。

另外,query.trim(); 没有做任何有用的事情。需要替换为query = query.trim();

【讨论】:

  • 它说在事务仍然存在时无法关闭连接。它位于带有完整跟踪的 catch 块之外。我想操作完成了,但还是有什么卡住了。
  • 我想没有带记事本的调试器。练习
  • 这是一个完全不同的问题。但信息非常明确。你正在开始一个事务,但你从不提交它。因此,当您调用 close() 时,事务实际上仍在进行中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-30
  • 2021-01-22
  • 2012-10-09
  • 1970-01-01
  • 2020-02-24
相关资源
最近更新 更多