Hallo liebes Forum!
Bin kein C# Experte und deshalb mag meine Frage vielleicht blöd sein aber ich komme einfach nicht drauf. Folgendes Problem:
Ich soll ein Tool erstellen, dass in der Lage ist von einer bestehenden Tabelle in einer Oracle-Datenbank, die Attribute auszulesen (also Spaltenname, Datentyp usw.) und diese Informationen sollen dann in eine XML-Datei geschrieben werden.
Mit XML komme ich mittlerweile klar nur wie kann ich an "Metadaten" zu einer Tabelle kommen? Gibt es dafür ein bestimmtes SQL-Statement das mir als Ergebnis schon alle benötigten Informationen liefert?
Würde mich über Hilfe sehr freuen!
Danke schon einmal im voraus!
lieschen
Entspricht aber nicht der ANSI-SQL-92-Spezifikation.
In der Tat, allerdings haben in den seltensten Fällen normale User direkten Zugriff auf Systemtabellen....
Wenn uns lieschen den eingesetzten DB-Provider mitteilt gibt es auch noch andere Möglichkeiten.
Original von ikaros
In der Tat, allerdings haben in den seltensten Fällen normale User direkten Zugriff auf Systemtabellen....
Ich benutze ja auch keine Systemtabelle, sondern eine View.
Stimmt, ich Idiot(is ja auch schon spät). Hab trotzdem ein "Gegenargument", SQL 92 hin oder her, diese View ist eh Oracle-spezifisch 😉
Original von ikaros
Hab trotzdem ein "Gegenargument", SQL 92 hin oder her, diese View ist eh Oracle-spezifisch 😉
Welche View, die ich gepostet hab?
Die hab ich im MS SQL Sever am laufen, deswegen ANSI-Standard..
a: ) SQL 92
b: ) SQL Server, Oracle, haste nich jesehn(Access, Paradox, Interbase/Firebird, PostgreSQL...)
vielleicht ist es Standard(und hilft nicht viel) oder nicht (ich bin kein DBA) SQL 92 war auch nicht der letzte Standard.
Ich würde vorschlagen für Grundsatzfragen einen anderen Thread zu eröffnen. Der ursprünglichen Fragestellung wird damit jedenfalls nicht geholfen. Wenn Du einen solchen Thread aufmachst schick mir bitte den Link, dann kanns gern weiter gehen(Gefachsimpel macht immer wieder Spass und hilft einem über den Tag, um so besser je fundierter die Argumente) Heute aber nicht mehr(bin müde)(und morgen hab ich Unterstützung durch meinen DBA 😉 )
Hi!
Vielen Dank für die rege Beteiligung aber irgendwie funktioniert das noch nicht so richtig. Also ich habe eine Datenbank namens AEM mit 5 Tabellen bearbeitung, user, artikel, auftraege und Kunden.
Aber prinzipiell soll mein Tool auch Informationen über Tabellen auslesen aus Datenbanken, mit einer unbekannten Anzahl von Tabellen.
Wie benutze ich ich denn diese eine SELECT-Anweisung, die als Tipp kam?
SELECT * FROM bearbeitung.Columns ??? oder wie?
und die Andere Anweisung dann: DESC bearbeitung; ???
Funktioniert so aber beides nicht.
danke!
lieschen
Die Select Anweisung von mir, kannst Du 1:1 kopieren.
Hi Noodles!
Deine SELECT-Anweisung funktioniert bei mir nicht. Wenn ich
SELECT * FROM INFORMATION_SCHEMA.COLUMNS
eingebe dann bekomme ich die Fehlermeldung:
SELECT * FROM INFORMATION_SCHEMA.COLUMNS
*
FEHLER in Zeile 1:
ORA-00942: Tabelle oder View nicht vorhanden
gruß
lieschen
Wenn du den Provider von Oracle(ODP) verwendest, kannst die Methode GetSchemaTable des DataReaders benutzen.
Danke ikaros!
Vielen Dank schon einmal! Dein Tipp hat mich schon bis hierher einiges weitergebracht
Habe mir mal ein paar Quellen zu GetSchemaTable durchgelesen. Schaut sehr gut aus. So wie ich diese Methode verstanden habe bekomme ich dadurch informationen über eine Tabelle so wie ich sie brauche.
Jetzt habe ich noch das Problem das ich einen TreeView erstellen will, in dem alle Tabellen angezeigt werden die in einer Datenbank enthalten sind. Aber dazu suche ich eine Möglichkeit wie ich Informationen über die Datenbank bekomme. Also wieviele Tabellen sie enthält und wie deren Namen sind.
Danach soll dann eben im TreeView ausgewählt werden über welche Tabelle man mehr erfahren möchte. Erst an der stelle würde ich mich der GetSchemaTable Methode bedienen.
Also bleibt mir also noch das Problem mit den Infos über die DB.
wie wärs mit: "select table_name from all_tables where tablespace_name ='USERS'"?
Sieht schon nicht schlecht aus. Nochmal des Verstehens wegen. Sehe ich das richtig das
table_name, all_tables und tablespace_name als sowas wie von Oracle vorgegebene Konstanten ansehen kann?
Also wenn ich 1 zu 1 deine Anweisung benutze bekomme ich kein Ergebnis. Wenn ich die WHERE-Bedingung wegnehme bekomme ich eine große anzahl von vermeindlichen Tabellennamen. Darunter stehen dann aber auch einige sehr seltsame Name, die gar keine Tabellen sein können wie z.B. WK$MIMETYPES, WK$LANG, OLAPTABLEVELS usw.
Also kann ich von mir aus schon einmal sagen das es bisher noch an der WHERE Bedingung scheitert. Was bedeutet denn dieses tablespace_name und dann die Angabe von 'USER' ???
mit "select * from all_tables"
bekommst die Informationen über alle Oracletabellen inkl. der Systemtabellen zur Verwaltung der DB durch Oracle. all_tables ist eine view(es gibt noch all_all_tables, all_views, all_constraints, all_types usw.) auf DBobjekte)
table_name + table_spacename sind einfach nur Felder aus dem Resultset.
Der Tablespace USERS (mit S)wird bei Standardinstallationen angelegt und enthält die Tabellen der Benutzer. Die DB kann jedoch auch anders konfiguriert sein, dh. es wurden andere Tablespaces für Benutzertabellen angelegt.
Die für dich wichtigen Filterkriterien für die Abfrage musst du schon selbst festlegen.
mfg ikaros
OK vielen dank!
Hab das jetzt verstanden und kann mir das so zusammenstellen wie ich es benötige.
Nochmal vielen Dank für deine Hilfe!
Hallo!
Ich hoffe diese weitere Frage von mir liest auch jemand. Dachte das ich diesen Artikel besser weiterschreibe als einen neuen zu eröffnen, denn immerhin habe ich noch das gleiche Problem.
Also ich habe mittlerweile keine Probleme meinen TreeView aus den bestehenden Tabellen einer Datenbank aufzubauen. Das Auslesen der ganzen Datensätze einer Tabelle ist auch kein Probleme und das anzeigen.
Jetzt habe ich aber immer noch das Problem an die Datentypen der einzelnen Spalten einer Tabelle zu kommen. Für Testzwecke habe ich mir erstmal meine Daten wie folgt in einer MessageBox umgeleitet.
private void getDatabaseStructure(string selectedTabelle)
{
OracleDataReader myReader;
string sql_query = "SELECT * FROM ";
sql_query += selectedTabelle;
OracleCommand myCommand = new
OracleCommand(sql_query,singleton.Conn);
myReader = myCommand.ExecuteReader();
// erstelle Tabellenstruktur aus DB Schema
DataTable dt = myReader.GetSchemaTable();
//Generieren der Spaltennamen und der Datentypen
FlG_DBStructure.Cols.Count = 1;
string test = "";
foreach (DataRow dr in dt.Rows)
{
test += dr["ColumnOrdinal"] + " " +dr["IsKey"] + " " + dr["ColumnName"]
+ " " + dr["DataType"]+" "+dr["AllowDBNull"]+" "+"\n";
}
MessageBox.Show(test);
}
Das Problem hierbei ist aber das ich den Datentyp im Format von C# geliefert bekomme und nicht so wie es wirklich in der Oracle-Datenbank steht. Also zum Beispiel SYSTEM.STRING anstatt VARCHAR(50).
Kann mir bitte noch jemand helfen und verraten wie ich den Datentyp und vielleicht noch den Primaryschlüssel bekomme?
Vielen Dank
lieschen
Hi!
Ich hab noch ein wenig im Internet recherchiert und habe ein Beispiel gefunden, dass ich gleich eingebaut habe bei mir. Mein Code zum auslesen der von mir gewünschten Daten sieht jetzt so aus:
private void getDatabaseStructure(string selectedTabelle)
{
OracleDataReader myReader;
string sql_query = "SELECT * FROM ";
sql_query += selectedTabelle;
OracleCommand myCommand = new
OracleCommand(sql_query,singleton.Conn);
myReader = myCommand.ExecuteReader(CommandBehavior.SchemaOnly);
dg_structure.DataSource=(myReader.GetSchemaTable());
myReader.Close();
}
Das gefällt mir zwar schon ein wenig besser aber ich habe eben immer noch das Problem, dass mir die an das System angepassten Datentypen geliefert werden und nicht so wie sie in Oracle stehen.
Hat jemand eine Idee?
Vielen Dank mal wieder im voraus!
lieschen