Laden...

Abfragen

Erstellt von TiTime vor 17 Jahren Letzter Beitrag vor 17 Jahren 2.070 Views
T
TiTime Themenstarter:in
68 Beiträge seit 2006
vor 17 Jahren
Abfragen

hallo zusammen!
Situation:

Eine Db mit mehrern Grund Tabellen(tab1, tab2, tab3, ...) Dann noch einige sekundäre Tabellen (tab1_tab2, tab1_tab3) um n:m Beziehungen aufzulösen. Verbunden über eine Id.

Anwendung in der nur die Grundtabellen in das DataSet geladen worden sind.

  1. Frage da ich die tabellen momentan hardcoded reinlade. mit
 dbAdapter.Fill(dataSet, tablename);

(tablename ist ein Literal)

Gibt es eine möglichkeit die tables dynamisch zu laden? (mir ist klar wennn dynamisch werden dann alle geladen und das es über Metainformationen geht) aber woher bekomm ich diese?

2.frage:
Nun bedarf ein Formular von mir, dass ich auch diese mappingtabelle(tab1_tab2, ..) unter anderem anzeige. Wie mach ich das am besten? d.h wie mach ich das technisch? Eine Abfrage absetzten um eine Resulttabelle zu erhalten mit der ich dann weiterarbeiten kann, geht das überhaupt?

T
TiTime Themenstarter:in
68 Beiträge seit 2006
vor 17 Jahren

Weiß niemand eine Lösung für mich?

D
496 Beiträge seit 2005
vor 17 Jahren

sorry ich versteh nicht genau was du möchtest
was für tabellen lädst du denn?
welche datenbank?
nutzt du odbc treiber?

beschreib mal ein bischen mehr

"Programming is similar to sex. If you make a mistake, you have to support it for the rest of your life."

286 Beiträge seit 2006
vor 17 Jahren

Immer wieder beliebt bei mir ist es,
den offiziellen DB-Server-Manager zu nutzen und dann zu Tracen.

Da bekommt man eine ganze Menge Infos.

Gruß, maYer

T
TiTime Themenstarter:in
68 Beiträge seit 2006
vor 17 Jahren

@demondriver235

Also es ist eine Access DB und ich machs über oledb.
Ich hab eine Klasse geschrieben die mir Zugriff auf diese DB verschafft.
Das sind die Members der Klasse:

private OleDbConnection dbConnector;
private OleDbDataAdapter dbAdapter;
private OleDbCommand sqlCommand;
private DataSet dataSet;
public DataTableCollection Tables;

Das Dataset befülle ich somit "händisch" mit folgender Funktion, da die Daten ja nicht automatisch geladen werden:

private void InitTab(String tablename){
sqlCommand = new OleDbCommand("SELECT * FROM " + tablename, dbConnector);
dbAdapter.SelectCommand = sqlCommand;
dbAdapter.Fill(dataSet, tablename);
}

Diese Funktion rufe ich x mal auf für jede Tabelle die ich laden will. Der Parameter tablename ist somit hardcoded im source code:

InitTab("Passwörter");

Hardcoded ist schlecht und unflexibel. So nun will ich das ganze dynamisch laden. Das heißt die Anwendung soll alle Access Dbs laden die es gibt. Warum dynamisch. Naja wenn eine nuee Tabelle angelegt wird soll diese dann auch beim nächsten mal mitgeladen werden und für den Zugriff bereitstehen.
Warum ich nicht die Objekte benütze? Weil ich einen Abstraktionsschritt zwischen Datendarstellung und Daten brauche. Daher die selber geschriebene Klasse.

@Wolf_maYer der DB-Server Manager klingt gut. Wie sprech ich diesen an im Source Code.

Betreffend der 2ten Frage.
Das Ergebnis einer Abfrage will ich angezeigt bekommen.
Bsp:
Wenn jetzt tab1, tab2. tab 1 und Tab2 haben die selbe Struktur. Nur werden aus "Übersichtlichkeit" voneinander getrennt.
Jetzt will ich z.B. das Ergebnis dieses Statements anzeigen lassen
Select * from tab1
UNION
Select * from tab2
Wie zeige ich nun die Ergebnise in meinem Datagrid an.

T
512 Beiträge seit 2006
vor 17 Jahren

Also Metadaten der Datenbank bekommst du über die GetSchema Methoden der OleDbConnection. Ist bissel viel um das hier zu beschreiben, schau mal in die MSDN. Ich glaube mit GetSchema( "Tables" ) bekommt man eine DataTable in der alle Tabellen stehen (für die man Rechte hat).

Bei deiner zweiten Frage bin ich nicht ganz sicher ob ich das richtig verstehe. Du hast 2 DataTables mit gleicher struktur und willst daraus quasi eine Tabelle machen, die du dann anzeigst?
Versuch mal eine DataTable per tab1.Clone() zu kopieren (damit du die Originale noch unverändert da hast) und dann zu dieser per Merge( tab2 ) den Inhalt der anderen hinzuzufügen.

e.f.q.

Aus Falschem folgt Beliebiges

286 Beiträge seit 2006
vor 17 Jahren

Hmm,
hatte jetzt eher an größere DB´s gedacht ...
MSSQL und Oracle bringen zum Beispiel einen Manager mit.
Ich hätte auch keine Ahnng, wie man bei Access tracen soll.

Gruß, maYer

T
TiTime Themenstarter:in
68 Beiträge seit 2006
vor 17 Jahren

Es ist eine Große Db mit verdammt viele Daten und Tabellen. ICh mein deine vermutung liegt sicher daran wiel ich sage alles in das DB set laden. Nach möglichkeit würde ich nur benötigte Tabellen laden. ABer ich vermute mal das es dynamisch schwer zu bewähltigen ist und ich daher sehr speicherintensiv arbeiten muss.

Allerdings "muss" ich meine Anwendung auf eine bereits bestehende Acess DB aufsetzten. und es ist aus organisatorischen Gründen und duverse nicht möglich diee DAten in eine anderes System rüberzubringen. Ich persönlich würde den SQL Server 2005 oder Qracle bevorzugen aber geht nun mal nicht und jetz plag ich mich da halt ein bisschen. Und weiß auch nicht wie ich das tracen soll

D
496 Beiträge seit 2005
vor 17 Jahren

sorry fürchte ich kann dir nicht wirklich weiterhelfen
wenn du rauskriegst wie du die anzahl tabellen in der DB zählen kannst

bräuchtest du ja nur noch in einer for oder for each schleife
für jede tabelle einen eine select * ausführen

mein problem ist das ich nicht weiss wie du die namen oder die anzahl der tabellen einer access db zurückkriegst.

"Programming is similar to sex. If you make a mistake, you have to support it for the rest of your life."

T
TiTime Themenstarter:in
68 Beiträge seit 2006
vor 17 Jahren

Tja das wär ein teil der Lösung meiner Problem. Die Metadaten zu extrahieren. Vermutlich wird es über die getSchema() methode gehen. Allerdings bin ich auf der suche nach einem Bsp. Weil über die msdn alles zusammenzureimen , dafür fehlt mir heute die geduld. Funktioniert das OledbConnection getSchema überhuapt einwandfrei auf accessDBs?

Also wenn mir da wer weiterhelfen kann wäre ich sehr dankbar. 😉

D
496 Beiträge seit 2005
vor 17 Jahren

ich glaub ich habs

mach mal diese abfrage

SELECT MSysObjects.Type, MSysObjects.Name
FROM MSysObjects
WHERE (((MSysObjects.Type)=4));

damit fragst du die access systemtabellen nach anzahl und namen der vonhandenen
tabellen ab.

dann brauchst du nur noch meit ner schleife alle durchgehen.

"Programming is similar to sex. If you make a mistake, you have to support it for the rest of your life."