# Problem mit Update



## Lu (10. Sep 2004)

Hallo, ich habe ein mir unerklärliches Problem mit meiner Datenbankanwendung.
Wenn ich den Code ausführe, funktioniert alles, sobald ich aber in der Methode 'test' die Kommentare entferne, wird der Code zwar auch ausgeführt, jedoch stürzt das Programm dann mit der unten angegebenen Fehlermeldung ab.
Vielleicht weißt jemand was dazu zu sagen. Ich kann mir das nicht erklären.


```
public class Auftragsverwaltung
{
    public static void main(String[] args)
    {
        // Datenbank anbinden
        try
        {
            Datenbank.dbConnect();
        }
        catch(Exception e)
        {
            System.out.println("Die Datenbank konnte nicht geöffnet werden " + e);
        }    
          test();
        //Desktop erzeugen
        DesktopFrame desktop = new DesktopFrame();
        desktop.setLocation(10, 10);
        desktop.setSize(900, 720);
        desktop.setVisible(true);       
    }
    
    public static void test()
    {
        String qt = "UPDATE Aufträge SET Firma='1', Strasse = '1' WHERE (ID = 6332);";
        Datenbank.dbSetGeraete(qt);
        qt = "UPDATE Aufträge SET Firma='2', Strasse = '2' WHERE (ID = 6332);";
        Datenbank.dbSetGeraete(qt);
   //     qt = "UPDATE Aufträge SET Firma='3', Strasse = '3' WHERE (ID = 6332);";
   //     Datenbank.dbSetGeraete(qt);
    }
}
```


An unexpected exception has been detected in native code outside the VM.
Unexpected Signal : EXCEPTION_ACCESS_VIOLATION (0xc0000005) occurred at PC=0x77F4B2AB
Function=RtlEnterCriticalSection+0xB
Library=C:\WINDOWS\System32\ntdll.dll

Current Java thread:
	at sun.jdbc.odbc.JdbcOdbc.execDirect(Native Method)
	at sun.jdbc.odbc.JdbcOdbc.SQLExecDirect(JdbcOdbc.java:3105)
	at sun.jdbc.odbc.JdbcOdbcStatement.execute(JdbcOdbcStatement.java:338)
	- locked <0x1004cd40> (a sun.jdbc.odbc.JdbcOdbcStatement)
	at sun.jdbc.odbc.JdbcOdbcStatement.executeUpdate(JdbcOdbcStatement.java:288)
	at Datenbank.dbSetGeraete(Datenbank.java:254)
	at Auftragsverwaltung.test(Auftragsverwaltung.java:42)
	at Auftragsverwaltung.main(Auftragsverwaltung.java:27)

Dynamic libraries:
0x00400000 - 0x00406000 	C:\j2sdk1.4.2_04\jre\bin\java.exe
0x77F40000 - 0x77FEE000 	C:\WINDOWS\System32\ntdll.dll
0x77E40000 - 0x77F38000 	C:\WINDOWS\system32\kernel32.dll
0x77DA0000 - 0x77E3C000 	C:\WINDOWS\system32\ADVAPI32.dll
0x78000000 - 0x78087000 	C:\WINDOWS\system32\RPCRT4.dll
0x77BE0000 - 0x77C33000 	C:\WINDOWS\system32\MSVCRT.dll
0x08000000 - 0x08138000 	C:\j2sdk1.4.2_04\jre\bin\client\jvm.dll
0x77D10000 - 0x77D9C000 	C:\WINDOWS\system32\USER32.dll
0x7E180000 - 0x7E1C1000 	C:\WINDOWS\system32\GDI32.dll
0x76AF0000 - 0x76B1D000 	C:\WINDOWS\System32\WINMM.dll
0x10000000 - 0x10007000 	C:\j2sdk1.4.2_04\jre\bin\hpi.dll
0x00390000 - 0x0039E000 	C:\j2sdk1.4.2_04\jre\bin\verify.dll
0x003A0000 - 0x003B9000 	C:\j2sdk1.4.2_04\jre\bin\java.dll
0x003C0000 - 0x003CD000 	C:\j2sdk1.4.2_04\jre\bin\zip.dll
0x003F0000 - 0x003FC000 	C:\j2sdk1.4.2_04\jre\bin\JdbcOdbc.dll
0x02C60000 - 0x02C92000 	C:\WINDOWS\System32\ODBC32.dll
0x77310000 - 0x7739B000 	C:\WINDOWS\system32\COMCTL32.dll
0x773A0000 - 0x77BA4000 	C:\WINDOWS\system32\SHELL32.dll
0x70A70000 - 0x70AD4000 	C:\WINDOWS\system32\SHLWAPI.dll
0x76350000 - 0x76396000 	C:\WINDOWS\system32\comdlg32.dll
0x71950000 - 0x71A34000 	C:\WINDOWS\WinSxS\x86_Microsoft.Windows.Common-Controls_6595b64144ccf1df_6.0.2600.1515_x-ww_7bb98b8a\comctl32.dll
0x1F850000 - 0x1F868000 	C:\WINDOWS\System32\odbcint.dll
0x1F8F0000 - 0x1F932000 	C:\WINDOWS\System32\odbcjt32.dll
0x1B000000 - 0x1B170000 	C:\WINDOWS\System32\msjet40.dll
0x1B5D0000 - 0x1B665000 	C:\WINDOWS\System32\mswstr10.dll
0x7CCC0000 - 0x7CDE4000 	C:\WINDOWS\system32\ole32.dll
0x770F0000 - 0x7717B000 	C:\WINDOWS\system32\OLEAUT32.dll
0x1F8E0000 - 0x1F8EF000 	C:\WINDOWS\System32\odbcji32.dll
0x1B2C0000 - 0x1B2CD000 	C:\WINDOWS\System32\msjter40.dll
0x1B2D0000 - 0x1B2FD000 	C:\WINDOWS\System32\MSJINT40.DLL
0x76F50000 - 0x76F60000 	C:\WINDOWS\System32\Secur32.dll
0x7A170000 - 0x7A1F1000 	C:\WINDOWS\System32\CLBCATQ.DLL
0x77010000 - 0x770E3000 	C:\WINDOWS\System32\COMRes.dll
0x77BD0000 - 0x77BD7000 	C:\WINDOWS\system32\VERSION.dll
0x1B810000 - 0x1B84A000 	C:\WINDOWS\System32\msjtes40.dll
0x0F9A0000 - 0x0F9AB000 	C:\WINDOWS\System32\VBAJET32.DLL
0x0F9C0000 - 0x0FA22000 	C:\WINDOWS\System32\expsrv.dll
0x03450000 - 0x034AE000 	C:\WINDOWS\System32\SQLSRV32.dll
0x41090000 - 0x410BD000 	C:\WINDOWS\System32\SQLUNIRL.dll
0x72F70000 - 0x72F93000 	C:\WINDOWS\System32\WINSPOOL.DRV
0x71BA0000 - 0x71BEE000 	C:\WINDOWS\System32\NETAPI32.dll
0x758E0000 - 0x758E7000 	C:\WINDOWS\System32\NDDEAPI.DLL
0x1FA20000 - 0x1FA38000 	C:\WINDOWS\System32\sqlsrv32.rll
0x07EE0000 - 0x07EF9000 	C:\WINDOWS\System32\odbccp32.dll
0x74CB0000 - 0x74CBF000 	C:\WINDOWS\System32\DBNETLIB.DLL
0x07F00000 - 0x07F09000 	C:\WINDOWS\System32\WSOCK32.dll
0x07F10000 - 0x07F24000 	C:\WINDOWS\System32\WS2_32.dll
0x07F30000 - 0x07F38000 	C:\WINDOWS\System32\WS2HELP.dll
0x71F10000 - 0x71F14000 	C:\WINDOWS\System32\security.dll
0x76260000 - 0x762E9000 	C:\WINDOWS\system32\crypt32.dll
0x76240000 - 0x76250000 	C:\WINDOWS\system32\MSASN1.dll
0x76CD0000 - 0x76CED000 	C:\WINDOWS\system32\msv1_0.dll
0x76750000 - 0x76763000 	C:\WINDOWS\System32\ntdsapi.dll
0x76EE0000 - 0x76F05000 	C:\WINDOWS\System32\DNSAPI.dll
0x76F20000 - 0x76F4D000 	C:\WINDOWS\system32\WLDAP32.dll
0x07F40000 - 0x07F7C000 	C:\WINDOWS\system32\mswsock.dll
0x07F80000 - 0x07F88000 	C:\WINDOWS\System32\wshtcpip.dll
0x76F70000 - 0x76F77000 	C:\WINDOWS\System32\winrnr.dll
0x76F80000 - 0x76F85000 	C:\WINDOWS\System32\rasadhlp.dll
0x76C50000 - 0x76C72000 	C:\WINDOWS\system32\imagehlp.dll
0x6DA00000 - 0x6DA7D000 	C:\WINDOWS\system32\DBGHELP.dll
0x76BB0000 - 0x76BBB000 	C:\WINDOWS\System32\PSAPI.DLL

Heap at VM Abort:
Heap
 def new generation   total 576K, used 251K [0x10010000, 0x100b0000, 0x104f0000)
  eden space 512K,  49% used [0x10010000, 0x1004ec20, 0x10090000)
  from space 64K,   0% used [0x10090000, 0x10090000, 0x100a0000)
  to   space 64K,   0% used [0x100a0000, 0x100a0000, 0x100b0000)
 tenured generation   total 1408K, used 0K [0x104f0000, 0x10650000, 0x14010000)
   the space 1408K,   0% used [0x104f0000, 0x104f0000, 0x104f0200, 0x10650000)
 compacting perm gen  total 4096K, used 1514K [0x14010000, 0x14410000, 0x18010000)
   the space 4096K,  36% used [0x14010000, 0x1418abc8, 0x1418ac00, 0x14410000)

Local Time = Fri Sep 10 15:48:04 2004
Elapsed Time = 0
#
# The exception above was detected in native code outside the VM
#
# Java VM: Java HotSpot(TM) Client VM (1.4.2_04-b05 mixed mode)
#


----------



## foobar (10. Sep 2004)

Ein paar Tips:

```
String qt = "UPDATE Aufträge SET Firma='1', Strasse = '1' WHERE (ID = 6332);";
```
- Umlaute haben in Programmen nichts verloren, daß führt nur zu Problemen und sieht nicht schön aus. 
- Zahlenwerte müssen in SQL nicht gequotet werden.


----------



## akira (10. Sep 2004)

Ansonsten poste mal noch den Code der Methode Datenbank.dbSetGeraete. 

Der Fehler wird wahrscheinlich eher dort zu finden sein, obwohl der Fehler eher auf einen falschen Treiber hinweist. 

Bist Du dir sicher, den richtigen genommen zu haben?


----------



## Guest (11. Sep 2004)

den treiber hab ich folgendermaßen angebunden, andere abfragen funktionieren ohne probleme.

protected static void dbConnect()
    throws Exception
    {   
        Class.forName( "sun.jdbc.odbc.JdbcOdbcDriver" );
        con = DriverManager.getConnection( "jdbcdbc:Xerox_v1.11");
        stmt = con.createStatement();
    }

der code für setGeräte:


```
public static void dbSetGeraete(String query)
    {
        try
        {
          //  stmt.execute(query);
            stmt.executeUpdate(query);
        } 
        catch (SQLException e)
        {
            System.out.println("Fehler2 " + e);
        }
    }
```


-> foobar:
   "- Umlaute haben in Programmen nichts verloren, daß führt nur zu Problemen und sieht nicht schön aus."

             die umlaute kann ich nicht ändern, da ich die datenbank nicht erstellt habe.


----------



## apfelsine (11. Sep 2004)

> die umlaute kann ich nicht ändern, da ich die datenbank nicht erstellt habe.



das ist schlecht... 

das kann zu Problemen führen, wenn der Treiber nicht "deutsch kann"
sprich , wenn es ein englischer Treiber ist, hast du dein Problem wahrscheinlich schon gefunden.
dh. nicht das es mit einem deutschen funktioniert.
ich glaub man kann die umlaute irgendwie maskieren... muss ma nachschauen

Ansonsten... welcher DB-Hersteller isses denn?
MS SQL Server
Oracle oder was?


----------



## Lu (11. Sep 2004)

Die Datenbank wurde mit access erstellt und läuft auf nem MS SQL Server.
Wenn das an den Umlauten liegen sollte, würde es dann nicht beim ersten mal nicht schon nen Problem geben?


----------



## apfelsine (12. Sep 2004)

Versuchs mal mit dem Treiber:


Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");					
			Connection con = DriverManager.getConnection("jdbc:microsoft:sqlserver://"+sServerName+":"+sPort+";databaseName="+sDatabase,sUser,sPassword);

den kann man bei microsoft runterladen

http://www.microsoft.com/downloads/...11-0502-461a-b138-2aa54bfdc03a&DisplayLang=en


----------



## Bleiglanz (13. Sep 2004)

probiers mal mit

```
qt = "UPDATE \"Aufträge\" SET Firma='3', Strasse = '3' WHERE (ID = 6332);";
Datenbank.dbSetGeraete(qt);
```
Also den Tabellennamen mit Umlauten in normale doppelte Hochkommas einschliessen (das hilft bei M$ manchmal)


----------



## apfelsine (13. Sep 2004)

prima, genau das hab ich mit maskieren gemeint


----------



## Lu (14. Sep 2004)

Hallo,
also mit dem Maskieren, daß funktioniert nicht.
Mit dem neuen Treiber muß ich nochmal ein wenig rumprobieren


----------



## Lu (15. Sep 2004)

Hallo,

ich habe die Anbindung an die Datenbank mal mit dem neuen Treiber versucht.


```
protected static void dbConnect()
    throws Exception
    {   
        String com = "cmd set CLASSPATH=.;c:\\Programme\\Microsoft SQL Server 2000 Driver for 
                         + "JDBC\\lib\\msbase.jar;"
                        + "c:\\Programme\\Microsoft SQL Server 2000 Driver for JDBC\\lib\\msutil.jar;"
                        + "c:\\Programme\\Microsoft SQL Server 2000 Driver for JDBC\\lib\\mssqlserver.jar";
        Process child = Runtime.getRuntime().exec(com);
            
        Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver"); 
        con = DriverManager.getConnection("jdbc:microsoft:sqlserver://it:1433"
                                                          + ";databaseName=Xerox_v1.11"); 


        stmt = con.createStatement();
    }
```

Hier bekomme ich dann die Fehlermeldung:

java.lang.ClassNotFoundException: com.jdbc.sqlserver.SQLServerDriver

Habe ich da was vergessen oder falsch gemacht?


----------



## apfelsine (15. Sep 2004)

sieht so aus, als würde das so nicht funktionieren. der findet den treiber so nicht

```
To Set the CLASSPATH Variable
The Microsoft SQL Server 2000 driver for JDBC .jar files must be listed in your CLASSPATH variable. The CLASSPATH 
variable is the search string that Java Virtual Machine (JVM) uses to locate the JDBC drivers on your computer. If the 
drivers are not listed in your CLASSPATH variable, you receive the following error message when you try to load the 
driver:
java.lang.ClassNotFoundException: com/microsoft/jdbc/sqlserver/SQLServerDriver
Set your system CLASSPATH variable to include the following entries:

    * \Your installation path\Lib\Msbase.jar
    * \Your installation path\Lib\Msutil.jar
* \Your installation path\Lib\Mssqlserver.jar
```
mach das mal. dann müsste es gehen



geht das nicht anders also so???

```
String com = "cmd set CLASSPATH=.;c:\\Programme\\Microsoft SQL Server 2000 Driver for
                         + "JDBC\\lib\\msbase.jar;"
                        + "c:\\Programme\\Microsoft SQL Server 2000 Driver for JDBC\\lib\\msutil.jar;"
                        + "c:\\Programme\\Microsoft SQL Server 2000 Driver for JDBC\\lib\\mssqlserver.jar";
        Process child = Runtime.getRuntime().exec(com);
```
Ich hab das in Eclipse direkt in meine Compilerconfig "Java Build Path"-"Libraries" eingegeben...
ich weiß nicht wie das anders geht. Aber so wohl nicht


----------



## Lu (15. Sep 2004)

also wenn ich im dos-fenster die classpath-variable setze, gilt diese ja nur für das aktuelle dos-fenster.
wo kann ich denn die system classpath variable setzen?
kann ich das in netbeans machen?


----------



## apfelsine (15. Sep 2004)

hier is ne anleitung
http://java.sun.com/developer/technicalArticles/JavaLP/NetBeans36/


----------



## Lu (15. Sep 2004)

ok, das sieht vielversprechend aus. muß nochmal ein wenig rumprobieren.
Vielen Dank schon mal


----------

