| 

.NET C# Java Javascript Exception

2
Hallo zusammen,
ich habe eine Access-DB und darin eine Tabellenspalte, die eine Relation zu einer Spalte in einer anderen Tabelle hat. Diese Relation will ich programmatisch löschen, weil ich sonst diese Spalte nicht löschen kann. In Google habe ich dazu das statement
ALTER TABLE Orders DROP CONSTRAINT fk_PerOrders
gefunden. Leider kenne ich den Namen des Constraints aber nicht, und ich habe ihn auch nicht in der DB gefunden.
Hat jemand eine Idee?
News:
12.10.2012
KN 1,7k 1 8
KN 1,7k 1 8
3 Antworten
2
Führe mal die folgende Sub in Deiner Datenbank aus:
Sub ListRelations()
Dim rel As DAO.Relation
For Each rel In CurrentDb.Relations
Debug.Print "RelationName: " & rel.Name & " ForeignTable: " & rel.ForeignTable & " Table " & rel.Table
Debug.Print "Relation Fields:"
For Each fld In rel.Fields
Debug.Print fld.Name
Next
Next
End Sub


Du erhälst alle Relationen, unter anderem wird Dir eine Guid angezeigt, pro Relation. Mit dieser kannst Du dann arbeiten:
ALTER TABLE TableName  DROP CONSTRAINT [{0992AADA-3921-4AC0-8E95-745A87709D91}]
12.10.2012
JEwen 2,7k 5
Danke, das bringt mich schon weiter. Ich bekomme aber den DAO-Workspace nicht hin, und den brauche ich, um das DB-Objekt zu erzeugen. Wir mache ich das? Ich arbeite in C#.
KN 12.10.2012
HI JEwen, danke nochmal, jetzt bin ich weiter. Ich habe dein Sub ausgeführt, und ich habe u.a. dieses Ergebnis:

RelationName: TabSensorTabKalibriervorgang ForeignTable: TabKalibriervorgang Table TabSensor
Relation Fields:
nSensorID
RelationName: TabSensorTabKalibriervorgang1 ForeignTable: TabKalibriervorgang Table TabSensor
Relation Fields:
nSensorID

Eine GUID bekomme ich mit dem Sub nicht. Und wenn ich versuche, dieses Statement auszuführen

ALTER TABLE TabSensor DROP CONSTRAINT TabSensorTabKalibriervorgang1

dann wird keine Relation gelöscht. Hast du vielleicht noch eine Idee?
KN 12.10.2012
Versuchs mal andersrum:
ALTER TABLE TabKalibriervorgang ...
erh 12.10.2012
Danke, hatte es schon andersrum versucht, klappt auch nicht.
KN 12.10.2012
Oh Mann, wie doof kann man denns ein! Ich hatte das Statement zwar hingeschrieben, aber nicht ausgeführt. Klar wird dann die Relation nicht gelöscht. Also: kaum macht man es richtig, schon geht's! das ist doch ein guter Start ins Wochenende. Danke nochmal!
KN 12.10.2012
1
Mit GetOleDbSchema sollte es eigentlich gehen:

private void button1_Click(object sender, EventArgs e)
{
OleDbConnectionStringBuilder csb = new OleDbConnectionStringBuilder();
csb.Provider = "Microsoft.Jet.OLEDB.4.0";
csb.DataSource = @"D:\Test.mdb";

OleDbConnection conn = new OleDbConnection(csb.ConnectionString);
conn.Open();

dataGridView1.DataSource = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Foreign_Keys, null);
}


Falls in der Datatable ein Eintrag vorhanden ist, bei dem PK_COLUMN_NAME+PK_TABLE_NAME oder FK_COLUMN_NAME+FK_TABLE_NAME deiner gesuchten Spalte+Tabelle entspricht, steht in FK_NAME der Name des ForeignKey. Du musst das ALTER TABLE dann entweder auf PK_TABLE_NAME oder FK_TABLE_NAME machen, je nachdem wo du deine Spalte gefunden hast.

Du kannst auch 2 Abfragen zu GetOleDbSchemaTable machen:
dataGridView1.DataSource = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Foreign_Keys, new object[] { null, null, "TabellenName", null, null, null});

dataGridView1.DataSource = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Foreign_Keys, new object[] { null, null, null, null, null, "TabellenName"});

dann bekommst Du jeweils nur die Einträge zu deiner gesuchten Tabelle.
12.10.2012
erh 86 1 3
Danke erh. Damit bekomme ich die gleichen Ergebnisse wie mit dem Script von JEwen. Leider kann ich aber mit dem, was ich als Relationsname interpretiere, die Relation auch nicht löschen (s. mein Kommentar zum Post von JEwen).
KN 12.10.2012
Jetzt klappt es, siehe mein letzter Kommentar zu JEwen. Danke nochmal!
KN 12.10.2012
0
Ich nehme an, du brauchst VBA oder Interop. Du holst dir ein Datenbankobjekt, und hast Zugriff auf die Relations-Collection. Details in der Access-VBA-Referenz.
12.10.2012
mupan 575 1 8
1
Falls Du .NET verwendest kannst Du es mal mit GetOleDbSchema(OleDbSchemaGuid.Foreign_Keys) versuchen.
http://support.microsoft.com/kb/309681
erh 12.10.2012
Danke für die Tipps. Genau dort hatte ich auch schon gesucht, bin aber leider nicht fündig geworden. Hättet ihr vielleicht einen konkretern Tipp?
KN 12.10.2012

Stelle deine Sql-Frage jetzt!