ADO und SELECT
-
Hallo Leute,
mal wieder ne Frage von mir.
Ich habe eine Access Datenbank mit einer Tabelle namens Server und deren Inhalt, ID_Server und Servername.
Da ich gerne Objektorientiert schreiben möchte, möchte ich dieses in einem Objet namens Datenbank (CLASS) und einer Methode (Funktion) realisieren.
So jetzt weis ich nicht wo der Inhalt den ich aus der Datenbank auslese steht, und wie ich dann den Inhalt in eine Variable schreibe, bei mir in einen Vector, der die CLASS CServer beinhaltet....
So weit bin ich gekommen:
void CDatenbank::fSelectServer()
{
recordset->Open("SELECT ID_Server, Servername FROM Server;",
connection.GetInterfacePtr(),
ADODB::adOpenForwardOnly, ADODB::adLockReadOnly,
ADODB::adCmdText);
while(!recordset->ADOEOF)
{
_variant_t var;
var = recordset->Fields->GetItem(L"name")->GetValue();
CServer* pServer = new CServerstatic_caststd::string(_bstr_t(var.bstrVal)), this);
vServerliste.push_back(pServer);recordset->MoveNext();
};
recordset->Close();
}Kann mir jemand Helfen ??
Gruß und DAnke
andy_mann
-
Servus,
der Inhalt steht in:
_variant_t var; var = recordset->Fields->GetItem(L"name")->GetValue(); CServer* pServer = new CServerstatic_cast<std::string>(_bstr_t(var.bstrVal)), this); vServerliste.push_back(pServer);_variant_t var;
In deinem Variant "var" steht der Inhalt drin den liest du ja mit GetValue() aus. Wenn du mit dem Datentyp nicht zurecht kommst kannste ja auch CString verwenden:
CString str; ASSERT(var.vt == VT_BSTR); str = (var.vt == VT_BSTR) ? (LPCTSTR)var.bstrVal : "";Dann steht der Rotz in "str" vom Typ CString.
Verstehe aber jetzt nicht worauf du hinaus willst? Du hast doch die Daten in eine Variable geschrieben.
*winke*
Hellsgore
-
Ich Danke Dir,
wenn jetzt der Inhhalt vom Typ _variant_t im var steht, wie sieht der dann aus ??
Ich mache eine Select anweisung mit SELECT ID_Server, Servername....
wie steht jetzt der Inhalt in der Variable ??Es sind ja 2 Spalten und wird in einen String geschrieben ??
Inhalt1Inhalt2 ????Gruß
andy_mann
-
Ich glaube sogar das geht nicht. (Denke ich mal, erschlagt mich wenn es nicht stimmt)
aber wenn du ein SELECT ID_Server FROM Server machst, dann hast du ja nur die Spalte ID_Server in deinem Recordset stehen. Dann kannst du eigentlich garnicht auf die Spalte "Name" zugreifen.Wenn dann solltest du SELECT ID_Server, Servername, name FROM Server machen.
oder bei GetFieldValue(L"name") ist ein Tippfehler und sollte GetFieldValue(L"Servername") heißen.Wenn du ein GetFieldValue machst dann nimmt er den Wert von der Spalte "Servername" von der aktuellen Position des Recordsets. d.h. in var steht jetzt der erste Wert drin den du in der Spalte "name" drinstehen hast. Nach einem MoveNext() und dann wieder GetFieldValue wird der nächste Wert ausgelesen.
Möchtest du jetzt noch ID_Server haben dann muss du ein:
var = .....GetFieldValue("ID_Server");dann steht der Wert von der Spalte ID_Server in "var" drin. Nach einem MoveNext nimmt er das nächste Tubel und schreibt den zweiten Wert mit GetFieldValue in den Variant "var" hinein.
Ich hoffe das ist soweit verstanen *g*
*winke*
HellsgoreEDIT:
Um deine Frage besser zu beantworten noch ein Zusatz:
In deinem Recordset steht jetzt nicht "Wert1Wert2Wert3" drin sondern
Spalte1 Spalte2 Spalte3
Wert1 Wert1 Wert1
Wert2 Wert2 Wert2die Werte sprichst du halt mit:
var = recordset->GetFieldValue("Spalte2");an.
der Variant wird natürlich bei jedem neuen GetFieldValue überschrieben. Du machst ja mit dem Operand "=" eine Zuweisung.
-
Danke,
also dann so...
while(!recordset->ADOEOF)
{
_variant_t ID, NAME;
ID = recordset->Fields->GetItem(L"ID_Server")->GetValue();
NAME = recordset->Fields->GetItem(L"Servername")->GetValue();CServer* pServer = new CServer(ID, this);
vServerliste.push_back(pServer);recordset->MoveNext();
};Gruß
andy_mann
-
You take the point

Japp du hast er verstanden. Jetzt hast du schonmal die beiden Sachen in deinen Varianten (ist das die Mehrzahl?) drin stehen. Damit kannst du dann weiter arbeiten.
Zwar weiss ich zwar noch nicht ganz was du damit:
CServer* pServer = new CServer(ID, this); vServerliste.push_back(pServer);vor hast, aber das war ja nicht deine Frage.

Viel Spass noch...
*winke*
Hellsgore
-
Hhhmmmmmm...
-
Mhmm
Schuß ins blaue.....static_cast<std::string>(_bstr_t(var.bstrVal));musste mal testen.
*winke*
Hellsgore
-
irgendwie scheint da noch was nicht zu stimmen.....
hier der code...
void CServerliste::SchreibeServerAusDatenbank()
{
CDatenbank Datenbank;
Datenbank.fDatenbankOeffnen();while(!Datenbank.fSelectServer()->ADOEOF)
{
_variant_t ID, NAME;
ID = Datenbank.fSelectServer()->Fields->GetItem(L"ID_Server")->GetValue();
NAME = Datenbank.fSelectServer()->Fields->GetItem(L"Servername")->GetValue();CServer* pServer = new CServer(static_caststd::string(_bstr_t(ID.bstrVal)), static_caststd::string(_bstr_t(NAME.bstrVal)), this);
vServerliste.push_back(pServer);*/Datenbank.fSelectServer()->MoveNext();
};
Datenbank.fSelectServer()->Close();
Datenbank.fDatenbankSchliessen();
}keine Fehlermeldung, aber es knallt....
Hat jemand ne Idee ??
Gruß
andy_mann
-
Hat den keiner ne Idee ??
Gruß
andy_mann
-
Hhhmmmmm, noch was..
ich hole mir die Variable aus der Datenbank mit:
_variant_t ID;
ID = recordset->Fields->GetItem(L"ID_Server")->GetValue();ID ist allerdings eine Zahl und soll auch eine bleiben...
wie konvertiere ich jetzt dies ??
Gruß
andy_mann