Uwaga ta opisuje sposób pobierania i wysyłania typów danych ODBC SQL_LONGVARCHAR i SQL_LONGVARBINARY przy użyciu klas MFC bazy danych.
Przegląd informacji o długich Varchar/Varbinary obsługuje
Typy danych ODBC SQL_LONG_VARCHAR i SQL_LONGBINARY (Mowa tu jak długo kolumny danych) może zawierać duże ilości danych. 3 Sposoby obsługi danych:
Danych Long kolumny nie są obsługiwane dla parametrów kwerendy. Są obsługiwane dla outputColumns.
Wiązanie długości kolumny danych CString/CByteArray
Korzyści:
Podejście to jest łatwy do zrozumienia i podczas pracy z klasami znane. Ramach zapewnia obsługę CFormView dla CString z DDX_Text. Masz dużo ogólne ciąg lub kolekcja funkcji z CString i CByteArray klasy, a można sterować ilość pamięci przydzielonej lokalnie do przechowywania wartości danych. Ramach utrzymuje starej kopii danych pól podczas edycji lub wywołania funkcji AddNew i ramach może automatycznie wykryć zmiany danych dla Ciebie.
Uwaganbsp; Ponieważ CString jest przeznaczony do pracy z danych znakowych i CByteArray do pracy na dane binarne, zalecane jest, wprowadzane dane znakowe (SQL_LO&NGVARCHAR) do CStringi dane binarne (SQL_LONGVARBINARY) do CByteArray.
Funkcje RFX CString i CByteArray mają dodatkowy argument, który pozwala zastąpić domyślny rozmiar alokacji pamięci do przechowywania pobrana wartość w kolumnie danych. Uwaga argument nMaxLength w następującej deklaracji funkcji:
void AFXAPI RFX_Text(CFieldExchange* pFX, const char *szName,
nbsp; CString & wartości, int nMaxLength = 255, int nColumnType =
SQL_VARCHAR);
void AFXAPI RFX_Binary(CFieldExchange* pFX, const char *szName, CByteArray& value,int nMaxLength = 255)
Jeżeli pobierasz kolumnę danych long do CString lub CByteArray, maksymalna zwracanymi blokami ilość danych jest domyślnie 255 bajtów. Nic poza ten jest ignorowany. W tym przypadku ramach wygeneruje wyjątek AFX_SQL_ERROR_DATA_TRUNCATED. Na szczęście wyraźnie zwiększa nMaxLength do większej wartości, do MAXINT.
ClassWizard, będą wiązać SQL_LONGVARCHAR CStringlub SQL_LONGVARBINARY do CByteArray dla Ciebie. Jeśli chcesz przydzielić więcej niż 255 bajtów, na które można pobrać z kolumny danych long, następnie można podać jawną wartość dla nMaxLength.
Jeśli kolumna danych long jest związana z CString lub CByteArray, uaktualniania pola działa tak samo jak kiedy jest on związany z SQL_VARCHAR lub SQL_VARBINARY. Podczas edycjiwartość danych jest buforowane odległości i później w porównaniu podczas aktualizacji nazywa się do wykrywania zmian wartości danych i odpowiednio ustawić wartości Dirty i wartości Null w kolumnie.
Wiązanie długości kolumny danych CLongBinary
Jeśli kolumna danych long może zawierać więcej MAXINT bajtów danych, należy użytkownik prawdopodobnie rozważyć pobieranie go do CLongBinary.
Korzyści:
Pobiera kolumnę całego danych long - do dostępnej pamięci.
Wady:
Dane są przechowywane w pamięci. To podejście jest również barierą dla bardzo duże ilości danych. Należy wywołać SetFieldDirty dla członka związane dane upewnić się, że pole to jest uwzględniane w operacji aktualizacji.
Jeśli pobierasz kolumny danych long do CLongBinary, klas bazy danych sprawdź całkowity rozmiar kolumny danych long, następnie przydzielić wystarczająco duże, aby pomieścić całą wartość segmentu pamięci HGLOBAL . Klasy bazy danych następnie pobrać wartość całego danych do przydzielonego HGLOBAL.
Jeśli źródło danych nie może zwrócić przewidywany rozmiar kolumny danych long, ramy wygeneruje wyjątek AFX_SQL_ERROR_SQL_NO_TOTAL. Jeśli próba przydzielenia HGLOBAL nie powiedzie się, wyjątek standardowych pamięci jest generowany.
ClassWizard będzie powiązania SQL_LONGVARCHAR lub SQL_LONGVARBINARY do CLongBinary dla Ciebie. Wybierz CLongBinary jako zmienna typu w oknie dialogowym Dodawanie Państwa zmienną. ClassWizard będzie następnie dodać wywołanie RFX_LongBinary dla wywołania DoFieldExchange i zwiększyć całkowitą liczbę pól powiązane.
Aby zaktualizować długo wartości kolumny danych, najpierw upewnij się, przydzielonego HGLOBAL jest wystarczająco dużej, aby pomieścić nowych danych przez wywołanie :: Funkcja GlobalSize na m_hData członkiem CLongBinary. Jeśli jest zbyt mały, zwolnij HGLOBAL i przydzielić jedną odpowiedni rozmiar. Następnie ustaw m_dwDataLength aby odzwierciedlały nowy rozmiar.
Inaczej jeżeli m_dwDataLength jest większy niż rozmiar danych, które chcesz zamienić, można albo wolne i alokacja HGLOBALlub pozostawić ją przydzielone. Upewnij się, że wskazuje liczbę bajtów faktycznie wykorzystanych w m_dwDataLength.
W jaki sposób aktualizacji działa CLongBinary
Nie jest konieczne do zrozumienia, jak działa uaktualnianie CLongBinary , ale może być przydatna na przykład o tym, jak wysłać wartości długiej danych do źródła danych, jeśli wybrana zostanie ta metoda trzeci, opisane poniżej.
Uwaganbsp; Aby pola CLongBinary mają zostać uwzględnione w aktualizacji należy jawnie wywołać SetFieldDirty dla tego pola. Jeśli wprowadzenie zmian do pola, włączając w to ustawienie wartości &Null, należy wywołać SetFieldDirty.
Podczas aktualizacji pola CLongBinary , klasami baz danych za pomocą mechanizmu DATA_AT_EXEC ODBC firmy (zobacz dokumentację ODBC na SQLSetPosrgbValue argumentu). Gdy ramach przygotowuje insert lub instrukcji update, zamiast wskazując HGLOBAL zawierającego dane, adres CLongBinary jest ustawiony jako wartość w kolumnie zamiast i wskaźnikiem długości ustawiony na SQL_DATA_AT_EXEC. Później gdy instrukcji update jest wysyłana do źródła danych, SQLExecDirect zwróci SQL_NEED_DATA. Alerty ramy, że wartości parametrów dla tej kolumny jest rzeczywiście adres CLongBinary. Ramach wywołuje SQLGetData raz z małym buforem, oczekiwano sterownik zwraca rzeczywista długość danych. Jeśli sterownik zwraca wartość rzeczywista długość dużego obiektu binarnego (BLOB), MFC reallocates tyle miejsca jako niezbędne do pobrania obiektu BLOB. Jeśli źródło danych zwraca SQL_NO_TOTAL, wskazując, że nie można określić rozmiaru obiektu BLOB, MFC utworzy mniejsze bloki. Domyślny rozmiar początkowy to 64 KB, a kolejne bloki będą podwójne wielkość; na przykład drugi będzie 128 K, trzeci jest 256 KB itd. Rozmiar początkowy jest konfigurowalny.
Nie wiąże: Pobieranie/wysyłanie danych bezpośrednio z ODBC z SQLGetData
Przy użyciu tej metody można całkowicie pominąć klasami baz danych i zajmują kolumny danych long samodzielnie.
Korzyści:
Buforowanie danych z dysku, jeżeli jest to konieczne lub zdecydować, dynamicznie jak dużo danych do pobrania.
Wady:
Nie uzyskać w ramach edycji lub wsparcie AddNew i należy napisać kod samodzielnie wykonywać podstawowe funkcje (Usuń pracy, ponieważ nie jest to operacja poziomu kolumny).
W tym przypadku kolumny danych long musi być na liście Wybierz zestaw rekordów, lecz nie powinna być zobowiązana do ramy. Jednym ze sposobów jest dostaw własnych instrukcji SQL za pomocą GetDefaultSQL lub jako argument lpszSQL funkcji Open CRecordset, a nie wiążą dodatkowe kolumny z wywołania funkcji RFX_. ODBC wymaga, że niezwiązanego pola są wyświetlane po prawej stronie pola powiązane, tak dodaj niezwiązany kolumny do końca lista wyboru.
Ostrzeżenienbsp; Ponieważ kolumna danych long nie jest związana w ramach, zmiany nie będą rozpatrywane z wywołania CRecordset::Update . &Należy utworzyć i wysłać wymaganych instrukcji SQL, Wstawianie i Aktualizacja samodzielnie.
Uwagi techniczne przez liczbę |nbsp; Uwagi techniczne według kategorii