Udostępnij za pośrednictwem


SQL: Dostosowywanie instrukcję SQL w zestawie rekordów (ODBC)

W tym temacie wyjaśniono:

  • Jak konstruuje w ramach instrukcji SQL

  • Jak zmienić instrukcję SQL

[!UWAGA]

Poniższe informacje dotyczą klas MFC ODBC.Jeśli pracujesz z klas MFC DAO, zobacz temat "Porównanie z Microsoft Jet bazy danych aparatu SQL i ANSI SQL" w Pomocy programu DAO.

Budowa instrukcji SQL

Zapis zaznaczenia przede wszystkim na SQL opiera swój zestaw rekordów Wybierz instrukcji.Przy deklarowaniu klasy za pomocą Kreatora zapisuje nadrzędnym wersja GetDefaultSQL funkcji składowej, która wygląda następująco (dla klasy zestaw rekordów o nazwie CAuthors).

CString CAuthors::GetDefaultSQL()
{
    return "AUTHORS";
}

Domyślnie ta override zwraca nazwę tabeli, które określiłeś za pomocą kreatora.W przykładzie nazwa tabeli jest "Autorzy." Później wywołaniu zestawu rekordów otwarte funkcji składowej Otwórz konstrukcje ostateczna Wybierz instrukcji formularza:

SELECT rfx-field-list FROM table-name [WHERE m_strFilter] 
       [ORDER BY m_strSort]

gdzie table-name uzyskuje się poprzez wywołanie GetDefaultSQL i rfx-field-list są uzyskiwane z wywołania funkcji RFX w DoFieldExchange.Jest to, jaki masz na Wybierz instrukcji, o ile nie polega na zastąpieniu go za pomocą wersji nadrzędnych w czasie wykonywania, chociaż można także modyfikować instrukcja domyślne parametry lub filtr.

[!UWAGA]

Jeśli określisz nazwę kolumny, która zawiera (lub może zawierać) spacje, należy ująć nazwę w nawiasach kwadratowych.Na przykład nazwa "Imię" powinno być "[First Name]".

Do zmiany ustawień domyolnych Wybierz instrukcji, przebieg wartość typu ciąg zawierający kompletne Wybierz instrukcji podczas wywoływania Otwórz.Zamiast tworzenia własnej domyślny ciąg, zestaw rekordów użyje ciągu tekstem.Jeśli instrukcja wymiany zawiera gdzie klauzuli, nie zostanie określony filtr w m_strFilter ponieważ trzeba następnie filtrować dwóch instrukcji.Podobnie jeśli zawiera wyciągu zastępczego ORDER BY klauzuli, nie zostanie określony sortowania w m_strSort tak, że nie będzie można posortować dwóch instrukcji.

[!UWAGA]

Jeśli używasz ciągi tekstowe w ustawienia filtrów (lub innych części instrukcji SQL), może być konieczne "oferta" (należy ująć w określonego ograniczników) takie ciągi z prefiksem literału specyficznych dla systemu DBMS i literału przyrostek znak (lub znaki).

Można napotkać również syntaktyczne wymagania specjalne dotyczące operacji, takich jak sprzężenia zewnętrzne, w zależności od systemu DBMS.Użyj funkcji ODBC do uzyskania tych informacji od sterownika dla systemu DBMS.Na przykład wywołanie :: SQLGetTypeInfo dla określonego typu danych, takich jak SQL_VARCHAR, aby zażądać LITERAL_PREFIX i LITERAL_SUFFIX znaków.Podczas pisania kodu niezależne od bazy danych, zobacz dodatku C w ODBC SDKProgrammer's Reference na dysku CD z biblioteki MSDN dla składni szczegółowe informacje.

Obiekt recordset konstrukcje instrukcję SQL, która używa do wybierania rekordów, jeśli nie przekażemy własne instrukcje SQL.Przebieg zależy głównie od wartości przebiegu w lpszSQL parametr Otwórz funkcji składowej.

Powszechną formą SQL Wybierz instrukcja jest:

SELECT [ALL | DISTINCT] column-list FROM table-list
    [WHERE search-condition][ORDER BY column-list [ASC | DESC]]

Jedną stronę, aby dodać DISTINCT słowo kluczowe do instrukcji SQL w zestawie rekordów jest osadzenie słowo kluczowe w pierwsze wywołanie funkcji RFX w DoFieldExchange.Na przykład:

...
    RFX_Text(pFX, "DISTINCT CourseID", m_strCourseID);
...

[!UWAGA]

Użyj tej techniki tylko z zestawem rekordów, otwarty w trybie tylko do odczytu.

Przesłanianie instrukcji SQL

W poniższej tabeli przedstawiono możliwości lpszSQL parametru do Otwórz.Przypadki, w tabeli zostały wyjaśnione, znajdującej się pod tabelą.

LpszSQL parametr i wynikowy ciąg SQL

Sprawy

Przebiegu w lpszSQL

Wynikowa instrukcja SELECT

1

WARTOŚĆ NULL

Wybierzrfx pole Lista-hostów-FROMNazwa tabeli

CRecordset::Openwywołania GetDefaultSQL Aby uzyskać nazwę tabeli.Wynikowy ciąg jest jednym z przypadków 2 do 5, w zależności od tego, co GetDefaultSQL zwraca wartość.

2

Nazwa tabeli

Wybierzrfx pole Lista-hostów-FROMNazwa tabeli

Lista pól jest pobierana z instrukcji RFX w DoFieldExchange.Jeśli m_strFilter i m_strSort nie są puste, dodaje gdzie i/lub ORDER BY klauzul.

3 *

Kompletne Wybierz instrukcji ale bez gdzie lub ORDER BY klauzuli

Z biegiem.Jeśli m_strFilter i m_strSort nie są puste, dodaje gdzie i/lub ORDER BY klauzul.

4 *

Kompletne Wybierz instrukcja z gdzie i/lub ORDER BY klauzuli

Z biegiem.m_strFilter i/lub m_strSort musi pozostać puste lub dwóch filtrów i/lub instrukcji sortowania są produkowane.

5 *

Wywołanie procedury składowanej

Z biegiem.

* m_nFields musi być mniejsza niż liczba kolumn określona w Wybierz instrukcji.Typ danych każdej kolumny, określone w Wybierz instrukcja musi być taka sama, jak typ danych odpowiedniej kolumny RFX.

6hs301kk.collapse_all(pl-pl,VS.110).gifCase 1 lpszSQL = NULL

Wybór zestawu rekordów zależy, jaki GetDefaultSQL zwraca wartość, gdy CRecordset::Open ją wywołuje.W przypadkach 2 do 5 opisują możliwych ciągów znaków.

6hs301kk.collapse_all(pl-pl,VS.110).gifLpszSQL przypadku 2 = Nazwa tabeli

Zestaw rekordów używa metody wymiany pola rekordu (RFX) zbudować listy kolumn z nazw kolumn, pod warunkiem, że w RFX funkcja wywołuje w zastępująca klasę zestaw rekordów DoFieldExchange.Jeżeli użyto kreatora, aby zadeklarować własną klasę zestawu rekordów, tym przypadku ma taki sam wynik jak w przypadku 1 (pod warunkiem, że przekazuje tę samą nazwę tabeli, wprowadzoną w kreatorze).Jeśli nie używasz kreatora zapisać swojej klasy, przypadek 2 jest to najprostszy sposób, aby skonstruować instrukcję SQL.

Poniższy przykład tworzy instrukcję SQL, która wybiera rekordy z bazy danych aplikacji MFC.Gdy wywołuje ramach GetDefaultSQL funkcji składowej, funkcja zwraca nazwę tabeli, SECTION.

CString CEnrollSet::GetDefaultSQL()
{
    return "SECTION";
}

Uzyskania nazwy kolumn dla SQL Wybierz instrukcji, połączenia framework DoFieldExchange funkcji składowej.

void CEnrollSet::DoFieldExchange(CFieldExchange* pFX)
{
    pFX->SetFieldType(CFieldExchange::outputColumn);
    RFX_Text(pFX, "CourseID", m_strCourseID);
    RFX_Text(pFX, "InstructorID", m_strInstructorID);
    RFX_Text(pFX, "RoomNo", m_strRoomNo);
    RFX_Text(pFX, "Schedule", m_strSchedule);
    RFX_Text(pFX, "SectionNo", m_strSectionNo);
}

Po jego zakończeniu instrukcji SQL przyjmuje następującą postać:

SELECT CourseID, InstructorID, RoomNo, Schedule, SectionNo 
    FROM SECTION

6hs301kk.collapse_all(pl-pl,VS.110).gifSprawa 3 lpszSQL = SELECT / FROM instrukcji

Lista kolumn należy określić ręcznie na nadrzędnych RFX go tworzyć automatycznie.Być może chcesz zrobić podczas:

  • Aby określić DISTINCT następujące słowa kluczowego Wybierz.

    Listy kolumny powinny być zgodne nazwy kolumn i typów w tej samej kolejności jak są one wymienione w DoFieldExchange.

  • Mają powody, aby ręcznie pobrać wartości kolumny, przy użyciu funkcji ODBC :: SQLGetData a nie opierając się na RFX do powiązania i pobierania kolumn dla Ciebie.

    Może na przykład chcesz wstawić nowe kolumny, które po była dystrybuowana aplikacja klienta aplikacji dodane do tabel bazy danych.Musisz dodać te elementy danych dodatkowe pola, które nie były znane w czasie tej klasy jest zadeklarowana za pomocą kreatora.

    Listy kolumny powinny być zgodne nazwy kolumn i typów w tej samej kolejności jak są one wymienione w DoFieldExchange, a następnie nazwy ręcznie powiązania kolumn.Aby uzyskać więcej informacji, zobacz Zestaw rekordów: Powiązanie dynamicznie kolumn danych (ODBC).

  • Aby utworzyć sprzężenie między tabelami, określając wielu tabel w FROM klauzuli.

    Informacje i przykład, Zestaw rekordów: Wykonywanie sprzężenia (ODBC).

6hs301kk.collapse_all(pl-pl,VS.110).gifW przypadku 4 lpszSQL = wybierz / od Plus gdzie i/lub ORDER BY

Określ wszystko: Lista kolumn (oparte na wywołania RFX w DoFieldExchange), na liście tabeli, a zawartość gdzie i/lub ORDER BY klauzuli.Jeśli określisz swoje gdzie i/lub ORDER BY klauzul w ten sposób nie należy używać m_strFilter i/lub m_strSort.

6hs301kk.collapse_all(pl-pl,VS.110).gifLpszSQL przypadku 5 = przechowywane wywoływania

Jeśli trzeba wywołać wstępnie zdefiniowanej kwerendy (na przykład procedurę przechowywaną w bazie danych programu Microsoft SQL Server), należy napisać CALL instrukcji w ciągu są przekazywane do lpszSQL.Kreator nie obsługują deklarowanie klasy zestaw rekordów do wywoływania wstępnie zdefiniowanej kwerendy.Nie wszystkie wstępnie zdefiniowanych kwerendach zwraca rekordów.

Jeśli wstępnie zdefiniowanej kwerendy nie zwraca rekordów, można użyć CDatabase funkcji składowej ExecuteSQL bezpośrednio.Dla wstępnie zdefiniowanej kwerendy, który zwraca rekordy, należy również ręcznie napisać RFX wywołuje w DoFieldExchange dla kolumn z procedura zwraca.Wywołania RFX musi być w tej samej kolejności i zwracać te same typy, jako wstępnie zdefiniowanej kwerendy.Aby uzyskać więcej informacji, zobacz Zestaw rekordów: Deklarowanie klasy dla wstępnie zdefiniowanej kwerendy (ODBC).

Zobacz też

Koncepcje

SQL: Typy danych języka C++ (ODBC) i SQL

SQL: Wywołań bezpośredniego SQL (ODBC)