Kleines Datenbank-Programm. Hilfe



  • Hi!

    Ich würde gern ein kleines Programm schreiben, welches auf eine Datenbank zugreifen kann und Daten ändern löschen hinzufügen etc. Ich hab damit nochnie so recht was gemacht, deshalb bräuchte ich etwas hilfe.
    Wichtig ist, dass es kein Datenbank-Server geben soll, sondern lediglich eine Datei, welche als Datenbank fungiert. Ich habe einen Datenbank mit dem Alias-Manager erstellt, aber das Problem das ich eben bei den Komponenten das Alias auswähle.

    Verschiebe ich das Programm (mit samt der Datenbank) dann wird sie beim Programmstart nicht gefunden, da sie ja in einem anderen Verzeichnis gesucht wird.

    Kann mir da jemand helfen, oder kennt jemand eine gute leichte Einführung für Datenbanken? Das meiste was ich finde ist immer über DB-Server und Connections etc. Ich will aber lediglich etwas mit einer Datenbank-Datei machen.

    Danke!


  • Mod

    Hallo

    1. welche Datenbank
    2. das ist doch kein Datenbankproblem oder (Verzeichnissuche/Dateisuche)

    Moeglicherweise kann dir jemand weiterhelfen, aber dazu braucht man mehr Infos

    MfG
    Klaus



  • Zuerst würde ich mich auf http://www.mut.de/media_remote/buecher/SQL/data/start.htm über die Struktur von SQL-Tabellen und den zugehörigen Querys (Abfragen) auseinandersetzen.
    Dann gehst du im BCB-Builder auf Tools|Datanbankoberfläche und erstellst da 'ne neue Tabelle.
    Ich empfehle dafür Paradox, da diese einen ähnlichen Aufbau wie SQL-Tabellen haben. Außerdem kannst du dann über eine Query - Komponente auf die DB wie über SQL zugreifen.

    Zu dem Alias: Du machst am besten im Ordner, in dem das Prog liegt einen weiteren Ordenr namens "Data" oder so und packst da die *.db Dateien rein.
    Im Programm liest du dann im FormCreate bloß mit

    ExtractFilePath(Application->ExeName)
    

    das Prog-Verzeichnis aus und hängst da "Data" dran. Dann kannst du das dem Alias zuweisen.
    Es muss dann bloß immer der Data-Ordenr im Programmverzeichnis liegen.



  • Hi!

    Danke.
    Also ich werde dann wohl Paradox nehmen.

    Wie weise ich denn den Path dem Alias zu?

    Damit ich ein bischen durchblicke würde ich zuerst gern mal folgendes schaffen:

    Eine Tabelle "user.db" erstellen und in meinem Programm die Möglichkeit schaffen den Inhalt dieser Tabelle anzuzeigen und neue Einträge hinzuzufügen.

    Vielen Dank schonmal für eure Hilfe! 🙂

    PS: Das über SQL werd ich mir mal genauer durchlesen, aber von PHP her dürfte mir das bekannt sein. Zuerzeit ist mein Problem nur ein bischen die Funktionsweise von DB's bei Borland zu kapieren, aber ich denke mit eurer Hilfe wird das schon klappen 😉



  • hallo,

    es ist schon ein weilchen her da ich mich mit desktop-bds beschäftigte, aber ich denke ich kann mich erinnern, das man mit einer TDatebase-Komponente einen "virtuellen" alias vergeben kann, in der TTable-Kompo kannst du dann diesen virtuellen alias zuweisen.

    und denke auch daran, das du zur laufzeit des progs (also z. b. beim start -> OnCreate) einiges setzen kannst, so kannst du z. b. über Application->ExeName den kompletten pfad des progs rausbekommen, wenn z. b. die datenbank in dem verzeichnis der exe ist, könntest du über (vorsicht teilweise pseydocode:

    void __fastcall TForm1::FormCreate(TObject *Sender)
    {
     	String DBPath = Application->ExeName;
       DBPath.Delete(DBPath.Length() - DerAnzahldesPrognamens, UmDieAnzahlDesPrognamens);
       Database1->Directory = DBPath;
    }
    

    den pfad setzen. das würde dann auch immer funktionieren, solange die datenbanktablle im selben verzeichnis wie deine exe ist. aber wie erwähnt es gibt auch noch andere wege, gug dir mal TDatabase etc. an...

    mfg
    murph



  • murphy schrieb:

    DBPath.Delete(DBPath.Length() - DerAnzahldesPrognamens, UmDieAnzahlDesPrognamens);
    

    Von den verschiedenen ExtractFile...-Funktionen hast du wohl noch nichts gehört? 😉



  • Hi nochmal,

    am besten, du nimmst 'ne TQuery - Komponente, bei der du, nicht wie ich vorher versehentlich schrieb, dem Alias den Path zuweist, sondern der Eigenschaft "DatabaseName".

    Beispiel:

    AnsiString asDataDir = ExtractFilePath(Application->ExeName) + "Data\\";
    Query1->DatabaseName = asDataDir;
    

    Dann kannst du mit 'nem Codeblock wie:

    Query1->Close();
    Query1->SQL->Clear();
    Query1->SQL->Add(
    
     "SELECT "
     "    *\n"
     "FROM\n"
     "    user\n"            // oder "user.db"
     "WHERE\n"
     "    Name = \'" + "Beispiel" + "\'\n"
     "ORDER BY\n"
     "    Age"
                       );    // SQL->Add
    Query1->ExecSQL();
    

    Jetzt muss das ganze nur noch über ein TDataSource mit 'nem DBGrid oder ähnlichem verbunden werden.
    Dazu der Link: http://www.tutorials.delphi-source.de/dbeinstieg/

    Ist zwar für Delphi, aber grundlegend musst du nur "Komponente.Eigenschaft" durch "Komponente->Eigenschaft" ersetzen.

    LiGr
    Bl@ckbird



  • Dankeschön, werds probieren und mich dann ggf. wieder melden. 🙂



  • Hi!

    Welche Komponenten brauche ich denn alle, um mit der Datenbank zu arbeiten.
    Irgendwie hat mich die BB-Hilfe mit Datenmenge, Datenquelle etc. nur verwirrt.

    Also auf jeden fall brauche ich eine Datenbank z.B. "test.db"
    Dann brauche ich noch die TQuery-Komponente.

    Ist das so richtig:
    Ich brauche eine TTable und füge dort den TableName ein.
    Dann eine TDataSource und füge als DataSet TTable ein.
    Dann TQuery und füge als DataSource TDataSource ein.

    Wenn ich anfragen mit TQuery stelle, wo kommt dann die Antwort hin?
    Irgendwie versteh ich die zusammenhänge zwischen den Komponenten nicht so recht 😞



  • Dann solltest du dir unbedingt mal die Tutorials ansehen wie du sie in der BCB-Hilfe, in der FAQ und auch in diesem Thread erwähnt findest.



  • Also, am besten du machst das folgendermaßen:

    1. TTable:
    - DatabaseName setzen nicht vergessen und
    - MasterSource auf ein TDataSource setzen
    ➡ die Table-Komponente ist nicht unbedingt erforderlich, wenn du mit einem Query arbeitest
    2. TDataSource:
    - Dataset aufs Query setzen
    3. TQuery:
    - DatabaseName setzen

    Dann musst du zum Anzeigen nur noch ein DBGrid platzieren und DataSource aufs TDataSource setzen. Beim Ausführen des Querys (ExecSQL) wird der Inhalt der Tabelle dort automatisch angezeigt.
    Um neue Daten hinzuzufügen würde ich einfache Edits nehmen, um die daten zu erfassen und dann beim Klick auf einen Button "Speichern" folgenden Beispielcode ausführen lassen:

    Query1->Close();
        Query1->SQL->Clear();
        Query1->SQL->Add(
         "INSERT INTO\n"
         "    user\n"
         "    (Name, Age, Adress)"
         "VALUES\n"
         "    (\n"
         "    \'" + EditName->Text   + "\',\n"
         "    \'" + EditAge->Text    + "\',\n"
         "    \'" + EditAdress->Text + "\'\n"
         "    )"
                        );    // SQL->Add
        Query1->ExecSQL();
    
        MessageDlg("Eintrag erfolgreich hinzugefügt.", mtInformation, MsgDlgButtons() << mbOK, 0);
    

    Alternativ geht natürlich auch Update, Delete, ...; also (fast) alles, was in SQL auch erlaubt ist.

    Meine Erfahrungen mit den Database-Komponenten, wie z.B. TDBEdit, sind schlecht, weshalb ich von ihrer Verwendung abrate.



  • Achso, du kannst die Daten auch direkt beim Query abfragen.
    Dies machst du folgendermaßen:

    Label1->Caption = Query1->FieldByName("Name")->AsString;
    

    (Alternative wäre ...->AsBoolean; ...->AsInteger o.ä.)

    Damit kannst du aber nur den Eintrag abfragen, auf den de "Query-Zeiger" gerade zeigt.

    Mit folgendem Code kannst du das gesamte Query durchlaufen und z.B. das Alter deiner User addieren:

    int iAlter = 0;
    Query1->First();         // erster Eintrag aktiviert
    if (!Query1->IsEmpty())  // nicht leer
      for (int i = 1; i <= Query1->RecordCount; i++)    // RecordCount ist Gesamtanzahl an Einträgen
      {
        iAlter += Query1->FieldByName("Alter")->AsInteger;
        // wenn nicht letzter Eintrag, zum nächsten gehen:
        if (i != Query1->RecordCount) { Query1->Next(); }
      } // for
    


  • Hi!

    Muss ich den Database-Name setzen?
    Kann ich nicht einfach auch die einzelnen Tabellen mit
    Table1->TableName = "adressen.db";

    laden?
    Ich habe nämlich keine DB erstellt, sondern nur einzelne Tabellen.



  • Dem DatabaseName musst du den Pfad zu den Tabellen zuweisen (siehe oben).
    Dann den TableName setzen.



  • Hi!

    Ich habe die Tabellen im gleichen Verzeichnis. Dann brauch ich DatabaseName also nicht, oder?
    Jedenfalls gehts auch ohne DatabaseName



  • Probier mal folgendes:

    Erstelle mal eine Verknüpfung zu der *.exe auf'm Desktop. Dann rechtsklick aufs Icon und "Eigenschaften". Setz dann mal "Ausführen in" auf "C:\" oder ähnliches, aber nicht den Pfad, wo dein Programm drin ist.

    Wenn es beim Klick auf die Verknüpfung noch funktioniert, dann kannst du es so lassen, ansonsten würde ich den DatabaseName auf jeden Fall setzen.

    Viel Erfolg
    Bl@ckbird


Anmelden zum Antworten