如何使用“source”命令运行脚本文件?

时间:2011-12-08 20:27:24

标签: java mysql

我正在编写连接到localhost的应用程序。当应用程序首次运行时,我希望它使用此方法初始化数据库:

public void initDataBase() {
    try {
        Statement stm = con.createStatement();
        stm.executeQuery("source shippingSQLscript.sql");
    } catch (SQLException ex) {
        ex.printStackTrace();
    }
}

其中shippingSQLscript.sql包含正确的sql语句以插入所有数据。但是,当我运行它时,方法抛出:

com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: 
You have an error in your SQL syntax; check the manual that corresponds to your 
MySQL server version for the right syntax to use near 'source shippingSQLscript.sql'
at line 1

我也尝试使用stm.execute(),但结果相同。

2 个答案:

答案 0 :(得分:3)

您无法使用JDBC驱动程序执行此操作。 source只是MySQL命令行工具支持的命令。见这里:

  

http://forums.mysql.com/read.php?39,406094,406329#msg-406329

以下是命令行工具的命令列表。大多数支持JDBC查询语句。

  

http://dev.mysql.com/doc/refman/5.5/en/mysql-commands.html

您必须从代码中的文件加载SQL命令并将它们发送到JDBC执行方法。类似的东西:

Statement stm = con.createStatement();
BufferedReader reader = new BufferedReader(new FileReader(new File(...)));
while (true) {
    String line = reader.readLine();
    if (line == null) {
        break;
    }
    // this is the trick -- you need to pass different SQL to different methods
    if (line.startsWith("SELECT")) {
        stm.executeQuery(line);
    } else if (line.startsWith("UPDATE") || line.startsWith("INSERT")
        || line.startsWith("DELETE")) {
        stm.executeUpdate(line);
    } else {
        stm.execute(line);
    }
}
stm.close();

答案 1 :(得分:0)

我使用了这样的东西......如果有多行的sql命令,它就可以工作。 如果sql文件太大也可能有问题,对我来说它工作正常。

  BufferedReader br = new BufferedReader(new FileReader(DBFILE));
  statement = connection.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE);
  System.out.println("Reading SQL File...");
  String line="";
  StringBuilder sb = new StringBuilder();

  while( (line=br.readLine())!=null)
  {
     if(line.length()==0 || line.startsWith("--"))
     {
        continue;
     }else
     {
        sb.append(line);
     } 

     if(line.trim().endsWith(";"))
     {
        statement.execute(sb.toString());
        sb = new StringBuilder();
     }

  }
  br.close();