Kleines Datenbank-Programm. Hilfe



  • 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