Sdílet prostřednictvím


TN045: Podpora MFC/databáze dlouhé Varchar/Varbinary

[!POZNÁMKA]

Následující technické poznámce nebyly aktualizovány od byla poprvé zahrnuta v dokumentaci online.Proto některé postupy a témata mohou být nesprávné nebo zastaralé.Nejnovější informace je vhodné vyhledat téma zájmu v dokumentaci online index.

Tato poznámka popisuje, jak načíst a odeslat ODBC SQL_LONGVARCHAR a SQL_LONGVARBINARY typy dat pomocí jednotka MFC databáze tříd.

Přehled dlouhé Varchar/Varbinary podpory

ODBC SQL_LONG_VARCHAR a SQL_LONGBINARY typy dat (jako dlouhé datové sloupce uvedené zde) 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 vytvořit vazbu a načíst a odeslat dlouhé hodnoty ručně, nezávislé databáze tříd.

Každý ze tří metod má výhody a nevýhody.

Dlouhé datové sloupce nejsou podporovány pro parametry dotazu.Jsou podporovány pouze pro outputColumns.

Vazba dlouhý datový sloupec k CString/CByteArray

Výhody:

Tento přístup je jednoduchý pochopit a pracovat s známých tříd.Poskytuje v rámci CFormView podporu pro CString s DDX_Text.Máte hodně obecné řetězec nebo sada funkcí CString a CByteArray třídy a můžete řídit množství paměti přiděleno místně datové hodnoty.Rámci udržuje starou kopii pole dat při Upravit nebo AddNew volání funkce a umožňuje framework, můžete automaticky rozpoznat změny dat.

[!POZNÁMKA]

Od CString je navržen pro práci na znaková data a CByteArray pro práci na binární data je vhodné vložit do znaková data (SQL_LONGVARCHAR) do CStringa binární data (SQL_LONGVARBINARY) do CByteArray.

RFX funkcí pro CString a CByteArray mají 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: argument nMaxLength v prohlášeních o následující 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čtení dat long sloupce do CString nebo CByteArray, vrátí maximální množství dat je standardně 255 bajtů.Mimo to nic ignorovány.V tomto případě rámci vyvolají výjimku AFX_SQL_ERROR_DATA_TRUNCATED.Naštěstí můžete explicitně zvýšit na vyšší hodnoty nMaxLength až MAXINT.

[!POZNÁMKA]

Hodnota nMaxLength je používán MFC nastavit místní vyrovnávací paměti SQLBindColumn funkce.Toto je místní vyrovnávací paměť pro úložiště dat a skutečně neovlivní velikost dat vrácených ovladač ODBC.RFX_Texta RFX_Binary provést pouze jedno volání pomocí Funkce SQLFetch k načtení dat z databáze back-end.Každý ovladač ODBC má na množství dat, které můžete vrátit v jednom načtení různých omezení.Tato mez může být mnohem menší než hodnota v nMaxLength v tomto případě výjimka AFX_SQL_ERROR_DATA_TRUNCATED bude vyvolána.Za těchto okolností přepínat pomocí RFX_LongBinary namísto RFX_Text nebo RFX_Binary tak, aby bylo možné načíst všechna data.

ClassWizard vytvoří vazbu SQL_LONGVARCHAR do CString, nebo SQL_LONGVARBINARY do CByteArray můžete.Pokud chcete přidělit více než 255 bajtů, do kterých načíst dlouhý datový sloupec, můžete potom zadat explicitní hodnotu pro nMaxLength.

Dlouhý datový sloupec je vázána CString nebo CByteArray, aktualizace pole funguje stejně stejné jako při je vázán na SQL_VARCHAR nebo SQL_VARBINARY.Během Upravit, hodnotu dat do mezipaměti při porovnání zaskladnění a později aktualizace se nazývá zjistit změny dat hodnoty a Dirty a vhodně Null hodnot sloupce.

Vazba k CLongBinary dlouhý datový sloupec

Pokud je dlouhý datový sloupec může obsahovat více MAXINT bajtů dat, pravděpodobně zvažte načítání do CLongBinary.

Výhody:

Tím získá sloupec celý dlouhý data do paměti.

Nevýhody:

Data je udržována v paměti.Tento přístup je také velmi velkého množství dat výtažkovými.Musíte zavolat SetFieldDirty pro vázaná data člena, aby pole součástí aktualizace operace.

Pokud načtení dat long sloupce do CLongBinary, databáze tříd zkontrolovat celkové velikosti dlouhý datový sloupec a pak přidělit HGLOBAL dostatečně velký držte hodnotu celého datového segmentu paměti.Databáze tříd načítat celou datovou hodnotu přidělené do HGLOBAL.

Pokud zdroj dat nelze vrátit očekávaná velikost sloupce dat long, v rámci vyvolají výjimku AFX_SQL_ERROR_SQL_NO_TOTAL.Jestliže pokus přidělit HGLOBAL selže, je vyvolána výjimka standardní paměti.

ClassWizard vytvoří vazbu SQL_LONGVARCHAR nebo SQL_LONGVARBINARY na CLongBinary pro vás.Vyberte CLongBinary jako typ v dialogovém okně Přidat proměnnou členské proměnné.ClassWizard přidáte RFX_LongBinary volání vaše DoFieldExchange volání a zvýšit celkový počet vázané pole.

Pokud chcete aktualizovat dlouhé hodnoty sloupce dat, ujistěte se nejprve přidělené HGLOBAL je dostatečně velký pro nová data voláním :: GlobalSize na m_hData člena CLongBinary.Pokud je příliš malý, uvolnit HGLOBAL a přidělit jednu odpovídající velikosti.Nastavte m_dwDataLength tak, aby odrážely nové velikosti.

Jinak, pokud m_dwDataLength je větší než velikost dat nahrazujete, můžete uvolnit a přerozdělit HGLOBAL, nebo ponechat přiděleny.Ujistěte se, počet bajtů, které jsou skutečně používané v m_dwDataLength.

Jak aktualizace pracuje CLongBinary

Není nutné pochopit, jak aktualizaci CLongBinary funguje, ale mohou 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 zahrnutá v aktualizaci, explicitně volat SetFieldDirty pole.Pokud provedete změny pole, včetně nastavení Null, musíte zavolat SetFieldDirty.Musí volat SetFieldNull, s druhý parametr je FALSE, označit jako hodnotu pole.

Při aktualizaci CLongBinary pole databáze tříd pomocí ODBC na DATA_AT_EXEC mechanismus (dokumentaci ODBC na SQLSetPos's rgbValue argument).Při rámci připravuje příkazy insert a update namísto ukázání HGLOBAL obsahující data, adresu z CLongBinary je nastavena jako hodnotu sloupce a nastavte indikátor délky SQL_DATA_AT_EXEC.Později při odeslání příkazu update ke zdroji dat funkce SQLExecDirect se SQL_NEED_DATA.Toto oznámení rámci že hodnota param pro tento sloupec je skutečně adresu CLongBinary.Volání rámci Funkce SQLGetData jednou očekává driver vrácena skutečná délka data s malou vyrovnávací paměti.Pokud ovladač vrací skutečná délka binary large object (BLOB), reallocates MFC tolik místa podle potřeby načítat objekt BLOB.Pokud zdroj dat vrátí 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 a následné bloků bude dvojnásobek velikosti; například bude druhý 128 kb / s, třetí je 256 kB atd.Počáteční velikost je konfigurovatelná.

Nezávazné: Načítání nebo odesílání dat přímo z rozhraní ODBC, pomocí funkce SQLGetData

Tato metoda je zcela obejít databáze tříd a čelit sloupec dat long.

Výhody:

Můžete mezipaměti data na disk v případě potřeby nebo dynamicky, kolik dat načíst rozhodnout.

Nevýhody:

Dostanete rámci Upravit nebo AddNew podporu a musí zapsat kód sami provádět základní funkce (Odstranit práce, protože není úroveň operace sloupce).

Dlouhý datový sloupec v tomto případě musí být v seznamu select záznamů, ale by neměla být vázána na rámci.Způsob proveďte toto je zadat vlastní příkaz SQL prostřednictvím GetDefaultSQL nebo jako lpszSQL argument CRecordsetna otevřených funkce a další sloupec s voláním funkce RFX_ vazbu.ODBC vyžaduje, aby nevázaného pole se zobrazí napravo od pole vázané, tak na konci seznamu vyberte Přidat nevázaný sloupec nebo sloupce.

[!POZNÁMKA]

Protože dlouhý datový sloupec není v rámci vázány, změny nejsou zpracovány s CRecordset::Update volání.Musí vytvořit a odeslat požadovaná SQL Vložit a aktualizace prohlášení sami.

Viz také

Další zdroje

Technické poznámky podle čísla

Technické poznámky podle kategorie