Udostępnij za pośrednictwem


TN045: obsługa MFC/bazy danych pod względem typu danych Varchar/Varbinary

[!UWAGA]

Następująca uwaga techniczna nie został zaktualizowana od pierwszego uwzględnienia jej w dokumentacji online.W rezultacie niektóre procedury i tematy może być nieaktualne lub nieprawidłowe.Aby uzyskać najnowsze informacje, zaleca się wyszukać temat w indeksie dokumentacji online.

Ta notatka w tym artykule opisano sposób pobierania i wysyłania ODBC SQL_LONGVARCHAR i SQL_LONGVARBINARY typów danych przy użyciu biblioteki MFC bazy danych klasy.

Omówienie obsługi długo Varchar i Varbinary

ODBC SQL_LONG_VARCHAR i SQL_LONGBINARY (określoną tutaj jako długo kolumny danych) typów danych może pomieścić ogromnej ilości danych.Istnieją trzy sposoby można obsługiwać te dane:

  • Bind it to a CString/CByteArray.

  • Związanie go do CLongBinary.

  • Nie związać go w ogóle i pobierać i wysyłać danych long wartość ręcznie, niezależnie od klasy bazy danych.

Każdy z trzech metod posiada zalety i wady.

Kolumny danych długich nie są obsługiwane dla parametrów kwerendy.Są obsługiwane dla outputColumns.

Wiązanie kolumny danych Long CString/CByteArray

Korzyści:

To podejście jest łatwe do zrozumienia i pracować z znanych klas.Środowisko framework zapewnia CFormView wsparcie dla CString z DDX_Text.Masz dużo ogólne funkcje ciąg lub kolekcji z CString i CByteArray klas, a można kontrolować ilość pamięci przydzielaną lokalnie do przechowywania wartości danych.Ramach przechowuje starą kopię danych pola podczas edytować lub AddNew wywołania funkcji i ramy może automatycznie wykryć zmiany w danych.

[!UWAGA]

Ponieważ CString jest przeznaczony do pracy na dane znakowe, i CByteArray do pracy na dane binarne, zaleca się umieszczenie danych znakowych (SQL_LONGVARCHAR) w CStringi dane binarne (SQL_LONGVARBINARY) w CByteArray.

Funkcje RFX dla CString i CByteArray ma dodatkowy argument, który pozwala zastąpić domyślny rozmiar alokacji pamięci do przechowywania pobrana wartość dla kolumny danych.Uwaga argumentu nMaxLength w następującej deklaracji funkcji:

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);

Jeśli pobieranie kolumny danych long do CString lub CByteArray, zwracane maksymalną ilość danych jest domyślnie 255 bajtów.Nic poza tym jest ignorowana.W tym przypadku ramach spowoduje zgłoszenie wyjątku AFX_SQL_ERROR_DATA_TRUNCATED.Na szczęście można jawnie zwiększyć nMaxLength do większej wartości do MAXINT.

[!UWAGA]

Wartość nMaxLength jest używany przez usługi MFC Aby ustawić lokalny bufor o SQLBindColumn funkcji.To jest lokalnym buforze na przechowywanie danych i nie faktycznie wpływa na ilość danych zwróconych przez sterownik ODBC.RFX_Texti RFX_Binary tylko zrobić jeden wywołanie przy użyciu SQLFetch do pobierania danych z bazy danych zaplecza.Każdy sterownik ODBC ma różne ograniczenia na ilość danych, które zwracają pojedynczego pobrania.Limit ten może być znacznie mniejsza niż wartość podana w nMaxLength, w tym przypadku wyjątku AFX_SQL_ERROR_DATA_TRUNCATED zostanie wyrzucony.W tych okolicznościach, przełącz się do za pomocą RFX_LongBinary zamiast RFX_Text lub RFX_Binary tak, że wszystkie dane mogą być odzyskane.

Nada ClassWizard SQL_LONGVARCHAR do CString, lub SQL_LONGVARBINARY do CByteArray dla Ciebie.Jeśli chcesz przydzielić więcej niż 255 bajtów, do których można pobrać kolumny danych long, następnie można podać jawną wartość dla nMaxLength.

Kiedy jest powiązana kolumna danych long CString lub CByteArray, aktualizowanie pola działa tak samo jak kiedy jest powiązany z SQL_VARCHAR lub SQL_VARBINARY.Podczas edytować, od i później po porównaniu wartości danych znajdują się w buforze Aktualizacja nazywa się do wykrywania zmian danych wartość i ustawić Dirty i odpowiednio Null wartości dla kolumny.

Wiązanie kolumny danych Long CLongBinary

Jeśli kolumny danych long może zawierać więcej MAXINT bajtów danych, prawdopodobnie warto go do pobierania CLongBinary.

Korzyści:

Pobiera kolumnę danych long cały do dostępnej pamięci.

Niedogodności:

Dane są przechowywane w pamięci.To podejście jest również zaporowa dla bardzo dużych ilości danych.Musisz wywołać SetFieldDirty dla dane powiązane Członkowskie zapewniające pole znajduje się w Aktualizacja operacji.

Jeśli pobieranie danych long kolumn w CLongBinary, klasy bazy danych będzie sprawdzić całkowity rozmiar kolumny danych long, a następnie przydzielić HGLOBAL segmentu pamięci jest wystarczająco duży, aby pomieścić go wartości danych.Klasami baz danych następnie pobrać wartości danych do przydzielonego HGLOBAL.

Jeśli źródło danych nie może zwrócić oczekiwanych rozmiar kolumny danych long, ramach spowoduje zgłoszenie wyjątku AFX_SQL_ERROR_SQL_NO_TOTAL.Jeśli próba przydzielić HGLOBAL się nie powiedzie, pamięci o standardowej wyjątku.

Nada ClassWizard SQL_LONGVARCHAR lub SQL_LONGVARBINARY do CLongBinary dla Ciebie.Wybierz CLongBinary jako typ zmiennej w oknie dialogowym Dodawanie zmiennej Członkowskich.ClassWizard spowoduje dodanie RFX_LongBinary zadzwonić do swojej DoFieldExchange wywołania i przyrost wartości Całkowita liczba pól związanych.

Aby zaktualizować długo wartości kolumny danych, najpierw upewnij się przydzielonego HGLOBAL jest wystarczająco duży, aby pomieścić nowe dane przez wywołanie :: Funkcja GlobalSize na m_hData członek CLongBinary.Jeśli jest zbyt mały, zwolnij HGLOBAL i przydzielić jedną odpowiedniego rozmiaru.Następnie ustaw m_dwDataLength aby odzwierciedlić nowy rozmiar.

Inaczej, jeśli m_dwDataLength jest większy niż rozmiar danych jest zamieniany, można zwolnić i ponownie przydzielić HGLOBAL, lub pozostawić go przydzielona.Upewnij się wskazać liczbę bajtów faktycznie używanych w m_dwDataLength.

Działa jak aktualizacji CLongBinary

Nie jest konieczne do zrozumienia sposobu aktualizowania CLongBinary programu works, ale może być przydatne na przykład dotyczące wysyłania wartości danych long do źródła danych, jeśli wybierzesz tę metodę trzeciego, opisane poniżej.

[!UWAGA]

Aby CLongBinary pola, które mają zostać uwzględnione w aktualizacji, należy jawnie wywołać SetFieldDirty dla pola.Po dokonaniu zmiany w polu, włączając zostanie ustawiona wartość Null, należy wywołać SetFieldDirty.Musi także wywołać metodę SetFieldNull, z drugim parametrem jest FALSE, aby oznaczyć pole jako posiadające wartość.

Podczas aktualizacji CLongBinary pole, użyć klasami baz danych ODBC w DATA_AT_EXEC mechanizmu (zobacz dokumentację ODBC na SQLSetPos's rgbValue argument).Kiedy przygotowuje instrukcji insert lub update, zamiast wskazywać polecenie w ramach HGLOBAL zawierającego dane, adres z CLongBinary jest ustawiona jako wartość kolumny zamiast i wskaźnik długości ustawiona na SQL_DATA_AT_EXEC.Później, gdy instrukcja update jest wysyłana do źródła danych SQLExecDirect zwróci SQL_NEED_DATA.Alerty ramach że wartość param dla tej kolumny jest faktycznie adres CLongBinary.Wywołania framework SQLGetData raz z małym buforem oczekiwano sterownika, wrócić do rzeczywistej długości danych.Jeśli sterownik zwraca aktualną długość dużego obiektu binarnego (BLOB), MFC reallocates tyle miejsca, ile jest wymaganych do pobrania obiektu BLOB.Jeśli źródło danych zwraca SQL_NO_TOTAL, wskazując, że nie można określić rozmiar obiektu BLOB, MFC utworzy mniejsze bloki.Początkowy rozmiar domyślny to 64 KB i kolejne bloki będą dwukrotnie rozmiar; na przykład drugi będzie 128K, trzeci jest 256K i tak dalej.Rozmiar początkowy jest konfigurowany.

Niewiążące: Pobierania/wysyłania danych bezpośrednio z ODBC z SQLGetData

Przy użyciu tej metody można całkowicie pominąć klasami baz danych i czynienia z kolumny danych long.

Korzyści:

Może buforować dane na dysku w razie potrzeby, lub zdecydować, ile dane do pobrania.

Niedogodności:

Nie otrzymasz w ramach edytować lub AddNew wsparcia i musisz napisać kod samodzielnie wykonywać podstawowe funkcje (usunąć pracy, ale, ponieważ nie jest operacją poziomu kolumny).

W tym przypadku kolumny danych long musi być na liście wybierz zestaw rekordów, ale nie powinna być powiązana przez środowisko.Jednym ze sposobów jest do dostarczania własną instrukcję SQL za pomocą GetDefaultSQL lub jako argumentu lpszSQL CRecordsetw Otwórz działać, a nie wiążą się dodatkowe kolumny za pomocą wywołania funkcji RFX_.ODBC wymaga, że niezwiązanego pola pojawiają się z prawej strony pól związanych, więc dodać na końcu listy wybierz niezwiązany kolumna lub kolumny.

[!UWAGA]

Ponieważ kolumny danych long nie jest związana w ramach, wprowadzanie w nim zmian, nie będą rozpatrywane z CRecordset::Update wywołań.Należy utworzyć i wysłać wymagane SQL Wstaw i Aktualizacja instrukcji samodzielnie.

Zobacz też

Inne zasoby

Uwagi techniczne według numerów

Uwagi techniczne według kategorii