Problem mit CRecordset
-
Hallo,
ich habe mal ne Frage zum CRecordset. Ich möchte den CRecordset außerhalb von daten_einlesen deklarieren, nicht wie unten innerhalb, da ich die SQL Anweisung nur einmal aufrufen möchte. (sonst müsste ich mit Insert für jede einzelne IDRaster separat aufrufen, was wesendlich länger dauert.) Bei CDatabase db gibt es keinerlei Probleme, aber mit dem CRecordset bekomme ich es einfach nicht hin. Freue mich über Hinweise!!Lg Stephan
int daten::daten_einlesen() { CString sql; CString wert; CRecordset rs(&db); // Einladen der Bodenabtragsdaten if ( !rs.IsOpen()) { //Recordset öffnen sql ="SELECT * FROM tblprobe ORDER BY IDRaster;"; rs.Open( -1, sql ); rs.MoveFirst(); } else { rs.MoveNext(); }; //einlesen der Daten; rs.GetFieldValue(_T("IDRaster"), wert); tmpIDRaster = atoi(wert); rs.GetFieldValue(_T("Wert01"), wert); Wert_01 = atof(wert); rs.GetFieldValue(_T("Wert02"), wert); Wert_02 = atof(wert); }; };
Edit: Bitte lies sfds, ich habe es mal nachgebessert.
-
Du musst das Recordset eigentlich nur im Header deklarieren.
Hast du das so versucht? Was gab es für Probleme?Funktioniert es denn so, wie du es jetzt hast?
Weil eigentlich macht man eine eigene von CRecordset abgeleitete Klasse und nimmt nicht die allgemeine.Was mir allerdings aufgefallen ist:
Du hast da ein Semikolon hinter einer } und ganz unten ist auch was zu viel.
Ist das im Original auch so?
Weil so ist das falsch.Das Semikolon hinter der else läßt vermuten, dass du von Turbo Pascal kommst?
-
Der Header ist drin. CRecordset funktioniert prima, wenn ich CRecordset innerhalb der Funktion deklariere. Ich möchte aber CRecordset in der Klasse deklarieren, damit ich CRecordset in der gesamten Klasse nutzen kann.
Bei CDatabase funktioniert super. Ich deklariere CDatabase db; global und kann in einer Funktion die Verbindung mit
db.OpenEx( "DSN=odbc_probe;UID=xxx;PW=xxx",0
erzeugen... und in allen anderen Funktionen dieser Klasse darauf zugreifen. Bei CRecordset funktioniert das leider nur in der Klasse..
mmm… das ; war zu viel
-
Dann mach es doch in die Klasse.
Zeig doch bitte mal, was du mit global meinst. Ich fürchte, du machst da was, was ungefähr so gerne gesehen ist wie ein GOTO.
-
Das geht super… aber für CRecordset geht es so nicht....
//daten_einlesen.h #define DATEN_EINGEBEN_H 1 #include "afxdb.h" using namespace std; class daten_einlesen { public: // Deklaration der Datenbank- Verbindung CDatabase db; . . . //Datenbankverbindung öffnen int verbinden_db(); }
//daten_eingeben.cpp //Datenbankverbindung öffnen int daten_einlesen::verbinden_db() { int tmpval; db.OpenEx( "DSN=odbc_probe;UID=xxx;PW=xx",0 ); tmpval = db.IsOpen(); if(tmpval==1){return 0;} else{return 100;}; }
-
Komisch, so mache ich das immer.
3 Sachen:
1. Hast du grob verstanden, was ich mit abgeleiteten Klassen meinte?
2. Verwende bitte Code-Tags (der Knopf mit C/C++ drauf) sonst kann man deinen Code sehr schlecht lesen und hat keine Lust, sich mit deinem Problem zu beschäftigen.
3. Beschreibe "geht nicht".
-
das mit dem CRecordset geht nicht…
erkläre es bitte... mit der abgeleiteten Klasse.danke für den Hinweis mit dem Code!!
//daten_eingeben.h #define DATEN_EINGEBEN_H 1 #include "afxdb.h" using namespace std; class daten_einlesen { public: // Deklaration der Datenbank- Verbindung CDatabase db; CRecordset rs; . . . int recordset_oeffnen(); int verbinden_db(); }
//daten_eingeben.cpp //Datenbankverbindung öffnen int daten_einlesen::recordset_oeffnen() { //Recordset öffnen sql ="SELECT * FROM tblprobe"; rs.Open( -1, sql );} if ( !rs.IsOpen()){ // Fehler return 100;} return 0; } //Datenbankverbindung öffnen int daten_einlesen::verbinden_db() { int tmpval; db.OpenEx( "DSN=odbc_probe;UID=xxx;PW=xx",0 ); tmpval = db.IsOpen(); if(tmpval==1){return 0;} else{return 100;}; rs(&db); }
-
Lies mal:
http://download.pearsoned.de/leseecke/VCPLUS6_21Tg/data/start.htm Kapitel 14
Das kratzt zwar nur an der Oberfläche, aber du hast hinterher eine grobe Ahnung, wie das alles funktioniert.Ah, ich ahne, was du mit geht nicht meinst...
Das Problem, die Datenbank nachträglich zu setzen gab es hier neulich schon mal. Vielleicht finde ich es ja wieder.
Da isses, habs aber nicht nochmal komplett gelesen. http://www.c-plusplus.net/forum/viewtopic-var-t-is-111894.html
-
Moin also ich mach das so:
CDatabase db; CString strSQL_Tests = STRSQL_TESTS + Bedingung; db.Open( _T("ACR"),FALSE,true,_T("ODBC;UID=anyusr;PWD=anyusr"),false); CRecordset Set(&db);
So und jetzt kann ich je nach dem wo ich es deklariert habe schreiben Set.BlaBla Bei mir ist es in ner Funktion, weil nur die diesen Recordset nutzt und nutzen soll! du kannst aber denke ich genau so vorgehen wenn du es etwas globaler machst.
-
Ich habe schon einmal bei deiner Frage nachgeschaut (Polofreak) und jetzt mache ich es so:
db.OpenEx( "DSN=odbc;UID=xxx;PW=xxx",0 ); CRecordset rs(&db); rs.m_pDatabase = &db; sql ="SELECT * FROM tblprobe ORDER BY IDRaster;"; rs.Open( -1, sql );
irgendwie funktioniert es, ich weiß zwar nicht so richtig warum, aber es geht.
für was steht den das ACR???
[cpp]
db.Open( _T("ACR"),FALSE,true,_T("ODBC;UID=anyusr;PWD=anyusr"),false);
[/pp]Danke für eure Mühe!!!!
-
virtual BOOL Open( LPCTSTR lpszDSN, BOOL bExclusive = FALSE, BOOL bReadOnly = FALSE, LPCTSTR lpszConnect = “ODBC;”, BOOL bUseCursorLib = TRUE );
Schau doch mal in die MSDN. Ist da schön erklärt.
-
wenn du Estartus und meinen letzten Post zusammen nimmst dann ergibt sich DSN = ACR ist nur der Name der DSN welche dann den ODBC Treiber stellt. ACR ist hier eine Maschine für die ich das Programm entwickelt hab ein Unix-Mensch hätte vermutlich an dieser stelle foo eingesetzt
-
Polofreak schrieb:
[...]ein Unix-Mensch hätte vermutlich an dieser stelle foo eingesetzt
Naja, sinnvoll sollten DSNs schon sein.
Wenn ich meine hier alle foo nennen würde, dann hätte ich schnell nen Knall.
-
wieso denn erstell sie alle dynamisch und lösch dann immer foo vor dem einrichten!
Dann bekommste halt Probleme wenn du zwei Programme startest aber egal wer arbeitet schon mit mehr als einem Fenster
-
Polofreak schrieb:
[..]wer arbeitet schon mit mehr als einem Fenster
DER war gut.