Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Auslesen von Tabellen- und Datenbankinformationen
lieschen
myCSharp.de - Member



Dabei seit:
Beiträge: 25

Themenstarter:

Auslesen von Tabellen- und Datenbankinformationen

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
Noodles
myCSharp.de - Experte



Dabei seit:
Beiträge: 4802
Herkunft: Leipzig

beantworten | zitieren | melden

SELECT * FROM INFORMATION_SCHEMA.COLUMNS
private Nachricht | Beiträge des Benutzers
ikaros
myCSharp.de - Member



Dabei seit:
Beiträge: 1787

beantworten | zitieren | melden

DESC [TABLE]
private Nachricht | Beiträge des Benutzers
Noodles
myCSharp.de - Experte



Dabei seit:
Beiträge: 4802
Herkunft: Leipzig

beantworten | zitieren | melden

Entspricht aber nicht der ANSI-SQL-92-Spezifikation.
private Nachricht | Beiträge des Benutzers
ikaros
myCSharp.de - Member



Dabei seit:
Beiträge: 1787

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
Noodles
myCSharp.de - Experte



Dabei seit:
Beiträge: 4802
Herkunft: Leipzig

beantworten | zitieren | melden

Zitat
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.
private Nachricht | Beiträge des Benutzers
ikaros
myCSharp.de - Member



Dabei seit:
Beiträge: 1787

beantworten | zitieren | melden

Stimmt, ich Idiot(is ja auch schon spät). Hab trotzdem ein "Gegenargument", SQL 92 hin oder her, diese View ist eh Oracle-spezifisch
private Nachricht | Beiträge des Benutzers
Noodles
myCSharp.de - Experte



Dabei seit:
Beiträge: 4802
Herkunft: Leipzig

beantworten | zitieren | melden

Zitat
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..
private Nachricht | Beiträge des Benutzers
ikaros
myCSharp.de - Member



Dabei seit:
Beiträge: 1787

beantworten | zitieren | melden

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 )
private Nachricht | Beiträge des Benutzers
Noodles
myCSharp.de - Experte



Dabei seit:
Beiträge: 4802
Herkunft: Leipzig

beantworten | zitieren | melden

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

Overview of SQL:2003 ( Part 11 )
private Nachricht | Beiträge des Benutzers
lieschen
myCSharp.de - Member



Dabei seit:
Beiträge: 25

Themenstarter:

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
Noodles
myCSharp.de - Experte



Dabei seit:
Beiträge: 4802
Herkunft: Leipzig

beantworten | zitieren | melden

Die Select Anweisung von mir, kannst Du 1:1 kopieren.
private Nachricht | Beiträge des Benutzers
lieschen
myCSharp.de - Member



Dabei seit:
Beiträge: 25

Themenstarter:

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
ikaros
myCSharp.de - Member



Dabei seit:
Beiträge: 1787

beantworten | zitieren | melden

Wenn du den Provider von Oracle(ODP) verwendest, kannst die Methode GetSchemaTable des DataReaders benutzen.
private Nachricht | Beiträge des Benutzers
lieschen
myCSharp.de - Member



Dabei seit:
Beiträge: 25

Themenstarter:

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
ikaros
myCSharp.de - Member



Dabei seit:
Beiträge: 1787

beantworten | zitieren | melden

wie wärs mit: "select table_name from all_tables where tablespace_name ='USERS'"?
private Nachricht | Beiträge des Benutzers
lieschen
myCSharp.de - Member



Dabei seit:
Beiträge: 25

Themenstarter:

beantworten | zitieren | melden

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' ???
private Nachricht | Beiträge des Benutzers
ikaros
myCSharp.de - Member



Dabei seit:
Beiträge: 1787

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
lieschen
myCSharp.de - Member



Dabei seit:
Beiträge: 25

Themenstarter:

beantworten | zitieren | melden

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!
private Nachricht | Beiträge des Benutzers
lieschen
myCSharp.de - Member



Dabei seit:
Beiträge: 25

Themenstarter:

Datenbankinformationen

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
lieschen
myCSharp.de - Member



Dabei seit:
Beiträge: 25

Themenstarter:

eigene Verbesserung

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers