SDI + Datenbank
-
Hallo,
ich habe eine SDI Anwendung mit Datenbankunterstützung (DB Access) und zusätzlich habe ich noch ein Dialogfeld mit eigener Klasse erstellt, wo ich
die Daten der Datenbank abrufen bzw eingeben möchte. Wie kann ich jetzt von meiner Dialogfeldklasse auf die die Daten der Recordset Klasse (wo sich ja die Membervariablen meiner Access DB befinden) zugreifen.
Ich habe inder FAQ nichts passendes gefunden.
Habe es zur Probe auf einen ein Klick Ereignis gelegt das mir bei Klick eine
MessageBox mit den Daten ausgegeben soll, die MessageBox kommt auch aber es steht nichts drin.
Bin für jede Hilfe dankbar!MfG
void CDatenbankDlg::OnBnew()
{
CKundendatenbankSet *pSet = new CKundendatenbankSet;
m_strAnschrift = pSet->m_Anschrift;
MessageBox(m_strAnschrift);
UpdateData(FALSE);
}
-
Hi,
in deiner MessageBox kann nichts erscheinen, weil deine Variable noch gar nicht gefuellt ist.pSet->Open(); // DbConnect oeffnen while(!pSet->IsEOF()) // Datenbank in einer Schleife auslesen { m_strAnschrift += pSet->m_Anschrift; // CString m_strAnschrift fuellen m_strAnschrift += "\n"; // Zeilenumbruch hinzufuegen m_recFhzSet.MoveNext(); // Zum naechsten Recordset rutschen } pSet->Close(); // Datenbank schliessen
pSet->Open() oeffnet nicht nur den Connect zur DB, sondern setzt auch einen Zeiger aufs erste Recordset. Wenn du nur einen Teil der Daten auslesen willst, kannst du vor dem CRecordset::Open() noch einen Filter setzen ueber CRecordset::m_strFilter. In deinem Fall z.B.
pSet->m_strFilter = "id = 2" oder irgendsowas. In diesem Fall wuerden dir alle Datensaetze in der Schleife in deine Variable gelesen, deren id 2 ist.Gruesse
Ralf
-
Hallo Ralf,
mit dem Code compiliert er zwar fehlerfrei, aber sobald ich den Button drücke hängt sich das Programm auf und nichts geht mehr?!
MfG
-
-
Hi,
komisch. Kann ich jetzt nicht sagen, woran es haengt. Die Schleife ist auf jeden Fall wichtig, weil du ja unter Umstaenden mehrere Records auslesen willst. Ich kann an dieser Schleife auch keinen Fehler entdecken (aber vielleicht ja jemand anders).
Entsteht die Endlosschleife vielleicht irgendwo anders? Probiere doch mal mit dem Debugger den Fehler zu finden. Zwar funzt das Ganze ohne Schleife, aber eben nur mit einem Record und das ist natuerlich auf Dauer witzlos.Gruess
Ralf
-
-
[cpp]
while(!pSet->IsEOF()) // Datenbank in einer Schleife auslesen
{
m_strAnschrift += pSet->m_Anschrift; // CString m_strAnschrift fuellen
m_strAnschrift += "\n"; // Zeilenumbruch hinzufuegen
m_recFhzSet.MoveNext(); // Zum naechsten Recordset rutschen
}[/cpp]pSet und m_recFhzSet sind ja auch zwei verschiedene Recordsets. Man sollte sich schon für eins entscheiden.
-
Hi,
woher kommt der m_recFhzSet Recordset bzw wo finde ich das erklärt?
MfG
-
Hi,
ich habe die Anwendung so weit das ich in OnInitDialog() den ersten Datensatz anzeigen lassen, meine pSet Zeiger habe ich in OnInitDialog() angelegt und nun kann ich aber nur da auf ihn zugreifen. Ich möchte jetzt einen Button "Next" einfügen und da brauche ich ja wieder pSet, aber wenn ich ihn als Membervariable einfüge lässt sich die Anwendung zwar ausführen, aber sobald ich den Button klicke kommt ein Fehler.
Was mache ich falsch??
Bin für jeden Tip dankbar!MfG
BOOL CDatenbankDlg::OnInitDialog()
{
CDialog::OnInitDialog();CKundendatenbankSet *pSet = new CKundendatenbankSet;
pSet->Open();
m_strName += pSet->m_Name;
m_strVorname += pSet->m_Vorname;
m_strAnschrift += pSet->m_Anschrift;
m_strOrt += pSet->m_Wohnort;pSet->Close(); // Datenbank schliessen
UpdateData(FALSE);
return TRUE;
}
-
Hi Triplleh,
ich bin mir zwar nicht ganz sicher, aber könnte es nicht sein, dass bei
new CKundendatenbankSet**()**;
diese Klammern hingehören?
Grüße Fuxi
-
Hi,
Probiere mal das ganze nicht in InitDialog() abzufackeln, sondern schreibe dafuer eine zusaetzliche Mothode. Die Methode OnInitDialog() wird imho naemlich nur beim Bau des Dialogs aufgerufen. Wenn du jetzt auf next klickst und damit erneut OnInitDialog() aufrufst, crasht das natuerlichEin weiteres Problem koennte auftauchen, wenn du deinen Dialog ueber DoModal() aufrufst. Zumindest auf die Doc - Klasse und ihre Variablen kann man in diesem Fall naemlich nicht mehr zugreifen und deshalb vermute ich auch, ist das Dingens mit der Schleife gescheitert.
Gruesse
Ralf
-
Hi,
das löst mein Problem leider auch nicht, ich muß ja den Zeiger so deklarieren da ich aus der geamten Klasse auf ihn zugreifen kann und zur Zeit kann ich das nur in OnInitDialog. Alles was ich bis jetzt versucht bringt nur Fehler.
Kann mir jemand helfen, Code steht ein Stück höher?!
Wäre euch sehr dankbar.MfG
-
Hi Ralf,
ich will ja in OnInitDialog nur den ersten Datensatz aufrufen denn Rest will ich dann im OnKlick Ereignis des jeweiligen Button abhandeln.
Oder geht das nicht, mein Dialog ruf ich mit DoModal auf, vielleicht hast Du
ja ein kleines Beispiel, wäre super!?MfG
-
Hi,
Sorry, hat ein bisschen gedauert mit der Antwort. Netscape hat mir deinen Beitrag nicht angezeigt und deshalb habe ich gar nicht mitbekommen, dass du nochmal geschrieben hattest.Versuche dein Fenster mal als nicht-modales Fenster zu oeffnen.
DlgKlasse.Create(IDD_DEINDIALOG);
DlgKlasse.ShowWindow(SW_SHOW);(Ist allerdings ungetestet)
Gruesse
Ralf
-
Hallo Ralf,
Also ich habe es so hinbekommen.
CDatenbankDlg* pDialog = new CDatenbankDlg;
pDialog->Create(IDD_DATENBANK);
pDialog->ShowWindow(SW_SHOW);Jetzt zeige ich Dir mal den anderen Code dann kann ich besser
erklären wie ich mir das vorstelle.BOOL CDatenbankDlg::OnInitDialog()
{
CDialog::OnInitDialog();CKundendatenbankSet *pSet = new CKundendatenbankSet;<-Das ist das Problem
pSet->Open();
m_strName += pSet->m_Name;
m_strVorname += pSet->m_Vorname;
m_strAnschrift += pSet->m_Anschrift;
m_strOrt += pSet->m_Wohnort;
m_strTelefon += pSet->m_Telefon;
pSet->Close();
UpdateData(FALSE);
return TRUE;
}void CDatenbankDlg::OnBnext()
{
// Bei Klick so nächster Datensatz angezeigt werden
}So in OnInitDialog will ich nur beim Start den ersten Datensatz
anzeigen lassen, was auch funktioniert, aber nun will ich beim
Klick auf next den nächsten Datensatz anzeigen lassen und da liegt
mein Problem da ich pSet in OnInitDialog anlege habe ich in OnNext
keinen Zugriff mehr auf den Zeiger und wenn ich ihn als Membervariable
einfüge bekomme ich nur Speicherfehler, ich weiß nicht wo ich ihn
anlegen soll bzw was ich falsch mache.MfG
-
Hi,
der Code unten macht genau das was du willst. Musst du dann nur noch ein bisschen auf deine Variablen anpassenEinen Zeiger auf deine RecordSet Klasse anzulegen sollte eigentlich kein Problem sein.
Am besten als Membervariable in deiner Dialog Klasse.
1. Membervariable initialisieren
CDatenbankDlg* pDialog;2. Im Konstruktor deines Dialogs
CDatenbankDlg* pDialog = new CDatenbankDlg;Sollte dann eigentlich keine Problem geben in der Funktion ueber
pDialog->... drauf zuzugreifen.void CAdresseDlg::OnNaechsterDS() { // TODO: Code für die Behandlungsroutine der Steuerelement-Benachrichtigung hier einfügen // DS-Filter setzen m_adresseSet.m_strFilter = "Person.ID = Ort.ID"; // Datensatzmenge öffnen m_adresseSet.Open(); // Datensatzmenge leer? if(!m_adresseSet.IsEOF()) { // zum angezeigten DS gehen for(int i=0;i<m_iDSNummer;i++) { if(!m_adresseSet.IsEOF()) // zum letzten DS gehen m_adresseSet.MoveNext(); else m_NaechsterDS.EnableWindow(FALSE); } // Membervariabeln mit dem Datensatz verbinden m_ID = m_adresseSet.m_ID; m_Vorname = m_adresseSet.m_Vorname; m_Name = m_adresseSet.m_Name; m_Strasse = m_adresseSet.m_Stra_e; m_PLZ = m_adresseSet.m_PLZ; m_Ortsname = m_adresseSet.m_Ortsname; // neue DSNummer merken m_iDSNummer++; } // Datensatzmenge schließen m_adresseSet.Close(); // Dialogfenster aktualisieren UpdateData(FALSE); }
Gruesse
Ralf