Java - MS Access - ResultSet

Hi,

ich habe eine Frage. Ich bin dabei eine Java Applikation zu schreiben und verwende MS Access. Nur im Moment habe ich Probleme mit dem ResultSet und zwar mit dem automatischen updaten.
Jetzt wollte ich fragen, ob jemand vielleicht weis ob Access "updatable ResultSets" unterstützt, wenn ja, viell. auch wie?? Hab zwar ein wenig recherchiert, aber nix wirklich ordentliches herausgefunden..


//Edit:
Wenn auf die Frage oben niemand eine Antwort weis, viell. kann mir jemand helfen, warum ich beim Senden eines SQL-Befehls an diese Methode:
Code:
	public void SQLCommand(String sql) throws SQLException {
		connection = DriverManager.getConnection(database);
		Statement stmt = connection.createStatement();
		stmt.executeUpdate(sql);
		connection.close();
	}
Diese Fehlermeldung bekomme:
java.sql.SQLException: [Microsoft][ODBC Microsoft Access Driver] Too few parameters. Expected 1.
at sun.jdbc.odbc.JdbcOdbc.createSQLException(Unknown Source)
at sun.jdbc.odbc.JdbcOdbc.standardError(Unknown Source)
at sun.jdbc.odbc.JdbcOdbc.SQLExecDirect(Unknown Source)
at sun.jdbc.odbc.JdbcOdbcStatement.execute(Unknown Source)
at sun.jdbc.odbc.JdbcOdbcStatement.executeUpdate(Unknown Source)
at org.strumpflohner.CodeNotebook.Data.DBManager.SQLCommand(DBManager.java:45)
at org.strumpflohner.CodeNotebook.Data.TestClass.main(TestClass.java:15)

Connection-string usw. sind ok, da das auslesen funktioniert. Habe auch den Wert READONLY auf false gesetzt...
Danke
kito
 
Dein SQL Fehler tritt auf wenn du dich z.b. mit den Tabellennamen verschreibst.
Wir hatten in der Schule mal einen Test über JAVA & SQL. Dort gab es eine Tabelle die hieß "Telephon". Da gabs dann das Problem dass einige(so wie ich) "Telefon" geschrieben haben bei der folgenden select anweisung
Code:
 select * from telefon
und da gabs dann wie gesagt die selbe Fehlermeldung weil wir das nicht mit PH geschrieben haben.

Also schau dir am besten mal genau dein SQL statement an ob du dich da nicht vl verschrieben hast ;)
 
Danke für deinen Tipp, aber das mit der SQL abfrage habe ich 100 Mal kontrolliert, da ich dieses Problem auch schon öfters hatte :). Deshalb schreibe ich meistens die SQL abfrage immer zuerst in einem SQL Editor und kopiere sie dann in mein Java Prog...Also das ist sicher nicht das Problem, trotzdem danke!

Ich kann mir nur nicht erklären was es sonst sein könnte...
 
wenn du den ganze ncode reinstellst wäre es natürlich von vorteil.
nur so nebenbei wenn du die connection schließt, dann schließt du auch noch alle ResultSet's & Statements
 
nur so nebenbei wenn du die connection schließt, dann schließt du auch noch alle ResultSet's & Statements
Das mit dem
Code:
connection.close()
ist schon ok, da ich ja keinen Rückgabewert bei solchen Abfragen habe.

Trotzdem, hier der ganze Code:
Code:
import java.net.URL;
import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class DBManager {
	private Connection connection;
	private String database;
	private String filename;	
	
	/**
	 * This is the constructor for the DBManager class.
	 * Here the filename of the database is set.
	 *
	 */
	public DBManager() {
		URL fileURL = this.getClass().getResource("/DB/Database.mdb");
		String temp = fileURL.getPath().substring(1);
		filename = temp;
        database = "jdbc:odbc:Driver={Microsoft Access Driver (*.mdb)};DBQ=";
        database+= filename.trim() + ";DriverID=22;READONLY=false}";
		try {
			Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	/**
	 * This method executes SQL commands such as insert, delete,... 
	 * where you don't get a result
	 * @param sql
	 * @throws SQLException
	 */
	public void SQLCommand(String sql) throws SQLException {
		connection = DriverManager.getConnection(database);
		Statement stmt = connection.createStatement();
		stmt.executeUpdate(sql);
		connection.close();
	}
	
	/**
	 * This method executes SQL queries.
	 * The method returns a result set with the results of the query.
	 * @param sql
	 * @return
	 * @throws SQLException
	 * @throws ClassNotFoundException
	 */
	public ResultSet SQLQuery(String sql) throws SQLException, ClassNotFoundException {
		connection = DriverManager.getConnection( database ,"","");
		Statement stmt = connection.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE);
		ResultSet resultset = stmt.executeQuery(sql);
		try {
	        DatabaseMetaData dmd = connection.getMetaData();
	        if (dmd.supportsResultSetConcurrency(
	            ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_UPDATABLE)) {
	            // Updatable result sets are supported
	        	System.out.println("updatable supported");
	        } else {
	            // Updatable result sets are not supported
	        	System.out.println("updatable not supported");
	        }
	    } catch (SQLException e) {
	    }
		//connection.close();
		return resultset;
	}
}

Code:
import java.sql.SQLException;

public class TestClass {
	
	
	public static void main(String[] args){
		DBManager dbMan = new DBManager();
		try {
			dbMan.SQLCommand("insert into Labels(label_name) values (\"test\");");
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	}
	
}

Übrigens, das Auslesen aus der Datenbank funktioniert perfekt...Also der Zugang zur Datenbank und der Pfad sind ok!
 
lol,
du MS Access für ne JDBC Datenbank is scho bissel weit hergeholt meinst nich. Das Problem bei dem ODBC Treiber von MS Access ist, dass der nicht viele Funktionalitäten unterstützt, z.B. kennt er nicht die UpdateFunktionen. Ich würde dir raten auf eine adere DB Lösung umzusteigen. Ich arbeite mit HSQL. Klappt wirklich prima. Aber MySQL ist sicher besser, hab mich nur noch nicht damit befasst. Um MySQL zu connecten, brauchst du noch nen JDBC Treiber. HAb jedenfalls gehört von vielen schon, dass der prima funzt.

Aber wie gesagt, vergiss Access für jdbc.








PS: Ist nur meine Meinung, berichtigt mich, wenh ich Gülle laber ;D
 
ol,
du MS Access für ne JDBC Datenbank is scho bissel weit hergeholt meinst nich.

Wie verbinden sich dann die??
*Click*

Ich bin ja selbst kein Access Fan, nur wenn ich z.B. Postgresql odr SQL Server Express von MS nehme, dann sind große Software-Installationen nötig, was bei Access total entfällt. Einfach Datei mitliefern und das wars...

//Edit:
Jetzt bin ich schon mal weiter...Das hineinschreiben von Zahlen funktioniert perfekt, nur wenn ich einen String, also Text hineinschreiben will kommt dieser Fehler "Too few parameters. Expected 1".

Wenn man sich eine Datei "MyDatabase.mdb" erstellt und im gleichen Ordner eine Java-datei anlegt mit diesem Inhalt sollte es funktionieren:
Code:
import java.sql.Statement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;


public class Test {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		try {
			Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
			String filename = "MyDatabase.mdb";
			String database = "jdbc:odbc:Driver={Microsoft Access Driver (*.mdb)};DBQ=";
            database+= filename.trim() + ";DriverID=22;READONLY=true}";
            Connection con = DriverManager.getConnection(database, "", "");
            Statement s  = con.createStatement();
            s.execute("create table TEST12345(column_name integer)");
            s.execute("insert into TEST12345 values(12)");
            con.close();
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

}

Nur wenn man dann die Spalte "column_name" von Integer auf Text umändert und die "insert" query so modifiziert dass man einen String schickt, z. B. so:

Code:
s.execute("insert into TEST12345 values(\"hallo\")");

dann kommt der famose Fehler ?(

Fehler gefunden und gelöst!!!
:rolleyes: *unendlichschäm*
Der Fehler war der, dass Strings in SQL ja mit ' ' eingeklammert werden müssen und nicht mit " ".
Aus irgendeinem Grund hat mir der Access Editor das erlaubt und ich hab die dort geschriebene SQL Abfrage einfach übernommen!

Danke trotzdem für eure Hilfe
 
Original von kito
Ich bin ja selbst kein Access Fan, nur wenn ich z.B. Postgresql odr SQL Server Express von MS nehme, dann sind große Software-Installationen nötig, was bei Access total entfällt. Einfach Datei mitliefern und das wars...
aber Access (MS Office) muss doch auch installiert werden, oder nicht?
 
ivegotmail:
aber Access (MS Office) muss doch auch installiert werden, oder nicht?
Ich bin mir nicht ganz sicher, aber ich glaube wenn man es über den DNS namen macht ist auch das nicht mal notwendig...

Microsoft has provided a method to build a quick Jet-Engine database on your computer without the need for any specific database software (it comes standard with Windows). Using this method, we can even create a blank Microsoft Access database without having MS Access installed!
http://www.planet-source-code.com/vb/scripts/ShowCode.asp?txtCodeId=2691&lngWId=2#SECTION0

Ich versteh schon vorauf du hinauswillst ;)...Besser OpenSource Produkte verwenden. Bin ich ja auch dafür, nur, wenn ich das Prog jemand gebe und der Applikationen wie SQL Server oder PostgreSQL installieren muss...hmm und da bei fast über 95% aller PC's sowieso Win und Office draufsind..
Ich persönlich habe auch PostgreSQL installiert auf meinem Notebook, nur kommt mir da vor, dass dieses die Bootzeit deutlich erhöht, weis nicht ob es mich nur täuscht!
:)
 
Zurück
Oben