wxWidgets MySQL

 ( termih | 2012. március 16., péntek - 22:08 )

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ás megjelenítési lehetőségek

A választott hozzászólás megjelenítési mód a „Beállítás” gombbal rögzíthető.

Az altalad eloszor linkelt oldalon legyszives olvasd el a parameterek leirasat. Gondosan. Haromszor. Majd gyere vissza.
--
Ki oda vagyik, hol szall a galamb, elszalasztja a kincset itt alant. | Gentoo Portal


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.
--
Ki oda vagyik, hol szall a galamb, elszalasztja a kincset itt alant. | Gentoo Portal

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.
--
Ki oda vagyik, hol szall a galamb, elszalasztja a kincset itt alant. | Gentoo Portal

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...
--
Ki oda vagyik, hol szall a galamb, elszalasztja a kincset itt alant. | Gentoo Portal

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