Entwickler-Ecke

Datenbanken (inkl. ADO.NET) - Problem bei Ausführung einer SQL-Anfrage auf Access-DB-Tabel


kecks - So 18.10.09 10:19
Titel: Problem bei Ausführung einer SQL-Anfrage auf Access-DB-Tabel
Hallo Leute,

ich habe im Moment ein ganz seltsames Problem. Ich bestelle gerade ein Frontend zum Zugriff auf eine Access-Datenbank. Das klappt soweit eigentlich ganz gut, allerdings habe ich beim Zugriff auf eine Tabelle das Problem, dass dort eine Fehlermeldung kommt.

Hier mal ein Auszug meiner DB:

Zitat:

iSP(iSPID, Name)

Module(ModulID, iSPID, Name)

Lehrveranstaltungen(VeranstaltungsID, Name, ...., ModulID, ...)

.
.
.


iSP - Module 1-n
Module - Lehrveranstaltungen 1-n


Und hier ein Auszug meines Programmcodes samt Fehlermeldung in der betreffenden Zeile:


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
.
.

String strSQL = "SELECT Name FROM Module";

OleDbConnection con = new OleDbConnection(
....);
con.Open();

OleDbCommand cmd = new OleDbCommand(strSQL, con);
OleDbDataReader dr = cmd.ExecuteReader(); // Fehler E_FAIL(0x80004005) in IErrorInfo.GetDescription

.
.
.

dr.Close();
con.Close();

.
.
.


Das Seltsame an der Geschichte, sobald ich in der SQL-Anweise in Zeile 4 auf eine andere Tabelle zugreife, sei es iSP oder Lehrveranstaltungen, läuft alles problemlos. Nur beim Zugriff auf die Tabelle Module kommt in Zeile 11 die Fehlermeldung, obwohl sich die Tabellen im Grunde kaum unterscheiden. Die Ausführung der SQL-Anweisung im Access funktioniert übrigens bei allen Tabellen problemlos.

Kann mir jemand erklären, wo der Fehler liegt? Was beim Zugriff auf die Tabelle Module so anders ist, als bei allen anderen Tabellen, dass nur hier eine Fehlermeldung kommt?


JüTho - So 18.10.09 10:32

Hallo und :welcome:

Module gehört zu den reservierten Wörtern von Access, siehe MSDN [http://support.microsoft.com/kb/209187/de]. Diese müssen in SQL-Befehlen in [] gesetzt werden:

SQL-Anweisung
1:
String strSQL = "SELECT Name FROM [Module]";                    

Übrigens solltest du eine Connection vorzugsweise in einen using-Block kapseln, das macht die Arbeit damit sicherer (und Close/Dispose können entfallen):

C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
using (OleDbConnection con = new OleDbConnection(....) {
   con.Open();

   OleDbCommand cmd = new OleDbCommand(strSQL, con);
   OleDbDataReader dr = cmd.ExecuteReader(); 
   while(dr.Read()) {  ...
   }
}

Und Einrückungen machen Quelltexte besser lesbar.

Gruß Jürgen


kecks - So 18.10.09 10:49

Vielen Dank erstmal. Auf diese Idee wäre ich gar nicht gekommen. Werde schauen, ob das mein Problem löst.

Wegen den Einrückungen und using etc. Die war nur ein Auszug. Wollte nicht die kompletten 1000 Zeilen Code, die es momentan sind, posten. Aber du hast recht.


kecks - So 18.10.09 12:25

Ja, genau das war das Problem. Jetzt läuft alles. Danke nochmal.