Schreiben in eine Access Datenbank nicht möglich?



  • Aloha,

    was hast Du denn schon, bzw. wie probierst Du es zur Zeit ?

    Grüße

    BOA



  • Erstmal besten Dank für die Tips!

    Also in den FAQ hab ich mal geschaut, und das was dort aufgeführt ist hab ich schon alles mal probiert!
    Ich habe z.B. das Problem, das ich, wenn ich die .open Methode, ob mit (appendOnly) oder ohne Parameter aufrufe als erstes einen "Debug Assertion Faild" bekam. Dann hab ich mir gedacht, ok, schließt du die Datenbank erstmal (.close()), aber wenn ich dann versuche einen Datensatz einzufügen bekomme ich eine Meldung, "Datensatzgruppe kann nur gelesen werden." Daraufhin habe ich mir die DB mal vorgenommen und nachgeschaut ob da irgendetwas auf Schreibgeschützt steht. Fehlanzeige! Dann habe ich in der MSDN nochmal nachgeschaut, und dort ein "Fully updatable" gefunden, wobei ich nicht weiß, bzw. nicht angegeben ist wie ich das angeben muß.
    Da unser Lehrer meinte, die DB muß im MSA-97 Format sein, habe ich dann die Datenbank konvertier. Brachte aber auch nichts!
    Dann habe ich mal versucht, die DB über DAO einzubinden, das geht aber wirklich nur im MSA-97 Format. OLE DB hab ich dann auch noch gecheckt, es läuft aber irgendwie immer aufs gleiche hinaus! Datensätze können nur gelesen werden!
    Ich glaube zwar nicht das es von bedeutung ist, das ich versuche die Daten aus einem Modalen Dialog in die DB zu schreiben, da ich den Dialogklassen je eine Referenz von "m_pSet" mitgegeben habe! Er kann dort ja auch Datensätze lesen!
    Achso, durch die ganze DB Änderungsgeschichte hab ich mir die Set-Klassen auch schon einige male zerschossen, diese aber in einem neuen Arbeitsbereich unter gleichem Projektnamen wieder angelegt und kopiert, da ich die ganzen Dialoge nicht immer neu erstellen wollte! Dabei sind aber auch keine Fehler entstanden!

    Ich weiß so langsam nicht mehr was ich noch alles machen soll!

    Das folgende ist der Code aus einem Dialog, ausdem die Daten geschrieben werden sollen!

    void CNeuerSchueler::setView(CProjektaquiseSet *m_pSet)
    {
    m_dbSet=m_pSet;
    }

    BOOL CNeuerSchueler::OnInitDialog()
    {
    CDialog::OnInitDialog();

    m_dbSet->MoveLast();

    return TRUE; // return TRUE unless you set the focus to a control
    // EXCEPTION: OCX-Eigenschaftenseiten sollten FALSE zurückgeben
    }

    void CNeuerSchueler::OnOK()
    {
    m_dbSet->Close();
    //m_dbSet->Open();
    m_dbSet->Open(CRecordset::dynaset, NULL, CRecordset::appendOnly );
    m_dbSet->AddNew();
    m_dbSet->m_KlassenName=m_str_einKlasse;
    m_dbSet->m_Vorname3=m_str_einVorname;
    m_dbSet->m_Nachname3=m_str_einNachname;
    m_dbSet->m_Adresse2=m_str_einAdresse;
    m_dbSet->m_PLZ2=m_int_einPLZ;
    m_dbSet->m_Ort2=m_str_einOrt;
    m_dbSet->m_Telefon3=m_str_einTelefon;
    m_dbSet->m_E_Mail3=m_str_einEMail;
    m_dbSet->m_Geb_Datum=m_ctm_einGebdat.Format("%d.%m.%Y");
    m_dbSet->Update();

    }

    Und dieses ein Auszug aus der Set-Klasse!

    m_Telefon3 = _T("");
    m_E_Mail3 = _T("");
    m_nFields = 39;
    //}}AFX_FIELD_INIT
    m_nDefaultType = dynaset;
    }

    CString CProjektaquiseSet::GetDefaultConnect()
    {
    return _T("ODBC;DSN=Projektaquise");
    }

    CString CProjektaquiseSet::GetDefaultSQL()
    {
    return _T("[Ansprechpartner],[PbFl],[Projekt],[Projektfirma],[Studierende]");
    }

    Oder muß ich an diese Sache etwa komplett mit SQL-Befehlen ran gehen?

    Gruß
    Elle



  • Elle schrieb:

    CString CProjektaquiseSet::GetDefaultSQL()
    {
    return _T("[Ansprechpartner],[PbFl],[Projekt],[Projektfirma],[Studierende]");
    }

    Ist das eine RecordSet-Klasse über 5 Tabellen ?
    Erstell mal für jede Tabelle eine eigene von CRecordset abgeleitete Klasse, dann klappts auch mit dem Schreiben (nicht so ein Monsterding über mehrere Tabellen).



  • war Quatsch

    Grüße

    BOA



  • BOA schrieb:

    war Quatsch

    Grüße

    BOA

    Was war Quatsch? Die aussage, das ich jede Tabelle in eine separate Klasse stecken muß?

    Oder habe ich irgendeinen Quatsch gemacht?

    Gruß
    Elle



  • Aloha,

    neenee, ich habe mein Post editiert, der war quatsch.

    Deine Aussage ist absolut korrekt, 5 Tabellen = 5 Klassen.

    Grüße

    BOA



  • @isabeau und @BOA
    besten dank für die Tips!
    Aber ich kann nicht ganz verstehen warum ich für jede Tabelle eine Separate Klasse brauche!
    Was mache ich denn wenn eine DB mal etliche Tabellen mehr hat?
    Da wird man ja beklopt bei!
    Naja, ich werde das auf jeden Fall probieren! Mal schaun ob ich das alles hinbekomme!

    Gruß
    Elle



  • Aloha Elle,

    naja, ist schon übersichtlicher, die Wartbarkeit des Programms steigt und der Assi hilft dir ja bei der Erstellung der Klassen ( sind softwareentwickler nicht alle ein bißchen bekloppt ? ). 😉

    Ich hatte auch Probleme, als ich mehrere Tabellen in einer Klasse hatte, der wollte die Werte, so wie bei Dir, einfach net einlesen. Hatte ich sie alle separat, gig es ohne Probs.

    Benutze doch Namen wie CTabelle_xxx ( oder CTable_xxx ), dann sind im Klassenbaum im Studio alle Tabellen untereinander, und schnell zu finden.

    Grüße

    BOA



  • Hallo,

    der Pfad ist zwar schon etwas älter, aber ich probier einfach mal, ob ich ne Antwort bekomme... 🙂 mein Problem ist das Gleiche eigentlich im Grunde, nur das ich mit einem SQL-Server arbeite, habe zwei Tabellen erstmal aufgenommen, die miteinander ne Beziehung haben, wenn ich jetzt zwei Klassen für diese zwei Tabellen habe, wie kann ich die dann miteinander verknüpfen, sprich, eine WHERE-Klausel formulieren...oder ein JOIN...

    gruss,

    chullain



  • Vielleicht so:
    du nimmst den Wert aus der ersten Tabelle, über den die beiden verknüpft sind und baust ihn in den Filter auf Tabelle Zwei ein.
    Z.B.:
    - Tabellen sind über das Feld WERT verknüpft:

    CTabelle1 Tabelle1;
    Tabelle1.Open();
    
    // mach was - Datensatz bestimmen...
    // ...
    // jetzt die zugehörigen Datensätze in Tabelle Zwei holen
    
    CTabelle2 Tabelle2;
    Tabelle2.m_strFilter = "WERT = '" + Tabelle1.m_WERT + "'";
    Tabelle2.Open();
    
    while(!Tabelle2.IsEOF())
    {
    	// mach was mit den dazugehörigen Datensätzen
    	Tabelle2.MoveNext();
    }	
    
    Tabelle2.Close();
    Tabelle1.Close();
    

Anmelden zum Antworten