Laden...

Auslesen von Tabellen- und Datenbankinformationen

Erstellt von lieschen vor 18 Jahren Letzter Beitrag vor 18 Jahren 15.492 Views
L
lieschen Themenstarter:in
25 Beiträge seit 2005
vor 18 Jahren
Auslesen von Tabellen- und Datenbankinformationen

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

N
4.644 Beiträge seit 2004
vor 18 Jahren
SELECT * FROM INFORMATION_SCHEMA.COLUMNS
I
1.739 Beiträge seit 2005
vor 18 Jahren

DESC [TABLE]

N
4.644 Beiträge seit 2004
vor 18 Jahren

Entspricht aber nicht der ANSI-SQL-92-Spezifikation.

I
1.739 Beiträge seit 2005
vor 18 Jahren

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.

N
4.644 Beiträge seit 2004
vor 18 Jahren

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.

I
1.739 Beiträge seit 2005
vor 18 Jahren

Stimmt, ich Idiot(is ja auch schon spät). Hab trotzdem ein "Gegenargument", SQL 92 hin oder her, diese View ist eh Oracle-spezifisch 😉

N
4.644 Beiträge seit 2004
vor 18 Jahren

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..

I
1.739 Beiträge seit 2005
vor 18 Jahren

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 😉 )

N
4.644 Beiträge seit 2004
vor 18 Jahren

Original von ikaros
SQL 92 war auch nicht der letzte Standard.

Overview of SQL:2003 ( Part 11 )

L
lieschen Themenstarter:in
25 Beiträge seit 2005
vor 18 Jahren

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

N
4.644 Beiträge seit 2004
vor 18 Jahren

Die Select Anweisung von mir, kannst Du 1:1 kopieren.

L
lieschen Themenstarter:in
25 Beiträge seit 2005
vor 18 Jahren

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

I
1.739 Beiträge seit 2005
vor 18 Jahren

Wenn du den Provider von Oracle(ODP) verwendest, kannst die Methode GetSchemaTable des DataReaders benutzen.

L
lieschen Themenstarter:in
25 Beiträge seit 2005
vor 18 Jahren

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.

I
1.739 Beiträge seit 2005
vor 18 Jahren

wie wärs mit: "select table_name from all_tables where tablespace_name ='USERS'"?

L
lieschen Themenstarter:in
25 Beiträge seit 2005
vor 18 Jahren

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' ???

I
1.739 Beiträge seit 2005
vor 18 Jahren

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

L
lieschen Themenstarter:in
25 Beiträge seit 2005
vor 18 Jahren

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!

L
lieschen Themenstarter:in
25 Beiträge seit 2005
vor 18 Jahren
Datenbankinformationen

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

L
lieschen Themenstarter:in
25 Beiträge seit 2005
vor 18 Jahren
eigene Verbesserung

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