Avatar billede tigertool Nybegynder
28. maj 2004 - 20:48 Der er 17 kommentarer og
1 løsning

Indsætte data i MySQL database

Jeg indsætter en masse data i en MySQL database ved hjælp af dette script:
---------------------------------------------------------------------
import java.io.*;

public class FileScanner
{
  public static void visFiler(File mappe) throws Exception
  {
    File[] filer = mappe.listFiles();

    for (int i = 0; i < filer.length; i++)
    {
      File f = filer[i];

      System.out.println(f);
      Database.insertSQL("INSERT INTO files (fil) VALUES ('" + f + "');");

      if (f.isDirectory())
      {
        visFiler(f);
      }
    }

  }

  public static void main(String[] args) throws Exception
  {
    Database.makeConn("172.0.0.1", "test", "root", "");
    File t = new File("e:/");
    visFiler(t);
  }
}
---------------------------------------------------------------------
Database.java er bare en statisk klasse indeholdende en bunke metoder jeg bruger til bl.a. oprette forbindelse, indsætte data og hente data.

Her er et uddrag af Database-klassen:
---------------------------------------------------------------------
import java.sql.*;

public class Database
{
  private static Statement stmt;

  public static void makeConn(String ip, String db, String username, String password) throws Exception
  {
    Class.forName("com.mysql.jdbc.Driver");
    Connection conn = DriverManager.getConnection("jdbc:mysql://" + ip + "/" + db, username, password);
    stmt = conn.createStatement();
  }

  public static void insertSQL(String sql) throws Exception
  {
    stmt.executeUpdate(sql);
  }

  public static void close() throws SQLException
  {
    stmt.close();
  }
}

---------------------------------------------------------------------

Klasserne virker fint nok - der bliver indsat en masse data i databasen, men når der er indsat omkring 17300 rækker så får jeg en exception:

java.sql.SQLException: Syntax error or access violation,  message from server: "You have an error in your SQL syntax near 'F%20I%20COULD%20TURN%20BACK%20TIME[1].mid')' at line 1"
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:1876)
    at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1098)
    at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:1192)
    at com.mysql.jdbc.MysqlIO.sqlQuery(MysqlIO.java:1153)
    at com.mysql.jdbc.Connection.execSQL(Connection.java:2048)
    at com.mysql.jdbc.Connection.execSQL(Connection.java:2005)
    at com.mysql.jdbc.Statement.executeUpdate(Statement.java:1252)
    at com.mysql.jdbc.Statement.executeUpdate(Statement.java:1198)
    at test.Database.insertSQL(Database.java:31)
    at test.FileScanner.visFiler(FileScanner.java:16)
    at test.FileScanner.visFiler(FileScanner.java:20)
    at test.FileScanner.visFiler(FileScanner.java:20)
    at test.FileScanner.visFiler(FileScanner.java:20)
    at test.FileScanner.visFiler(FileScanner.java:20)
    at test.FileScanner.visFiler(FileScanner.java:20)
    at test.FileScanner.visFiler(FileScanner.java:20)
    at test.FileScanner.visFiler(FileScanner.java:20)
    at test.FileScanner.main(FileScanner.java:30)

Hvad kan problemet være?
Avatar billede tigertool Nybegynder
28. maj 2004 - 20:57 #1
Jeg får også fejlen når jeg kun bruger en System.out.println(f);

Det er på en skjult mappe fejlen ligger i..

Hvordan kan dette undgåes?
Avatar billede tigertool Nybegynder
28. maj 2004 - 20:59 #2
Mappen hedder: 'System Volume Information' - og jeg får en adgang nægtet når jeg forsøter at tilgå den.

Kan jeg i min java kode omgå dette sådan at mappen bare springes over?
Avatar billede arne_v Ekspert
28. maj 2004 - 21:01 #3
Det kan du da altid.

Jeg har bare svært ved at tro at den var skyld i en SQLException - der mistænker
jeg et filnavn med sngle quote i filnavnet !
Avatar billede jakoba Nybegynder
28. maj 2004 - 21:04 #4
det kunne ect være din tabel der bliver for stor: http://dev.mysql.com/doc/mysql/en/Table_size.html

men det er ikke hvad fejlmeldingen siger. den tyder snarere på at netop det filnavn indeholder et ulovligt tegn (fx et ')

Kan du finde det sted den exeption bliver kastet og bede den udskrive hele sql kommandoen også ?
Avatar billede arne_v Ekspert
28. maj 2004 - 21:07 #5
Jeg tror ikke på tabel størrelsen. Det bør ikke syntax error. Og 17000 filnavne
er jo ingenting.
Avatar billede tigertool Nybegynder
29. maj 2004 - 17:55 #6
hvis jeg laver en System.out.println(f); får jeg samme exception.
Jeg tror det måske er et ulovligt tegn - men kan jeg tage højde for dette? Hvordan går jeg dette?
Avatar billede arne_v Ekspert
29. maj 2004 - 18:17 #7
Du kan prøve:

Database.insertSQL("INSERT INTO files (fil) VALUES ('" + f.replace('\'',' ') + "');");

men den pæne løsning er en PreparedStatement.
Avatar billede tigertool Nybegynder
29. maj 2004 - 18:23 #8
Jeg kan ikke finde metoden replace :(
Avatar billede tigertool Nybegynder
29. maj 2004 - 18:27 #9
f.toString().replaceAll("\'", "") prøver jeg lige med
Avatar billede tigertool Nybegynder
29. maj 2004 - 18:29 #10
Men uden held.. Kan det ikke være rettighederne til mappen?
Avatar billede arne_v Ekspert
29. maj 2004 - 18:56 #11
Mystisk String har haft en replace(char,char) siden Java 1.0
Avatar billede arne_v Ekspert
29. maj 2004 - 18:57 #12
Og du er sikker på at fejlen er:
  "You have an error in your SQL syntax ...
?
Avatar billede arne_v Ekspert
29. maj 2004 - 18:58 #13
Prøv evt. at udskrive hele SQL sætningen for alle filer som Jakob forelog
Avatar billede arne_v Ekspert
29. maj 2004 - 18:59 #14
Iøvrgt f.replace('\'',' ') skulle naturligvis have været f.toString()replace('\'',' ')
Avatar billede arne_v Ekspert
16. juni 2004 - 22:51 #15
Kommet videre ?
Avatar billede tigertool Nybegynder
11. juli 2004 - 13:36 #16
Ja. (Gad vide hvorfor jeg ikke har modtaget mail om at du har skrevet)

Jeg fik det til at virke, med replaceAll, desværre har jeg ikke sourcen her, men jeg smider den lige når jeg kommer til den spand hvorpå det ligger.

Hvis du lige svarer arne_v, så kan du lige få lidt flere point fra mig :)
Avatar billede tigertool Nybegynder
17. august 2004 - 04:15 #17
arne_v <- hvis du smider et svar så får du lige nogle points :)
Avatar billede arne_v Ekspert
17. august 2004 - 08:05 #18
ok
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester