Zum Inhalt springen

DB mit ADO


bigpoint

Empfohlene Beiträge

Ich greife auf DB mit ADO:

// COM-Umgebung initialisieren

::CoInitialize(NULL);

try

{

// ADO Berechtigung CreateInstance von Connection

pConn.CreateInstance(__uuidof(Connection));

// ADO Berechtigung CreateInstance von Command

pCmd.CreateInstance(__uuidof(Command));

// Datensatzobjekt erzeugen von Recordset

m_pRs.CreateInstance(__uuidof(Recordset));

// Datensatzobjekt öffnen

pConn->Open(bstrConnection,L"sa",L"", adOpenUnspecified);

pCmd->ActiveConnection = pConn;

pCmd->CommandText = bstrCmdText;//“select *from irgendwas“

//m_pRs = pCmd->Execute();

m_pRs->PutRefSource(pCmd);

// NULL vom Typ Variant erzeugen

_variant_t vNull;

vNull.vt = VT_ERROR;

vNull.scode = DISP_E_PARAMNOTFOUND;

// Recordset öffnen

m_pRs->Open(vNull, vNull, adOpenDynamic, adLockOptimistic, adCmdUnknown);

// Zeiger auf Bindungsschnittstelle des Datensatzes holen

if (FAILED(m_pRs->QueryInterface(__uuidof(IADORecordBinding),(LPVOID *)&m_piAdoRecordBinding)))

_com_issue_error(E_NOINTERFACE);

// Datensatzklasse an Recordset binden

m_piAdoRecordBinding->BindToRecordset(&m_rsRecSet);

}

// Fehler vorhanden?

catch (_com_error &e)

{

// Fehler anzeigen

GenerateError(e.Error(), e.Description());

}

durch pCmd->CommandText = bstrCmdText;//“select *from irgendwas“ kann ich eine Tabelle auslesen und die Daten anzeigen, was mache ich aber wenn ich noch auf eine andere Tabelle zugreifen will muß ich noch ein Recordset und Command deklarieren oder wie geht’s kann mir jemand es beantworten oder mein Quellcod

anpassen

Vielen Dank

Link zu diesem Kommentar
Auf anderen Seiten teilen

Es ist eigentlich so, ich habe alles doppelt deklariert und es scheint zu funktionieren,

allerdings auf DB greife ich in der Methode OnNewDocument() zu wie oben gesehen.

Die Daten verende, bearbeite usw. in View wehre aber für mich logischer wenn man alles in View macht ??

Wenn ich zB ein SQL-Anweisung in View ausführen will muß ich zurück auf Dokument zugreifen Command Objekt holen usw. Da ist auch mein Problem denn wenn ich alles doppelt inizializie muß ich auch zwei zeiger auf Document initialisiere und ich weis nicht wie also einen Zeiger initialisiere ich so

// Zeiger auf die Variable der Datensatzklasse zurückgeben

CCustomRs* CTAKDoc::GetRecSet()

{

// Zeiger auf das Datensatzobjekt zurückgeben

return &m_rsRecSet;

}

aber was ist mit dem zweitem den so geht es leider nicht

// Zeiger auf die Variable der Datensatzklasse zurückgeben

CTestRs* CTAKDoc::GetRecSet()

{

// Zeiger auf das Datensatzobjekt zurückgeben

return &m_rstest;

}

Wie ist es normalerweise ????

Link zu diesem Kommentar
Auf anderen Seiten teilen

Originally posted by 007ski

aber was ist mit dem zweitem den so geht es leider nicht

:rolleyes:

Was heißt "so geht es leider nicht"?

Compilerfehler?

Laufzeitfehler?

Nicht das gewünschte Verhalten?

Bitte gewöhne dir doch an, bei Fehlern den vollständigen Fehlermeldungstext oder eine genaue Fehlerbeschreibung anzugeben. Umso besser kann dir geholfen werden.

Und bitte verwende die Code-Tags, damit man deinen Code besser lesen kann.

Ich vermute, dass der Compiler sich darüber beschwert, dass du in der Klasse CTAKDoc zweimal die Methode GetRecSet deklarierst, und die beiden sich nur im Rückgabetyp unterscheiden. Das ist nicht erlaubt. Gib einer der Methoden einen anderen Namen.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Sorry, natürlich möchte ich mich so gut wie möglich ausdrucken leider muß ich noch daran arbeiten genau so wie mit MFC, aber vielleicht irgendwann schaffe ich beides ;)

Ja es stimmt das der Compeiler hat problemme mit GetRecSet() die zwei mal in CTAKDoc deklariert wird.

Ich habe einfach einen anderen Namen vergeben und schon funk ;-)

Ich habe aber noch einen anderen Problem ( wie sollte es den anderes sein ).

Wo ich jetzt auf mehre Tabellen zugreifen kann und die Daten auslesen ist es so, dass ich auch mehrere SQL-Abfragen schreiben will und dann das Resultat haben.

Wo und wie muß ich die SQL-Abfragen aber schreiben ( am besten wehre es für mich es in View tun )

Bis jetzt tue ich es doch in Document

pCmd->CommandText = bstrCmdText;//“select *from irgendwas“ 

//m_pRs = pCmd->Execute();
m_pRs->PutRefSource(pCmd);

// NULL vom Typ Variant erzeugen
_variant_t vNull;
vNull.vt = VT_ERROR;
vNull.scode = DISP_E_PARAMNOTFOUND;

// Recordset öffnen
m_pRs->Open(vNull, vNull, adOpenDynamic, adLockOptimistic, adCmdUnknown);
[/PHP]

somit kriege ich doch alle Daten von irgendwas wie komme ich auf z.B.

“select kundeid from irgendwas where kundeid = 1“

normaler weise sollte ich als Ergebnis 1 kriegen.

Muss ich jedes mal neuen Command deklarieren und jedes mal

Recordset öffnen

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ich denke, du kannst einfach dem CommandText-Property des Command-Objekts ein anderes SQL-Statement zuweisen. Du musst aber darauf achten, dass die einzelnen Felder des Abfrageergebnisses auch auf das RecordSet-Objekt passen. Wenn du die Abfrage an ein Recordset bindest (BindToRecordset), und die Ergebnisfelder der Abfrage nicht auf die Membervariablen des Recordsets passen, wird das nicht funktionieren.

Originally posted by 007ski

“select kundeid from irgendwas where kundeid = 1“

Für diese Abfrage brauchst Du also ein Recordset, das genau eine Feldvariable enthält, deren Datentyp auf den Datentyp von kundeid passen muss.
Link zu diesem Kommentar
Auf anderen Seiten teilen

Ich Frage einfach noch mal wo sollte man auf db zugreifen in Document oder View ????

Ist es wirklich so, dass ich jedes mal ein neuen Command-Objekts, Recordset-Objekts, IADORecordBinding- Objekts deklarieren muß, was bedeutet wenn ich 100 Abfragen habe, muß ich ............... ;(

Ich habe doch nur eine Klasse wo mann auf Feldwerte zugreifen kann

class CCustomRs :

public CADORecordBinding

{

BEGIN_ADO_BINDING(CCustomRs)

ADO_FIXED_LENGTH_ENTRY(1, adInteger, m_lAddressID, lAddressIDStatus, TRUE)

ADO_FIXED_LENGTH_ENTRY(1, adInteger, m_ ifunktionID, lFunktionIDStatus, TRUE)

ADO_FIXED_LENGTH_ENTRY(3, adDate, m_dtBirthdate, lBirthdateStatus, TRUE)

ADO_FIXED_LENGTH_ENTRY(4, adBoolean, m_bSendCard, lSendCardStatus, TRUE)

END_ADO_BINDING()


public:

LONG m_lAddressID;

ULONG lAddressIDStatus;

CHAR m_szFirstName[51];

ULONG lFirstNameStatus;

DATE m_dtBirthdate;

ULONG lBirthdateStatus;

VARIANT_BOOL m_bSendCard;

ULONG lSendCardStatus;

}; 

und wenn ich schreibe in Document alles doppelt mit

“select addressid from irgendwas where addressid = 1“

und am ende

m_piAdoRecordBinding1->BindToRecordset(&m_rsBer);// m_rsBer zeiger auf CcustomRs

(wenn ich neue Abfrage schreibe die wieder auf CcustomRs sich bezieht sollte es so ausschauen: m_piAdoRecordBinding1->BindToRecordset(&m_rsBer);)

und dann im View

CCustomRs *  pcrs;
pcrs = GetDocument()->GetRecSet1();

int m_lAddressID;
int m_ifunktionID;
if(adFldOK == pberechtigung->lBenutzerIDStatus)
m_lAddressID = pcrs ->m_BenutzerID;
else
m_lAddressID = 0;

if(adFldOK == pberechtigung->lFunktionIDStatus)
m_ifunktionID = pcrs ->FunktionID;
else
m_ifunktionID = 0;
[/PHP]

dann kriege ich sowohl in m_lAddressID als m_ifunktionID Werte laut aber SQL Abfrage sollte nur was im m_lAddressID stehen, oder ?????

Link zu diesem Kommentar
Auf anderen Seiten teilen

Originally posted by 007ski

Ich Frage einfach noch mal wo sollte man auf db zugreifen in Document oder View ????

So, wie die Doc/Viewarchitektur gedacht ist, sollte sich die View um die Darstellung und die Dokumentklasse um die Datenhaltung kümmern. Dazu gehört auch die Interaktion mit einer Datenbank. Es zwingt dich aber niemand, dich daran zu halten. Wenn die "Dokumente" nicht geladen und gespeichert werden sollen, und es nur eine Art von View gibt, kannst du auch alles in der Viewklasse machen.

Ist es wirklich so, dass ich jedes mal ein neuen Command-Objekts, Recordset-Objekts, IADORecordBinding- Objekts deklarieren muß, was bedeutet wenn ich 100 Abfragen habe, muß ich ............... ;(
Wenn Du 100 unterschiedliche Abfragen hast (unterschiedlich in der Art und Anzahl der Felder des Abfrageergebnisses), dann brauchst Du 100 Recordset-Klassen. Die anderen Objekte kannst du ja problemlos erzeugen.

<snip>...dann kriege ich sowohl in m_lAddressID als m_ifunktionID Werte laut aber SQL Abfrage sollte nur was im m_lAddressID stehen, oder ?????
Schau dir die Implementierung dieser Recordset-Klasse doch an. Da stehen Anweisungen, wie insgesamt vier Felder an Variablen der Recordsetklasse gebunden werden. Wie soll diese Klasse funktionieren, wenn du eine Abfrage verwendest, die nur ein Feld liefert?

Die Anzahl und Reihenfolge der Einträge zwischen BEGIN_ADO_BINDING und END_ADO_BINDING müssen zu dem passen, was die Abfrage liefert.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Originally posted by Klotzkopp

und es nur eine Art von View gibt

warum nur eine Art (bei mir sind es zwei)

Originally posted by Klotzkopp

Die anderen Objekte kannst du ja problemlos erzeugen.

Wie, ich denke man muss alles bis auf Connection 100 mal deklarieren auch die klasse mit BEGIN_ADO_BINDING und END_ADO_BINDING ???

QUOTE]Originally posted by Klotzkopp

Schau dir die Implementierung dieser Recordset-Klasse doch an. Da stehen Anweisungen, wie insgesamt vier Felder an Variablen der Recordsetklasse gebunden werden. Wie soll diese Klasse funktionieren, wenn du eine Abfrage verwendest, die nur ein Feld liefert?

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...