Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
Ez a témakör az MFC ODBC-osztályokra vonatkozik.
A rekordhalmazok a tervezéskor megadott kötéstáblák oszlopait kezelik, de előfordulhatnak olyan esetek, amikor olyan oszlopokat szeretne kötni, amelyek a tervezéskor ismeretlenek voltak. Ez a témakör a következőt ismerteti:
Megjegyzés:
Ez a témakör azokra az objektumokra vonatkozik, amelyekből a CRecordset tömeges sorlehívás nem lett megvalósítva. Az általánosan ismertetett technikák nem ajánlottak, ha tömeges sorlehívást használ. A tömeges sorbeolvasásról további információt a Recordset: Tömeges rekord beolvasás (ODBC) című témakörben talál.
Ha dinamikusan köti össze az oszlopokat
Megjegyzés:
Az MFC ODBC Consumer varázsló nem érhető el a Visual Studio 2019-ben és újabb verzióiban. Továbbra is létrehozhat egy fogyasztót manuálisan.
Tervezéskor az MFC Application Wizard vagy az MFC ODBC Fogyasztó varázsló (Osztály hozzáadása) az adatforrás ismert táblái és oszlopai alapján hozza létre a rekordhalmaz-osztályokat. Az adatbázisok a tervezésükkor és később is változhatnak, amikor az alkalmazás futtatáskor használja ezeket a táblákat és oszlopokat. Ön vagy egy másik felhasználó hozzáadhat vagy elvethet egy táblát, vagy hozzáadhat vagy elvethet oszlopokat egy olyan táblából, amelyre az alkalmazás rekordhalmaza támaszkodik. Ez valószínűleg nem minden adatelérési alkalmazásra vonatkozik, de ha az Öné, hogyan kezelheti az adatbázisséma változásait az újratervezésen és újrafordításon kívül? A témakör célja, hogy megválaszolja ezt a kérdést.
Ez a témakör azt a leggyakoribb esetet ismerteti, amelyben dinamikusan köthet oszlopokat – miután egy ismert adatbázisséma alapján létrehozott rekordkészletet kezelt, futtatási időben kell a további oszlopokat kezelnie. A témakör azt is feltételezi, hogy a további oszlopok mezőadat-tagokhoz CString vannak rendelve, ez a leggyakoribb eset, bár a javaslatok segítenek más adattípusok kezelésében.
Kis mennyiségű extra kóddal a következőt teheti:
A rekordhalmaz továbbra is tartalmazza azoknak az oszlopoknak az adatmezőit, amelyekről a tervezéskor tudott. Emellett tartalmaz egy kis mennyiségű extra kódot is, amely dinamikusan meghatározza, hogy új oszlopok lettek-e hozzáadva a céltáblához, és ha igen, ezeket az új oszlopokat dinamikusan lefoglalt tárolóhoz köti (nem pedig adathalmaz-tagokhoz).
Ez a témakör nem terjed ki más dinamikus kötési esetekre, például elvetett táblákra vagy oszlopokra. Ezekben az esetekben az ODBC API-hívásokat közvetlenül kell használnia. További információkért tekintse meg az ODBC programozójának referenciáját.
Oszlopok dinamikus kötése
Az oszlopok dinamikus kötéséhez ismernie kell (vagy meg kell tudnia határozni) a további oszlopok nevét. A további mezőadat-tagok számára is ki kell osztania a tárterületet, meg kell adnia a nevüket és a típusukat, valamint meg kell adnia a hozzáadni kívánt oszlopok számát.
Az alábbi vitafórum két különböző rekordhalmazt említ. Az első a fő rekordkészlet, amely a céltáblából választja ki a rekordokat. A második egy speciális oszloprekordkészlet, amely a céltáblában lévő oszlopokra vonatkozó információk lekérésére szolgál.
Általános folyamat
A legáttekintőbb szinten az alábbi lépéseket kell követnie:
Hozza létre a fő rekordhalmaz-objektumot.
Megadhat egy mutatót egy nyitott
CDatabaseobjektumnak, vagy más módon is megadhatja a kapcsolati adatokat az oszloprekordkészletnek.Hajtsa végre az oszlopok dinamikus hozzáadásának lépéseit.
Tekintse meg az alábbi Oszlopok hozzáadása című témakört.
Nyissa meg a fő rekordhalmazt.
A rekordhalmaz kijelöli a rekordokat, és a rekordmezőcsere (RFX) használatával köti össze a statikus oszlopokat (amelyek a rekordhalmaz mező adattagjaihoz vannak rendelve) és a dinamikus oszlopokat (a lefoglalt extra tárterületre van leképezve).
Oszlopok hozzáadása
A hozzáadott oszlopok futásidőben történő dinamikus kötéséhez a következő lépések szükségesek:
Határozza meg futásidőben, hogy mely oszlopok találhatók a céltáblában. Ebből az információból kinyerhet egy listát azokról az oszlopokról, amelyeket a rekordkészlet osztály tervezése óta hozzáadtak a táblához.
Jó módszer egy olyan oszloprekordkészlet-osztály használata, amely a céltábla oszlopadatainak (például oszlopnévnek és adattípusnak) az adatforrás lekérdezésére szolgál.
Tárterület biztosítása az új mezőadat tagok számára. Mivel a fő rekordhalmaz-osztály nem rendelkezik ismeretlen oszlopok mezőadat-tagjaival, meg kell adnia egy helyet a nevek, az eredményértékek és esetleg az adattípus adatainak tárolására (ha az oszlopok különböző adattípusok).
Az egyik módszer egy vagy több dinamikus lista létrehozása, az egyik az új oszlopok nevének, egy másik az eredményértéküknek, a harmadik pedig az adattípusoknak (ha szükséges). Ezek a listák, különösen az értéklista, biztosítják az információkat és a kötéshez szükséges tárolót. Az alábbi ábra a listák összeállítását szemlélteti.
Oszlopok listáinak létrehozása dinamikus kötéshezAdjon hozzá egy RFX-függvényhívást a fő rekordhalmaz függvényéhez
DoFieldExchangeminden hozzáadott oszlophoz. Ezek az RFX-hívások egy rekord beolvasását végzik, beleértve a további oszlopokat is, és az oszlopokat az adathalmaz tagjaihoz vagy a dinamikusan megadott tárolóhoz kötik.Az egyik módszer az, hogy hozzáad egy hurkot a fő rekordhalmaz függvényéhez
DoFieldExchange, amely végighalad az új oszlopok listáján, és meghívja a megfelelő RFX függvényt a lista minden oszlopához. Minden RFX-hívásnál adjon át egy oszlopnevet az oszlopnévlistából, és egy tárolási helyet az eredményérték-lista megfelelő tagjában.
Oszlopok listája
A négy lista, amellyel dolgoznia kell, az alábbi táblázatban látható.
| Lista | Leírás |
|---|---|
| Aktuális táblaoszlopok | (1. lista az ábrán) Az adatforrás táblájában található oszlopok listája. Ez a lista megfelelhet a rekordhalmazban jelenleg kapcsolódó oszlopok listájának. |
| Kötött-adatkészlet-oszlopok | (2. lista az ábrán) Az adatállományban összekapcsolt oszlopok listája. Ezekben az oszlopokban már vannak RFX-utasítások a DoFieldExchange függvényben. |
| Dinamikusan köthető oszlopok | (A 3. lista az ábrán) A tábla oszlopainak listája, amelyek nincsenek benne a rekordhalmazban. Ezek azok az oszlopok, amelyeket dinamikusan szeretne kötni. |
| Dinamikus oszlopértékek | (A 4. lista az ábrán) A dinamikus kötésű oszlopokból lekért értékek tárterületét tartalmazó lista. Az elemek ebben a listában egy az egyben megfelelnek a Dinamikusan-Összekapcsolandó-Oszlopok oszlopainak. |
Listák létrehozása
Az általános stratégiát szem előtt tartva a részletekhez fordulhat. A témakör többi részében ismertetett eljárások bemutatják, hogyan hozhatja létre az oszlopok listájában látható listákat. Az eljárások végigvezetik a következőkön:
A rekordhalmazban nem szereplő oszlopok nevének meghatározása.
Dinamikus tárolás biztosítása a táblához újonnan hozzáadott oszlopokhoz.
Annak meghatározása, hogy mely táblaoszlopok nincsenek a rekordhalmazban
Hozzon létre egy listát (Bound-Recordset-Columns, mint az ábrán a 2. listában), amely tartalmazza a fő rekordhalmazban már kötött oszlopok listáját. Ezután hozzon létre egy listát (Columns-to-Bind-Dynamically, from Current-Table-Columns and Bound-Recordset-Columns), amely az adatforrás táblájában szereplő, de a fő rekordhalmazban nem szereplő oszlopneveket tartalmazza.
A rekordhalmazban nem szereplő oszlopok nevének meghatározása (Oszlopokhoz:Bind-Dynamically)
Készítsen listát (Bound-Recordset-Columns) a fő rekordhalmazban már kötött oszlopokról.
Az egyik módszer a Kötött-Recordset-Columns létrehozása a tervezési időben. Ezeknek a neveknek a lekéréséhez vizuálisan megvizsgálhatja a rekordhalmaz függvényében
DoFieldExchangetalálható RFX-függvényhívásokat. Ezután állítsa be a listát a névvel inicializált tömbként.Az ábrán például három elemből álló Bound-Recordset-Columns (2. lista) látható. A Bound-Recordset-Columns-ból hiányzik a Telefon oszlop, amely látható az Aktuális-Table-Columns (1. lista) mezőben.
Hasonlítsa össze az Aktuális-Table-Columns-t és a Bound-Recordset-Columns-et, hogy összeállítson egy (Hasábok-Bind-Dynamically) listát azokról az oszlopokról, amelyek még nincsenek kötve a fő rekordhalmazában.
Az egyik módszer az, hogy futtatáskor végighalad a táblázat oszloplistáján (Current-Table-Columns) és a rekordhalmazban már kötött oszlopok listáján (Bound-Recordset-Columns) párhuzamosan. A Hasábok-Bind-Dynamically oszlopba helyezze el azokat a neveket a Jelenlegi-Table-Columns oszlopból, amelyek nem jelennek meg a Bound-Recordset-Columns oszlopban.
Az ábra például aBind-Dynamically-t (3. lista) mutatja be, amely egyetlen elemet, a Telefon oszlopot tartalmazza, amely aTable-Columns (1. lista) szerepel, de aRecordset-Columns (2. lista) nem.
Hozzon létre egy dinamikusColumn-Values listát (az ábrán látható 4. listához hasonlóan), amelyben tárolhatja az adatértékeket, amelyek az oszlopok listájában tárolt egyes oszlopnevekhez tartoznak a dinamikus hozzárendeléshez (oszlopok a következőhöz:Bind-Dynamically).
A lista elemei az új rekordhalmaz-mező adattagjainak szerepét töltik be. Ezek azok a tárolási helyek, amelyekhez a dinamikus oszlopok vannak kötve. A listák leírását az Oszloplisták című témakörben talál.
Tárhely biztosítása az új oszlopokhoz
Ezután állítsa be a dinamikusan kötött oszlopok tárolási helyét. Az ötlet egy listaelem megadása, amelyben az egyes oszlopok értékei tárolhatók. Ezek a tárolóhelyek párhuzamosak a rekordhalmaz tagváltozóival, amelyek a normál kötésű oszlopokat tárolják.
Dinamikus tárterület biztosítása új oszlopokhoz (Dynamic-Column-Values)
Dinamikus oszlop-értékeket hozhat létre, párhuzamosan a Hasábok–Kötés–Dinamikus értékekkel, hogy az egyes oszlopokban lévő adatok értékét tartalmazza.
Az ábrán például a Dynamic-Column-Values (4. lista) látható egyetlen elem: egy
CStringobjektum, amely az aktuális rekord tényleges telefonszámát tartalmazza: "555-1212".A leggyakoribb esetben a Dynamic-Column-Values típuselemekkel
CStringrendelkezik. Ha különböző adattípusú oszlopokkal foglalkozik, szüksége van egy listára, amely különböző típusú elemeket tartalmazhat.
Az előző eljárások eredménye két fő lista: Az oszlopok nevét tartalmazó Oszlopok-Bind-Dynamically és a Dinamikus-Column-Values, amelyek az aktuális rekord oszlopaiban lévő értékeket tartalmazzák.
Jótanács
Ha az új oszlopok nem azonos adattípusúak, érdemes lehet egy további párhuzamos lista, amely az oszloplista egyes elemeinek típusát valahogy definiáló elemeket tartalmaz. (Ha szeretné, használhatja a AFX_RFX_BOOL, AFX_RFX_BYTE stb. értékeket. Ezek az állandók az AFXDB.H-ban vannak definiálva.) Válasszon egy listatípust az oszlop adattípusainak ábrázolása alapján.
RFX-hívások hozzáadása az oszlopok összekapcsolásához
Végül rendezze el a dinamikus kötést úgy, hogy RFX-hívásokat indít a függvény új oszlopaihoz DoFieldExchange .
RfX-hívások dinamikus hozzáadása új oszlopokhoz
- A fő rekordhalmazának
DoFieldExchangetagfüggvényében adjon hozzá kódot, amely végighalad az új oszlopok listáján (oszlopok a következőhöz:Bind-Dynamically). Minden ciklusban nyerjen ki egy oszlopnevet a "Columns-to-Bind-Dynamically" listáról, és az oszlop eredményértékét a Dynamic-Column-Values értéktárból. Adja át ezeket az elemeket az oszlop adattípusának megfelelő RFX-függvényhívásnak. A listák leírását az Oszloplisták című témakörben talál.
A szokásos esetben a RFX_Text függvényhívásokban a listákból kinyeri a CString objektumokat, ahogy a következő kódsorokban: az Oszlopok-Bind-Dynamically egy CStringList nevű m_listName, és a Dinamikus-Column-Values egy CStringList nevű m_listValue.
RFX_Text( pFX,
m_listName.GetNext( posName ),
m_listValue.GetNext( posValue ));
Az RFX-függvényekkel kapcsolatos további információkért tekintse meg a makrókat és a globálisakat az osztálytár referenciájában.
Jótanács
Ha az új oszlopok különböző adattípusok, a ciklusban egy kapcsolóutasítással hívja meg az egyes típusokhoz megfelelő RFX-függvényt.
Amikor a keretrendszer a folyamat során meghívja DoFieldExchange az Open oszlopokat a rekordhalmazhoz való kötésre, a statikus oszlopok RFX-hívásai kötik ezeket az oszlopokat. Ezután a hurok ismételten meghívja az RFX-függvényeket a dinamikus oszlopokhoz.
Lásd még
Rekordhalmaz (ODBC)
Rekordhalmaz: Nagyméretű adatelemek használata (ODBC)