Datenbank anlegen/erstellen
-
Hi@all
also ich weiß, es wurde schon viel und immer wieder darber geschrieben und auch das Netz ist voll von sogenannten TUT's und FAQ's - aber ehrlich, ich habe gesucht und nichts gefunden.
Wie erstelle ich im BCB zur Laufzeit eine neue Datenbank mit Tabellen - ohne die Datenbankoberfläche ?
Sowas in der Art hier habe ich gefunden, aber wo und an welcher Stelle füge ich das in den QuellCode ein.
CreateDirectory("C:\\datenbank",0); //Alias anlegen Session->AddStandardAlias("blabla", "C:\\datenbank", "PARADOX"); Session->SaveConfigFile(); //Tabelle erstellen TTable* table = new TTable(this); table->DatabaseName="kosten"; table->TableName = "blabla.db";
Und dann noch, wenn ich das fertige PROG weitergeb und auf dem Anwenderrechner ist keine Datenbank vorhanden muss das Programm ja auch laufen, also muss ich vorher quasi prüfen ob eine DB vorhanden, ob eine Tabelle vorhanden und ob Daten vorhanden etc.
Gibt es wirklich nirgendwo eine aussagekräftiges TUT zu diesem Thema???
Ohne Datenbankoberfläche !!!
Ich will die DB bei Programmaufruf selbst erstellen, wenn das geht.
Bitte keine bösen Worte von wegen SUCHEN und GOOGLE, hilfreiche Links und Hinweise sind besser - Danke.
Thx@all
-
was für eine Datenbank willst du denn erstellen? Access, MSSQL, MySQL, DBase?
welche BCB-Version verwendest du?
warum verwendest du die veraltete BDE? wenn es deine BCB-Version zuläßt nimm besser die ADO-Komponenten
-
@Linnea
Ich nutze BCB6.was für eine Datenbank willst du denn erstellen? Access, MSSQL, MySQL, DBase?
Ist mir eigentlich egal, so einfach wie möglich und so das es auf einem Fremdrechner funktioniert, ohne BDE !!!
Hab jetzt folgendes ausprobiert:
CreateDirectory("E:\\DATABASE", NULL); Session->AddStandardAlias("WayCool", "E:\\DATABASE", "PARADOX"); Session->SaveConfigFile(); Table1 = new TTable(Form1); Table1->Active = false; // The Table component must not be active. Table1->DatabaseName = "WayCool"; Table1->TableType = ttParadox; Table1->TableName = "blabla.db"; if (Table1->Exists) MessageDlg( "Turnier table already exists.", mtWarning, TMsgDlgButtons() << mbOK, 0);
ERROR:
---------------------------
Benachrichtigung über Debugger-Exception
---------------------------
Im Projekt db1.exe ist eine Exception der Klasse EDBEngineError mit der Meldung 'Name nicht eindeutig' aufgetreten.
---------------------------
Anhalten Fortsetzen Hilfe
---------------------------
-> Session->AddStandardAlias("WayCool", "E:\\DATABASE", "PARADOX");Thx@all
-
Sobald du TTable verwendest verwendest du auch die BDE. Nimm also lieber TADOTable.
Es sollte dir nicht egal sein, welche Datenbank angelegt wird, da jedes Datenbanksystem (DBMS) seine Eigenheiten hat, schon allein beim SQL-Syntax. Außerdem gibt es einen Unterschied zwischen Datenbank und Tabelle. Paradox hat immer einzelne Tabellen als Datei und damit auch als Datenbank. Access kann mehrere Tabellen in einer Datenbank verwalten, genau wie MySQL, MSSQL, Interbase/Firebird (und sqlite).
Ganz einfache "Datenbanken" gehen auch mit Text- oder Exceldateien.
Was willst du also machen bzw. in welchem Umfang willst du auf Daten zugreifen oder Daten speichern?
-
Ich möchte eine Sportwettkampfauswertung erstellen.
Habe folgende Excel-Tabelle:Startnummer|Verein|Disziplin|W1|W2|W3|W4|W5|W6|W7|Summe|Platz
W1-W7 = Kampfrichterpunkte
Es soll so funktionieren, das ich das auf jeden x-beliebigen Rechner installieren kann.
Die Liste soll per IMPORT eingefügt werden.Dann möchte ich im Programm die Werte W1-W7 eingeben können, MAX/MIN wert bestimmen, Summe errechnen, Platz ermitteln.
Nun wollte ich also bei Programmstart auf dem Clientrechner im Programmverzeichnis einen Ordner für die Datenbank und darin eine Datenbank erstellen, mit der ich arbeiten kann.
Das ganze soll dann noch Druckbar sein, verschiedene Auswertungen, TV-Ausgabe, etc.
Momentan hänge ich einfach an der Erstellung der eigenen DB fest.
Mit einer DB von der BDE funktioniert alles schon einigermaßen.Wie ist denn das mit mySQL, kann ich einfach so auf einem Rechner eine mySQL Datenbank anlegen ?
Mit Text- oder Excel Dateien ist mir das ständige schreiben und lesen zu aufwendig.
Thx@all
-
Du kannst die Excel-Datei auch als Datenbank ansprechen. Dabei sind nur ein paar Kleinigkeiten zu beachten:
- alle Zellen werden standardmäßig als Text behandelt
- die Kopfzeile darf nur eine Zeile sein
- es gehen nur ~64000 Zeilen und ~128 Spalten
- Tabellenname = Tabellenblattname$ (<- das $-Zeichen ist wichtig)um eine Excel-Datei als DB-anzusprechen, kannst du z.B. wie folgt vorgehen:
- eine TADOConnection aufs Formular legen
- im Objektinspektor bei LoginPrompt false einstellen
- bei ConnectionString eingeben (Dateipfad bei Data Source anpassen):
Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\MyExcel.xls;Extended Properties="Excel 8.0;HDR=Yes;IMEX=1";
- Connected bei TADOConnection auf true setzen
Wenn das funktioniert, hast du eine Verbindung zu deiner Datenbank. Hierbei kannst du sogar mehrere Tabellen ansprechen, da jedes Tabellenblatt im Excel auch eine Tabelle in deinem Programm ist.
-
Danke für die Info, werd ich ausprobieren.
Problem: Auf dem ClientRechner ist ja die ExcelTabelle nicht direkt vorrätig, bzw. soll sie erst impprotiert werden.
Woher weiß ich wo der Client diese Exceldatei abgelegt hat ?
Oder kann ich erst die Excel-Datei imortieren in ein vorgegebenes Verzeichnis und dann darauf zugreifen?Trotzdem habe ich das Problem einer eigenen Datenbank anlegen noch nicht gelöst bekommen.
Thx@all
-
@Linnea
Hab ich probiert und soweit gut:um eine Excel-Datei als DB-anzusprechen, kannst du z.B. wie folgt vorgehen: 1) eine TADOConnection aufs Formular legen 2) im Objektinspektor bei LoginPrompt false einstellen 3) bei ConnectionString eingeben (Dateipfad bei Data Source anpassen): Code: Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\MyExcel.xls;Extended Properties="Excel 8.0;HDR=Yes;IMEX=1"; 4) Connected bei TADOConnection auf true setzen
Bei4) bekomme ich folgende Fehlermeldung:
--------------------------- Fehler --------------------------- Syntaxfehler in FROM-Klausel. --------------------------- OK Hilfe Details >> ---------------------------
Den Pfad zur Excel-Datei habe ich angepasst.
Thx@all
-
Die Meldung müßte vom TADOTable kommen. Stell dort mal TableDirect auf true.
Zu den anderen Fragen: du kannst den ConnectionString auch zur Laufzeit setzen. Dadurch kannst du ihn vorher auch so anpassen, daß der Pfad dann passt, z.B. mit Hilfe eines TOpenDialog um eine Datei auszuwählen oder mit ExtractFilePath/ExtractFileDir um den Pfad deines Programms zu ermitteln, wenn die Datei immer dort liegen soll.
-
Hi@all
// Datenfile (Excel-Datei) laden if(OpenDialog1->Execute()) { String connstr="Provider=Microsoft.Jet.OLEDB.4.0;User ID=Admin;Data Source="; connstr += OpenDialog1->FileName; connstr +=";Extended Properties='Excel 8.0;HDR=Yes;IMEX=1'"; ADOConnection1->ConnectionString = connstr; ADOConnection1->Connected=true; ADOTable1->ConnectionString = connstr; ADOTable1->TableName ??? ADOTable1->Active=true; }
Woher bekomme ich den Tabellennamen (Tabelle1$), welcher ja verschieden sein kann?
Hab das hier gefunden, funktioniert aber leider nicht.For Each tbl In objAdoCat.Tables Debug.Print tbl.Name, tbl.Type Next tbl
Thx@all
-
schau dir mal von TADOConnection die Funktion GetTableNames an
-
Danke, hab ich rausbekommen.
Frage: Ich habe festegstellt, dass die FieldNames Liste alphabetisch sortiert ist. Wie kann ich das unterdrücken bzw. in der Reihenfolge ausgeben wie sie in der Tabelle angelegt sind ?TStringList *ItemList = new TStringList; ADOConnection1->GetFieldNames(TableList->Strings[0],ItemList); ItemList->Sort(); for(int i = 1;i<ItemList->Count;i++) { ListBox1->Items->Add(ItemList->Strings[i].c_str()); }
Thx@all
-
indem du die Zeile
ItemList->Sort();
wegläßt...
-
Nein leider nicht.
Das spielt überhaupt keine Rolle, egal ob da oder nicht, wird trotzdem alphabetisch sortiert.
Das ist natürlich schlecht, wenn ich die Zuordnungsfelder zur Laufzeit neu setzen muss, wenn die importierte Tabelle andere Spaltenbezeichnun hat wie meine Vorgabe.Jemand ne Idee dazu ?
Thx@all
-
naja, dann macht GetFieldNames das anscheinend immer so
du kannst auch folgendes tun:
for (int i=0; i<ADOTable1->FieldCount; i++) ListBox1->Items->Add(ADOTable1->Fields->Fields[i]->FieldName);
noch als Hinweise zu deinem Quellcode:
for(int i = 1;i<ItemList->Count;i++) { ListBox1->Items->Add(ItemList->Strings[i].c_str()); }
- du mußt beachten, daß der Zähler immer bei 0 anfängt, sonst fehlt dir die erste Spalte
- warum machst du .c_str() an den String?
-
Danke, hat geholfen.
2) warum machst du .c_str() an den String?
Habe ich so in einer Anleitung gefunden.
Thx@all