TN045: Podpora prostředí MFC a databáze pro typy Long Varchar/Varbinary
[!POZNÁMKA]
Následující technická poznámka nebyla aktualizována, protože byla poprvé zahrnuta v dokumentaci online.V důsledku toho některé postupy a témata mohou být nesprávné nebo zastaralé.Pro nejnovější informace je vhodné vyhledat téma zájmu v dokumentaci online index.
Tato poznámka popisuje, jak načíst a odeslat rozhraní ODBC SQL_LONGVARCHAR a SQL_LONGVARBINARY datové typy pomocí knihovny MFC databáze tříd.
Přehled podpory dlouhé Varchar/Varbinary.
Rozhraní ODBC SQL_LONG_VARCHAR a SQL_LONGBINARY datové typy (označována jako dlouhé sloupce dat) může obsahovat velké množství dat..Tato data lze zpracovávat 3 způsoby:
Bind it to a CString/CByteArray.
Vázat CLongBinary.
Není vůbec vázat a načíst a odeslat dlouhé hodnoty ručně, nezávisle na databázové třídy.
Každý ze tří metod má své výhody i nevýhody.
Dlouhé datové sloupce, které nejsou podporovány pro parametry dotazu.Jsou podporovány pouze pro outputColumns.
Sloupec dat Long vazbu CString CByteArray
Výhody:
Tento přístup je jednoduchý na pochopení a pracujete se třídami známých.Poskytuje v rámci CFormView podpory CString s DDX_Text.Máte hodně obecné funkce řetězec nebo kolekci se CString a CByteArray třídy a můžete určit množství paměti přidělené k uložení hodnot data.Rámci udržuje starou kopii pole dat při Úprava nebo AddNew volání funkce a framework může automaticky rozpoznat změny dat pro vás.
[!POZNÁMKA]
Od CString je navržen pro práci na textová data a CByteArray pro práci s binární data, je vhodné vložit znaková data (SQL_LONGVARCHAR) do CStringa s binárními daty (SQL_LONGVARBINARY) do CByteArray.
RFX funkce pro CString a CByteArray mít další argument, který umožňuje přepsat výchozí velikost přidělené paměti pro uchování získanou hodnotu ve sloupci data.Poznámka: nMaxLength argument do následující deklarace funkce:
void AFXAPI RFX_Text(CFieldExchange* pFX, const char *szName,
CString& value, int nMaxLength = 255, int nColumnType =
SQL_VARCHAR);
void AFXAPI RFX_Binary(CFieldExchange* pFX, const char *szName,
CByteArray& value,int nMaxLength = 255);
Pokud načíst do sloupce dat long CString nebo CByteArray, maximální vrácené množství dat je implicitně 255 bajtů.Cokoliv nad to bude ignorována.V tomto případě rozhraní framework vyvolá výjimku AFX_SQL_ERROR_DATA_TRUNCATED.Naštěstí můžete explicitně zvýšit nMaxLength větší hodnoty až MAXINT.
[!POZNÁMKA]
Hodnota nMaxLength knihovnou MFC slouží k nastavení místní vyrovnávací paměti SQLBindColumn funkce.To je místní vyrovnávací paměti pro ukládání dat a ve skutečnosti vliv množství dat vrácené ovladač ODBC.RFX_Texta RFX_Binary provést pouze jedno volání pomocí SQLFetch k načtení dat z databáze back-end.Každý ovladač rozhraní ODBC obsahuje různé omezení na množství dat, které lze vrátit do jednoho načtení.Tato mez může být mnohem menší, než je hodnota v nMaxLength, v kterémžto případě výjimku AFX_SQL_ERROR_DATA_TRUNCATED bude vyvolána výjimka.Za těchto okolností začnou používat RFX_LongBinary místo RFX_Text nebo RFX_Binary tak, že lze načíst všechna data.
ClassWizard naváže SQL_LONGVARCHAR na CString, nebo SQL_LONGVARBINARY na CByteArray pro vás.Pokud chcete přidělit více než 255 bajtů, do kterých můžete načíst sloupce dat long, pak můžete zadat explicitní hodnotu pro nMaxLength.
Sloupec dat long je vázána CString nebo CByteArray, aktualizace pole funguje stejně jako když je povinen SQL_VARCHAR nebo SQL_VARBINARY.Během Úprava, hodnotu data uložená v mezipaměti pryč a později při porovnání aktualizace se nazývá zjistit změny dat hodnoty Dirty nastavena a hodnoty pro sloupec Null správně.
Vazbu CLongBinary sloupec dat Long
Pokud váš dlouhý datový sloupec může obsahovat více MAXINT bajtů dat, měli byste pravděpodobně zvážit načítání do CLongBinary.
Výhody:
To obnoví sloupec celý dlouhý data do paměti.
Nevýhody:
Jsou data uchovávána v paměti.Tento přístup je také u velkých objemů dat výtažkovými.Musíte zavolat SetFieldDirty pro vázaná data je součástí členské zajistit pole aktualizace operace.
Pokud načítáte dlouhé datové sloupce do CLongBinary, databázové třídy zkontrolovat celkovou velikost sloupce dat long, pak přidělit HGLOBAL dostatečně velké pro jeho hodnota celého datového segmentu paměti.Databázové třídy načítat celou datovou hodnotu do pole přiřazená HGLOBAL.
Pokud zdroj dat nelze vrátit očekávané velikosti sloupce dat long, rozhraní framework vyvolá výjimku AFX_SQL_ERROR_SQL_NO_TOTAL.Pokud je pokus o přidělení HGLOBAL selže, je vyvolána výjimka standardní paměť.
ClassWizard naváže SQL_LONGVARCHAR nebo SQL_LONGVARBINARY na CLongBinary pro vás.Vyberte CLongBinary jako typ proměnné v dialogovém okně Přidat členskou proměnnou.ClassWizard přidáte RFX_LongBinary volání v DoFieldExchange volání a zvýšit celkový počet vázaných polí.
Aktualizovat dlouhé hodnoty sloupce dat, ujistěte se nejprve přidělené HGLOBAL je dostatečně velký pro nová data voláním :: GlobalSize v m_hData členem CLongBinary.Pokud je příliš malý, uvolnit HGLOBAL a přidělit jeden odpovídající velikosti.Potom nastavte m_dwDataLength tak, aby odrážely nové velikosti.
Jinak, pokud m_dwDataLength je větší než velikost při nahrazení dat, můžete uvolnit a přerozdělování HGLOBAL, nebo ponechat přidělené.Ujistěte se, počet bajtů, které jsou skutečně používané v m_dwDataLength.
Jak aktualizace funguje CLongBinary
Je nezbytné pochopit, jak aktualizaci CLongBinary funguje, ale může být užitečné například pro odeslání dat long hodnoty ke zdroji dat, pokud zvolíte této třetí metody popsané níže.
[!POZNÁMKA]
Aby CLongBinary pole mají být zahrnuty v aktualizaci, musíte explicitně volat SetFieldDirty pole.Pokud provedete jakoukoliv změnu na pole, včetně nastavení této vlastnosti Null, musíte zavolat SetFieldDirty.Musíte také zavolat SetFieldNull, s druhý parametr je FALSE, označit pole má hodnotu.
Při aktualizaci CLongBinary pole databázové třídy používají rozhraní ODBC je DATA_AT_EXEC mechanismus (naleznete v dokumentaci k rozhraní ODBC na SQLSetPos's rgbValue argument).Při připravuje rámci příkazu insert nebo update namísto ukázání na HGLOBAL obsahující data, adresa z CLongBinary je nastaven jako hodnotu sloupce místo toho a identifikátorem délky udávají nastavena na SQL_DATA_AT_EXEC.Později, po odeslání příkazu aktualizace zdroje dat funkce SQLExecDirect vrátí SQL_NEED_DATA.To je upozornění rozhraní framework, že hodnoty parametrů pro tento sloupec je ve skutečnosti adresa CLongBinary.Architektura volá SQLGetData jednou očekává ovladač, který chcete vrátit skutečná délka dat s malou vyrovnávací pamětí.Pokud ovladač vrátí skutečnou délku binární rozsáhlý objekt (BLOB), MFC reallocates tolik místa potřebného k načtení binárního rozsáhlého objektu.Pokud zdroj dat vrací SQL_NO_TOTAL, označující, že nelze určit velikost objekt BLOB, MFC vytvoří menší bloky.Výchozí počáteční velikost je 64 kb / s a následné bloky budou dvojnásobné velikosti. například druhý bude 128 kb / s, třetí je 256 kB atd.Počáteční velikost je konfigurovatelné.
Neplatí: Načítání nebo odesílání dat přímo z rozhraní ODBC s SQLGetData
Tato metoda je zcela obejít databázové třídy a čelit dlouhé datový sloupec.
Výhody:
Do mezipaměti můžete ukládat data na disk v případě potřeby nebo rozhodnout dynamicky, kolik dat načíst.
Nevýhody:
Nezobrazí se v rámci Upravit nebo AddNew podporu a musíte napsat nakódovat sami provádět základní funkce (Odstranit pracovat, protože není úroveň operaci sloupce).
V tomto případě dlouhý datový sloupec musí být ve výběrovém seznamu záznamů, ale není povinen na rozhraní.Jeden ze způsobů, jak udělat je-li zadat vlastní příkaz SQL prostřednictvím GetDefaultSQL nebo jako lpszSQL argument CRecordsetna otevřených funkce a vazbu nadbytečné sloupce voláním funkce RFX_.ODBC vyžaduje, aby nevázaného pole se zobrazí napravo od vázaných polí, tak na konec seznamu přidat nevázaný sloupec nebo sloupce.
[!POZNÁMKA]
Vzhledem k tomu, že v rámci není vázán sloupce dat long, změny nebudou zpracována s CRecordset::Update volání.Musíte vytvořit a odeslat požadovaná SQL Vložení a aktualizace prohlášení sami.