1

MySQL (JDBC) で Java を使用しており、ダンプ ファイルをデータベースにインポートしたいと考えています。これを行う正しい方法は何ですか?次のコードを試しました:

// function "connectToDB" connects to the Database, and not the server.
// variable sourcePath refers to the dumpfile.
    Connection con = connectToDB(USERNAME, PASSWORD); 
    String q = "source " + sourcePath;
    System.out.println("Q is: " + q);
    try {
        Statement statement = con.createStatement();
        statement.executeUpdate(q);
    } catch (Exception ex) {
        ex.printStackTrace();
    }
    closeConnection(con);

しかし、私は MySQLSyntaxErrorException を取得します:

SQL 構文にエラーがあります。1行目の「source C:...\Desktop\dumpfile.sql」の近くで使用する正しい構文については、MySQLサーバーのバージョンに対応するマニュアルを確認してください。

4

4 に答える 4

4

みんなの助けに感謝し、彼らのアイデアを読んで、私はついにdumpfile.sqlをインポートしました。それで、誰かが同じ問題を抱えているなら、私のために働いたサンプルコードはこれです:

Connection con = connectToDB(USERNAME, PASSWORD);
/* Note that con is a connection to database, and not the server.
if You have a connection to the server, the first command in the dumpfile should be the
USE db_name; */
String q = "";
File f = new File(sourcePath); // source path is the absolute path of dumpfile.
try {
    BufferedReader bf = new BufferedReader(new FileReader(f));
        String line = null;
        line = bf.readLine();
        while (line != null) {
            q = q + line + "\n";
            line = bf.readLine();
        }
    } catch (Exception ex) {
        ex.printStackTrace();
    }
// Now we have the content of the dumpfile in 'q'.
// We must separate the queries, so they can be executed. And Java Simply does this:
String[] commands = q.split(";");

try {
    Statement statement = con.createStatement();
    for (String s : commands) {
        statement.execute(s);
    }
} catch (Exception ex) {
}
closeConnection(con);

編集: connectToDB関数の追加:

private Connection connectToDB(String username, String password) {
    try {
        Class.forName("com.mysql.jdbc.Driver");
        String url = "jdbc:mysql://localhost:3306/" + DATABASE;
        Properties objProperties = new Properties();
        objProperties.put("user", username);
        objProperties.put("password", password);
        objProperties.put("useUnicode", "true");
        objProperties.put("characterEncoding", "utf-8");

        Connection con = DriverManager.getConnection(url, objProperties);
        return con;
    } catch (Exception ex) {
        System.out.println("Connection to sql database failed.");
        ex.printStackTrace();
        return null;
    }
}
于 2013-02-04T20:16:58.517 に答える
4

実際に @Makan Tayebi 自身の回答を使用しましたが、いくつか改善できると感じました。最初の問題は、ダンプ ファイルのサイズが大きすぎる場合に発生する可能性があり、このアプローチは最適ではありません。テーブル内のデータに特殊文字「;」が含まれている場合、2 番目の問題が発生する可能性があります。データの '' 内で、文字列で読み込まれたファイルを分割します。これについても分割します。と例外が発生します。さて、これが私の解決策です。彼を編集しただけです:

Connection con = connectToDB(USERNAME, PASSWORD);
/* Note that con is a connection to database, and not the server.
if You have a connection to the server, the first command in the dumpfile should be the
USE db_name; */
 //String q = "";
        try {
            File f = new File(path); // source path is the absolute path of dumpfile.

            BufferedReader bf = new BufferedReader(new FileReader(f));
            String line = null,old="";
            line = bf.readLine();
            while (line != null) {
                //q = q + line + "\n";
                if(line.endsWith(";")){
                    stmt.executeUpdate(old+line);
                    old="";
                }
                else
                    old=old+"\n"+line;
                line = bf.readLine();
            }
    } catch (Exception ex) {
        ex.printStackTrace();
   }
closeConnection(con);

このコードは、mysqldump、または各ステートメントの終了後に行を改行するその他のプログラムを使用して sql ダンプが作成されることを前提としています。

于 2015-08-04T08:08:16.943 に答える
2

各ステートメントを個別に実行し、コメントを削除する必要があります

  • 空のコマンド文字列で開始
  • 各行を読む
  • トリムライン
  • --で始まるものを破棄します
  • コマンド文字列に行を追加します
  • 行が;で終わる場合 コマンドを実行し、ステップ1に繰り返します
于 2013-02-04T16:49:03.427 に答える
1

SQL統計のエラーにリストされているため、以下のクエリを実行しようとしています

source C:...\Desktop\dumpfile.sql

上記は有効なSQLステートメントではないため、1行目にエラーが発生します。SQLを含むファイルを開き、その本体を次のように使用する必要があります。

q
于 2013-02-04T16:47:22.737 に答える