Jegyzet
Az oldalhoz való hozzáférés engedélyezést igényel. Próbálhatod be jelentkezni vagy könyvtárat váltani.
Az oldalhoz való hozzáférés engedélyezést igényel. Megpróbálhatod a könyvtár váltását.
Az ODBC-alkalmazások igazítási problémái általában nem különböznek egymástól, mint bármely más alkalmazásban. Vagyis a legtöbb ODBC-alkalmazásnak kevés vagy semmilyen problémája van az igazítással. A címek nem igazításának büntetései a hardvertől és az operációs rendszertől függően változnak, és kisebbek lehetnek, mint egy enyhe teljesítménybírság, vagy súlyosak, mint egy halálos futásidejű hiba. Ezért az ODBC-alkalmazásoknak és különösen a hordozható ODBC-alkalmazásoknak óvatosnak kell lenniük az adatok megfelelő igazítása érdekében.
Az ODBC-alkalmazások például akkor tapasztalnak igazítási problémákat, ha nagy memóriablokkot foglalnak le, és a memória különböző részeit az eredményhalmaz oszlopaihoz kötik. Ez valószínűleg akkor fordul elő, ha egy általános alkalmazásnak meg kell határoznia az eredményhalmaz alakját futásidőben, és ennek megfelelően kell lefoglalnia és megkötnie a memóriát.
Tegyük fel például, hogy egy alkalmazás végrehajtja a felhasználó által megadott SELECT utasítást, és lekéri az eredményeket ebből az utasításból. Mivel az eredményhalmaz alakja nem ismert a program írásakor, az alkalmazásnak meg kell határoznia az egyes oszlopok típusát az eredményhalmaz létrehozása után, és ennek megfelelően kell kötnie a memóriát. Ennek legegyszerűbb módja egy nagy memóriablokk lefoglalása, és a blokk különböző címeinek kötése minden oszlophoz. Egy oszlop adatainak eléréséhez az alkalmazás az adott oszlophoz kötött memóriát öntötte le.
Az alábbi diagram egy mintaeredmény-készletet mutat be, és azt, hogy egy memóriablokk hogyan kötődhet hozzá az egyes SQL-adattípusok alapértelmezett C adattípusával. Minden "X" egyetlen bájtnyi memóriát jelöl. (Ez a példa csak az oszlopokhoz kötött adatpuffereket mutatja be. Ez az egyszerűség kedvéért történik. A tényleges kódban a hossz-/mutatópuffereket is igazítani kell.)
Feltételezve, hogy a kötött címek a Cím tömbben vannak tárolva, az alkalmazás az alábbi kifejezésekkel fér hozzá az egyes oszlopokhoz kötött memóriához:
(SQLCHAR *) Address[0]
(SQLSMALLINT *) Address[1]
(SQLINTEGER *) Address[2]
Figyelje meg, hogy a második és harmadik oszlophoz kötött címek páratlan számú bájton kezdődnek, és a harmadik oszlophoz kötött cím nem osztható négyel, ami egy SDWORD mérete. Egyes gépeken ez nem lesz probléma; más gépeken enyhe teljesítménycsökkenést fog okozni; megint másokon végzetes futásidejű hibát fog okozni. Jobb megoldás lenne az egyes kötött címek igazítása a természetes igazítási határhoz. Feltételezve, hogy ez egy UCHAR esetében 1, egy KARD esetében 2, az SDWORD esetében pedig 4, az alábbi ábrán látható eredményt adja, ahol az "X" a használt memória bájtját, az "O" pedig a fel nem használt memória bájtját jelöli.
Bár ez a megoldás nem használja az alkalmazás összes memóriáját, nem tapasztal igazítási problémákat. Sajnos a megoldás implementálásához megfelelő mennyiségű kód szükséges, mivel az egyes oszlopokat a típusuknak megfelelően kell egymáshoz igazítani. Egyszerűbb megoldás az összes oszlop igazítása a legnagyobb igazítási határ méretéhez, amely az alábbi ábrán látható példában 4.
Bár ez a megoldás nagyobb lyukakat hagy maga után, a implementálási kód viszonylag egyszerű és gyors. A legtöbb esetben ez ellensúlyozza a fel nem használt memóriában kifizetett büntetést. A metódust használó példáért tekintse meg az SQLBindCol használatát.