Autor Beitrag
Andreas#
Hält's aus hier
Beiträge: 6



BeitragVerfasst: Fr 13.08.10 12:29 
Hallo,
ich habe noch nicht groß mit Datenbanken gearbeitet, wollte mich aber jetzt einarbeiten. Zur Übung wollte ich eine Datenbank mit zwei Tabellen anlegen, wobei eine Bücher verwaltet und die andere Autoren. Die Bücher haben dann ein Feld, welches auf einen Autor in der anderen Tabelle verweist. Leider gibts gerade bei dieser Verknüpfung eine Exception (unbeteiligte Spalten wurden herausgenommen):

Zitat:

Unbehandelte Ausnahme: System.Runtime.InteropServices.COMException (0x800A0BB9):
Ausnahme von HRESULT: 0x800A0BB9
bei ADOX.Keys.Append(Object Item, KeyTypeEnum Type, Object Column, String Rel
atedTable, String RelatedColumn)
bei DatenbankTest_CS.Program.Tabellen_anlegen(String Name) in D:\Meine Visual
Projekte\DatenbankTest_CS\DatenbankTest_CS\Program.cs:Zeile 123.
bei DatenbankTest_CS.Program.Main(String[] args) in D:\Meine Visual Projekte\
DatenbankTest_CS\DatenbankTest_CS\Program.cs:Zeile 133.


Der Code sieht wie folgt aus:
ausblenden volle Höhe C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
           ADOX.Column column;

            
            ADOX.Catalog catalog = new ADOX.Catalog();
            catalog.Create("Provider=Microsoft.Jet.OLEDB.4.0;" +
                   "Data Source=E:\\NewMDB.mdb;");

//Spalte für ID
            ADOX.Table Buecher = new ADOX.Table();
            Buecher.Name = "Books";
            column = new ADOX.Column();
            column.ParentCatalog = catalog;
            column.Name = "ID";
            column.Type = ADOX.DataTypeEnum.adInteger;
            column.Properties["Nullable"].Value = false;
            column.Properties["AutoIncrement"].Value = true;
            Buecher.Columns.Append(column, ADOX.DataTypeEnum.adIUnknown, 0);

//Spalte für einen Verweis auf den Autor
            column = new ADOX.Column();
            column.ParentCatalog = catalog;
            column.Name = "AuthorID";
            column.Type = ADOX.DataTypeEnum.adInteger;
            column.Properties["Nullable"].Value = false;
            Buecher.Columns.Append(column, ADOX.DataTypeEnum.adIUnknown, 0);
            Buecher.ParentCatalog = catalog;

//Setzen des Primärindex auf ID
            ADOX.Index index = new ADOX.Index();
            index.Name = "PrimaryKey";
            index.PrimaryKey = true;
            index.Columns.Append("ID", Buecher.Columns["ID"].Type, Buecher.Columns["ID"].DefinedSize);
            Buecher.Indexes.Append(index, null);
            
//Tabelle für die Autoren
            ADOX.Table Autoren = new ADOX.Table();
            Autoren.Name = "Authors";
//ID für einen Autor
            column = new ADOX.Column();
            column.ParentCatalog = catalog;
            column.Name = "ID";
            column.Type = ADOX.DataTypeEnum.adInteger;
            column.Properties["Nullable"].Value = false;
            column.Properties["AutoIncrement"].Value = true;
            Autoren.Columns.Append(column, ADOX.DataTypeEnum.adIUnknown, 0);
            Autoren.ParentCatalog = catalog;
//Setzen des Primärindex auf ID
            index = new ADOX.Index();
            index.Name = "PrimaryKey";
            index.PrimaryKey = true;
            index.Columns.Append("ID", Buecher.Columns["ID"].Type, Buecher.Columns["ID"].DefinedSize);
            Autoren.Indexes.Append(index, null);
            
//Verknüpfen der Tabellen - AuthorID soll auf einen Autor in der anderen Tabelle zeigen           
            ADOX.Key key = new ADOX.Key();
            key.Name = "BuchAutor";
            key.Type = ADOX.KeyTypeEnum.adKeyForeign;
            key.RelatedTable = "Authors";
            key.Columns.Append("AuthorID", Buecher.Columns["AuthorID"].Type, Buecher.Columns["AuthorID"].DefinedSize);
            key.Columns["AuthorID"].RelatedColumn = "ID";
            key.DeleteRule = ADOX.RuleEnum.adRICascade;
            Buecher.Keys.Append(key, ADOX.KeyTypeEnum.adKeyForeign, null/*Type.Missing*/nullnull);

//Hinzufügen der beiden Tabellen zur Datenbank
            catalog.Tables.Append(Autoren);
            catalog.Tables.Append(Buecher);


Wobei beim Debuggen der Fehler bei Buecher.Keys.Append(key, ADOX.KeyTypeEnum.adKeyForeign, null/*Type.Missing*/, null, null); auftrat. Mir ist allerdings nicht klar wo bei ihm jetzt genau das Problem liegt, der Exceptiontext hilft mir auch nicht weiter.

Wisst ihr vielleicht wo der Fehler liegt - das wäre echt nett.

Vielen Dank schonmal im Vorraus,

viele Grüße

Andreas
Kha
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: Fr 13.08.10 18:20 
:welcome:

Ich frage lieber nach: Du bist wirklich an Access und ADOX gebunden? Es gäbe nämlich noch deutlich weniger steinige Wege zur Auswahl.

_________________
>λ=
Andreas# Threadstarter
Hält's aus hier
Beiträge: 6



BeitragVerfasst: Fr 13.08.10 18:49 
Hallo,
ich gebe zu das ich so langsam auch daran zweifle ob Access die richtige Wahl ist. Denke ich werde mich dann mal etwas in ADO.Net einarbeiten - hatte nur ursprünglich gedacht das ich einen typischen Anfängerfehler gemacht habe, den man schnell beheben kann.

Viele Grüße

Andreas