Egy MySQL adatbázisból szeretnék olvasni CPP nyelven, mivel
wxWidgets-et használok. Most éppen MinGW fordítóval és wxPack (stabil)
könyvtárakkal próbálok működő programot fordítani. A kapcsolatot
ODBC meghatón keresztül használom, ez eddig működik is (Tudom
például ellenőrizni, hogy egy tábla létezik van sem). Az eddigi kód:
wxDbConnectInf *DbConnectInf = NULL;
wxDb *db = NULL;
DbConnectInf = new wxDbConnectInf(NULL,
wxT("HelyiMySQL"),
wxT("root"),
wxT("titok"));
if (!DbConnectInf || !DbConnectInf->GetHenv())
wxMessageBox(wxT("Az ODBC kapcsolat nem elerheto"));
db = wxDbGetConnection(DbConnectInf);
if (!db)
wxMessageBox(wxT("Nem tudok kapcsolodni az adatbazishoz"));
A cél SQL lekérdezések lennének, de eredményt nem sikerül
kinyernem eddig. Az alábbi linken van a db objektumnak egy
GetData() metódusa, ez még működhet is. A dokumentáció szerint
http://docs.wxwidgets.org/stable/wx_wxdb.html#wxdbgetdata
Az értem, hogy így kellene használni:
db->GetData(1, SQL_C_ULONG, &reqQty, 0, &cb)
Az is értem, hogy a cb változóban kapom az eredményt.
Ez egy long típusú változó valójában. Hogy lesz nekem
ebből eredmény?
Egyébként alternatív megoldásként az is megfordult bennem,
hogy nem ODBC-vel próbálkozom, hanem az MySQL CPP Connectorával
próbálkozom. Ezért az alábbi megoldással próbálkoztam korábban:
http://jskarwal.web.officelive.com/MySQLCPP.aspx
A make parancs sikertelensége után azonban feladtam.
Gondolom világos a MinGW használatából, hogy
most elsősorban win-re kellene.
Más könyvtár is érdekelne, amivel esetleg elérhetem a MySQL
adatbázist. Ha valakinek valamelyikre útra tud megoldást,
kérem ne kíméljen, konkrét vagy rtfm segítséggel.
Hozzászólások
Az altalad eloszor linkelt oldalon legyszives olvasd el a parameterek leirasat. Gondosan. Haromszor. Majd gyere vissza.
--
wxString sql = wxT("SELECT * FROM szemely");
if (!db->ExecSql(sql.c_str()))
wxMessageBox(wxT("Gond a lekeres soran"));
char *realbuf;
if( db->GetNext() )
{
SDWORD cb;
char reqQty;
if(db->GetData(1, SQL_C_ULONG, &reqQty, 0, &cb))
wxMessageBox(wxT("Hiba"));
if (cb != SQL_NULL_DATA)
strncpy(realbuf, &reqQty, cb);
}
wxString mystring(realbuf, wxConvUTF8);
wxMessageBox(mystring);
No, éppen ezért írtam egy sql stringet.
Futtattam az ExecSql() metódust.
Futtattam a GetNext() metódust.
A GetData() metódussal megkapom az adat címét, a cb-ben
meg annak hosszát. Ezek után már csak
strncpy() a realbuf-ba másolom.
Eredmény azonban nincs.
---
http://szit.hu
Nem értem hogy miért charnak definiáltad a reqQty változót..
Mert a GetData meghívásnál már SQL_C_ULONG típust használsz.
cType: The C data type that is to be returned.
Erre probaltam felhivni a figyelmet, eredmenytelenul. Ha en linkeltem volna be, akkor kiemeltem volna, de gondoltam, hogy ha o linkelte be, akkor elolvasta.
--
Teljesen offtopik, irreleváns és szűklátókörő, de az első ami erről a snippetről eszembejutott: te jóságos atyaúristen, eszem-faszom eldobnám ha így kéne toszogatom az adatbázist! (Disclaimer: a szerző ActiveRecord-al toszogat adatbázisokat.)
Elnézést.
Nem kell elnezest kerned, ez mar szamomra is nagyon sajtreszelos.
--
Na akkor a sajtreszelés:
Van egy ilyen adattáblám:
CREATE TABLE IF NOT EXISTS `szemely` (
`az` int(11) NOT NULL AUTO_INCREMENT,
`nev` varchar(30) NOT NULL,
`telepules` varchar(30) NOT NULL,
`cim` varchar(30) NOT NULL,
`belepes` date NOT NULL,
PRIMARY KEY (`az`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=3 ;
INSERT INTO `szemely` (`az`, `nev`, `telepules`, `cim`, `belepes`) VALUES
(1, 'Nagy József', 'Szolnok', 'Tél u. 30', '2005-02-01'),
(2, 'Kék Imre', 'Miskolc', 'Nyár u. 33.', '2002-03-01');
Most már világosodik valami a paraméterekből, így áll elő a következő kód:
wxDbConnectInf *DbConnectInf = NULL;
wxDb *db = NULL;
DbConnectInf = new wxDbConnectInf(NULL,
wxT("HelyiMySQL"),
wxT("root"),
wxT(""));
if (!DbConnectInf || !DbConnectInf->GetHenv())
wxMessageBox(wxT("Az ODBC kapcsolat nem elerheto"));
db = wxDbGetConnection(DbConnectInf);
if (!db)
wxMessageBox(wxT("Nem tudok kapcsolodni az adatbazishoz"));
wxString sql = wxT("SELECT * FROM szemely");
if (!db->ExecSql(sql.c_str()))
wxMessageBox(wxT("Gond a lekeres soran"));
wxChar er[255];
while(db->GetNext())
{
SDWORD meret;
db->GetData(3, SQL_C_WXCHAR, &er, 0, &meret);
wxMessageBox(er);
}
A kód alapján a két településnevet kellene feldobnia egy ablakban.
Az ablak feljön kétszer, de csak kockák vannak. Ha van valakinek
meglátása ne sajnálja tőlem, hadd reszeljem tovább a sajtot!
---
http://szit.hu
Nem tudom hogy a GetData miután er-től rakosgatja a betűket (SQL_C_WXCHAR), akkor tesz-e lezáró nullát a végére vagy neked kell azt a meret szerint. Én mindenesetre megpróbálnám úgy, mert lehet hogy a kockák csak memória szemetek.
Szerk:
A helyedben pedig a GetData sikeresseget is ellenoriznem.
En meg a helyeben vagy direktben bizgatnam a MySQLdb-t, vagy SQLAlchemy-t hasznalnek. Ez mar igy nagyon nem eri meg...
--
Megoldva!
Ha megpróbáltam lezárni egy '\0' karakterrel az nem segített.
A probléma pedig csak az, hogy túl sokat olvasott GetData()
Most megadtam neki maximális 255-öt és így szépen működik.
Pedig úgy rémlik tegnap este ezzel is próbálkoztam, de akkor
ezek szerint nem így nézhetett ki a kód több része.
db->GetData(3, SQL_C_WXCHAR, &er, 255, &meret);
Answ-nek és a többieknek is köszönöm a válaszokat,
még a csesztetést is! Python is szeretem, de szerettem
volna ezt végigzongorázni. Esténként van ilyenre időm,
így lassan haladtam, de igyekszem. Lesz időm, a "sajtreszelés"
mellett, megnézem majd a MySQLdb-t és/vagy SQLAlchemy-t is.
Szép estét!
---
http://szit.hu