access datenbank mit borland builer verändern/anlegen



  • hallöchen

    hab mal wieder ein kleines problem, bei dem ich eure hilfe bräuchte!!!!

    also:

    wie die überschrift schon sagt, bräuchte ich hilfe beim zugriff/schreiben einer access datenbank mit dem borland builder.

    zu meinem wissenstand: ich habe bereits mit sql gearbeitet(grundkenntniss:)) und der borland ist mir auch nicht fremd also sollte ich das ganze mit eurer hilfe schon hinbekommen:)

    ich habe die access datenbank via ado connection mit dem borlandbuider verbunden und kann mittels dbgrid die tabelle anzeigen lassen!!!
    alles wunderbar, aber wie kann ich z.b. einzelne zeilen bzw spalten verändern oder neu anlegen?!

    bin gerade dabei das internet zu durchforsten, aber vieleicht kann mir hier jemand schneller helfen!

    viele grüße 😉



  • du könntest z.B. mal in den FAQ schauen was alles zum Thema Datenbanken drin steht, da ist auch ein Tutorial dabei. Das Tutorial arbeitet zwar mit der BDE, aber das kann man auch mit den ADO-Komponenten umsetzen



  • jaa hab ich schon gefunden...

    komm trotzdem nicht weiter.

    die befehle kann ich ja "senden" aber wie geb ich das ganze aus?

    mein quellcode:

    DBGrid1->DataSource->DataSet->Active=false;
    Form1->ADOConnection1->Connected=false;
    ADOQuery1->SQL->Clear();
    ADOQuery1->SQL->Add("select * from DerInhalt where Menge = 7");
    ADOQuery1->ExecSQL();
    ADOQuery1->Open();
    Form1->ADOConnection1->Connected=true;
    DBGrid1->DataSource->DataSet->Active=true;

    ist einfach nur so zusammekopiert;) hab damit leider noch garkeine erfahrung



  • naja, manchmal hilft ein Blick in die BCB-Hilfe...

    da steht z.B. wann man ExecSQL() und wann Open() verwendet

    außerdem solltest du erst die Verbindung zur Datenbank öffnen, da sonst das Query gar nicht ausgeführt werden kann:

    Form1->ADOConnection1->Connected=true; 
    ADOQuery1->SQL->Clear(); 
    ADOQuery1->SQL->Add("select * from DerInhalt where Menge = 7"); 
    ADOQuery1->Open();
    

    dazu mußt du natürlich (zur Entwurfszeit) das ADOQuery mit dem Dataset, das Dataset mit dem DBGrid und das ADOQuery mit der ADOConnection verbunden haben



  • hallo und danke für die hilfe!!!

    wie gesagt, bin ziemlicher neuling in dem ganzen thema und hab mir das ganze eigentich nur durch einlesen im internet beigebracht....

    bin aber nach einigem hin und her schon ein stückchen weiter:

    ich kann jetzt schon neue produkte und das mindeshaltbarkeitsdatum in die tabelle eintragen:
    Form3->ADOQuery1->SQL->Clear();
    Form3->ADOQuery1->SQL->Add("INSERT INTO DerInhalt");
    Form3->ADOQuery1->SQL->Add("(Produkt,MHD) VALUES") ;
    Form3->ADOQuery1->SQL->Add("('"+Produkt+"','"+MHD+"')");
    Form3->ADOQuery1->ExecSQL();

    Problem ist jetzt nur wenn ich ein zuvor eingetragenes Produkt löschen möchte:

    Form3->ADOQuery1->SQL->Clear();
    Form3->ADOQuery1->SQL->Add("Delete From DerInhalt where MHD="+MHD+";");
    Form3->ADOQuery1->ExecSQL()

    In der Variablen MHD steht eine TDate Variable.
    In der Tabelle ist die Spalte MHD erstellt.
    als fehler bekomme ich: Datentypen in Kriterienausdruck unverträglich...

    kann mir jemand einen tipp geben?! 🤡



  • verwende Parameter statt die Werte in den SQL-String einzubasteln:

    Form3->ADOQuery1->SQL->Clear(); 
    Form3->ADOQuery1->SQL->Add("INSERT INTO DerInhalt"); 
    Form3->ADOQuery1->SQL->Add("(Produkt,MHD) VALUES") ; 
    Form3->ADOQuery1->SQL->Add("(:Produkt,:MHD)"); 
    Form3->ADOQuery1->Parameter->ParamByName("Produkt")->Value = Produkt;
    Form3->ADOQuery1->Parameter->ParamByName("MHD")->Value = MHD;
    Form3->ADOQuery1->ExecSQL();
    

    und

    Form3->ADOQuery1->SQL->Clear(); 
    Form3->ADOQuery1->SQL->Add("Delete From DerInhalt where MHD=:MHD"); 
    Form3->ADOQuery1->Parameter->ParamByName("MHD")->Value = MHD;
    Form3->ADOQuery1->ExecSQL();
    

    die Paremter setzen dann den Variablentyp selbst, je nachdem welches Format die Spalte in der DAtenabnk hat.

    die Frage ist jetzt: welches Format hat die Spalte MHD in der Datenbank? Datum oder Text?

    und noch ein Tip: verwende das Syntaxcoloring/Code-Tags



  • habs gerade selbst hinbekommen:

    Form3->ADOQuery1->SQL->Add("Delete From DerInhalt");
    Form3->ADOQuery1->SQL->Add("where Produkt='"+Produkt);
    Form3->ADOQuery1->SQL->Add("' AND MHD=DateValue('"+MHD+"')");

    klappt wunderbar:) trotzdem danke für die mühe



  • ja, das klappt, so lange, bis jemand mal die Sprache in der DB umstellt... (falls das Feld ein Datumsfeld ist)
    Und auch bei Fließkommawerten kann die Sprache einen kleinen Unterschied machen, wenn man die Werte als Strings übergibt.

    Auch SQL-Injection ist ein Risiko, wenn man SQL-Strings so zur Laufzeit zusammenstöpselt.

    Verwende Parameter.

    Gruß KK



  • ahja:)

    verstehe nicht ganz was du meinst?!

    was meinst du soll ich machen? hast ein kleines bsp für mich?

    viele grüße



  • hab noch ein kleines problemchen für den späten abend:)

    ich will jetzt in meiner dbgrid die gleichen produkte zusammenfassen und per count noch ne zusätzliche spalte die menge der gleichen produkte anzeigen
    hab mir das so gedacht:
    Form3->ADOQuery1->SQL->Clear();
    Form3->ADOQuery1->SQL->Add("Select Produkt, Count(Produkt) AS Menge From DerInhalt Group by Produkt");
    Form3->ADOQuery1->ExecSQL();

    funktioniert aber leider nicht... was mach ich falsch?



  • "funktioniert nicht" ist keine ausreichende Fehlerbeschreibung



  • Wird wohl an dem ExecSQL() liegen. Da gehört wohl eher ein Open() hin... Ansonsten siehe Linneas Post.



  • jaa sorry ihr habt recht;)

    also ich möchte ja wie gesagt die produkte zählen und die jeweilige menge in der spalte menge ausgeben!
    leider wir weder was gezählt noch was in der spalte menge ausgegeben:)

    versteht ihr jetzt?

    warum muss ein open hin? bisher hat das mit dem exec immer problemlos funktioniert


  • Mod

    Hallo

    schau mal den Beitrag von Linnea an

    naja, manchmal hilft ein Blick in die BCB-Hilfe...
    da steht z.B. wann man ExecSQL() und wann Open() verwendet

    Mfg
    Klaus



  • habs geändert, funktoniert aber trotzdem nicht!!!

    also nochmal mein problem:

    ich habe eine tabelle, die wird mit neuen daten gefüttert.

    jetzt habe ich noch eine tabelle, in der ich die gleichen produkte zusammenfassen will, die menge der gleichen zählen möchte und dann sie dann noch anzeigen!!!!!

    wie muss ich da vorgehen?

    ich muss 2 ado verbindungen herstellen oder?

    dann muss ich es die eine tabelle(sortiert) auf einem dbgrid ausgeben das hab ich sogemacht:
    from Derinhalt ist die tabelle in der alle gespeicherten produkte stehen(unsortiert)

    Form3->ADOQuerysortiert->SQL->Clear();
    Form3->ADOQuerysortiert->SQL->Add("Select Produkt, Count(Produkt) AS Menge From DerInhalt Group by Produkt");
    Form3->ADOQuerysortiert->Open();

    als fehler bekomm ich jetzt, dass er die tabelle derinhalt nicht findet! wie muss ich diese noch einbinden?!

    ich schau mir gerade das tut durch, komm aber leider nicht weiter.
    vielen dank im vorraus:)



  • mögliche Fehlerquellen:
    - Tabelle existiert nicht oder wird anders geschrieben
    - Fehler in der SQL-Syntax in Bezug auf Access
    - ADOQuery ist nicht mit einer aktiven ADOConnection verbunden
    - ADOConnection ist mit der falschen Datenbank verbunden (sind die beiden Tabellen in einer Datenbank?)

    du kannst ja das Query mal direkt im Access ausprobieren, wenns dort schon Fehler gibt trifft Punkt 1 oder 2 zu

    noch ein Tip: bei dem SQL-Kommand fehlt die Sortierung (ORDER BY ...)



  • also ich hab 2 verschiedene datenbanken!

    1: derinhalt (alle produkte unsortiert)
    2: sortiert (in dieser tabelle sollen am ende die produkte sortiert, gezählt ausgegeben werden)

    also ich versuch mal zu erklären was ich gemacht hab:

    1. adoconection hab ich auf die sortiert tabele gesezt
    2. adotable connection auf adoconnection aus 1.
    3. datasource hab ich bei connection auch die adoconnection aus 1. und als tablename die tabelle sortiert aus datenbank sortiert
    4. query hab die adoconnection aus 1 eingetragen

    wenn ich 4 auf activ schalten möchten kommt ein fehler: eigenschaft sql fehlt! was bedeutet das?! was mach ich falsch?

    als 5. hab ich noch ein dbgrid bei der ich bei connection die adoconnection von 1 eingetragen habe!

    wenn ich jetzt das prog starte, kommt die tabelle, zeigt aber keinen inhalt sonder nur die überschriften

    wie gesagt, ich bin totaler noob und arbete zurzeitnur mit euren tips und dem tut aus den faq... hoffe meine fehler sind nicht all zu blöde und ihr könnt mir vieleciht ien bischen helfen...



  • wie jetzt? zwei Datenbanken mit je einer Tabelle? Warum nicht beide Tabellen in einer Datenbank?

    ein wenig Access-Kenntnisse solltest du schon haben wenn du damit arbeiten willst Datenbanke-FAQ

    im Prinzip stimmt dein Vorgehen, allerdings nur für eine Datenbank, wenn du wirklich 2 hast brauchst du auch 2 ADOConnections

    Otz110 schrieb:

    wenn ich 4 auf activ schalten möchten kommt ein fehler: eigenschaft sql fehlt! was bedeutet das?! was mach ich falsch?

    hast du im ADOQuery ein SQL-Kommando hinterlegt (Eigenschaft SQL im Objektinspektor)?

    Otz110 schrieb:

    wenn ich jetzt das prog starte, kommt die tabelle, zeigt aber keinen inhalt sonder nur die überschriften

    ist denn in der Tabelle auch was drin?



  • also hab nochmal etwas ausprobiert:

    hab jetzt nur eine datenbank mit 2 tabellen...

    in der einen stehen immernoch alle produkte und die anderen soll immernoch die einzelnen produkte zusammengefasst anzeigen.

    glaube jetzt stimmt mein sql code nicht ganz:

    ("Select Produkt, Count(Produkt) AS Menge From DerInhalt Group by Produkt ");

    es funktioniert etwas aber nicht das was ich will.
    wenn ich das prog ausführe zeigt es jetzt die anzahl der verschiedenen produkte und zeigt das produkt mit dem ersten bustaben im alphabet.

    das ist aber nicht der sinn meiner abfrage. ich möchte das es die gleichen produkte zusammenfasst und die anzahl der einzelnen produkte anzeigt!

    also wenn ich in der tabelle folgendes stehen habe:

    bier
    bier
    bier
    wasser
    bier
    wasser

    dann soll das am schluss so aussehen

    menge produkt
    4 bier
    2 wasser

    vielen dank und noch einen schönen abend



  • keiner ne idee?!


Anmelden zum Antworten