SQL: dostosowywanie instrukcji SQL zestawu rekordów (ODBC)
Ten temat tłumaczy:
Jak ramach konstrukcje instrukcji SQL
Jak zastąpić instrukcji SQL
[!UWAGA]
Ta informacja ma zastosowanie do klas MFC ODBC.Jeśli pracujesz z klas MFC DAO, zobacz temat "Porównanie z bazy danych aparatu SQL i ANSI SQL programu Microsoft Jet" w pomocy DAO.
Budowa instrukcji SQL
Wybór zapisu przede wszystkim na SQL opiera swój zestaw rekordów Wybierz instrukcji.Za pomocą kreatora należy zadeklarować własną klasę, zapisuje nadrzędnym wersja GetDefaultSQL funkcji członka, który wygląda następująco (klasa zestaw rekordów o nazwie CAuthors).
CString CAuthors::GetDefaultSQL()
{
return "AUTHORS";
}
Domyślnie ta ręczna zmiana zwraca nazwę tabeli określona przy użyciu kreatora.W podanym przykładzie nazwa tabeli jest "Autorzy". Dzwoniąc później zestawu rekordów Otwórz funkcji członka Otwórz konstrukcje ostatecznej 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 jest uzyskiwana z wywołań funkcji RFX w DoFieldExchange.Jest to get dla Wybierz instrukcja chyba że zastąpieniu go nadrzędnym wersji w czasie wykonywania, chociaż można także zmodyfikować instrukcja domyślne parametry lub filtru.
[!UWAGA]
Jeśli określisz nazwę kolumny, która zawiera (lub mogłyby zawierać) spacje, należy ująć nazwę w nawiasach kwadratowych.Na przykład nazwa "Imię" powinno być "[First Name]".
Aby zastąpić opcję domyślną Wybierz instrukcji, przebieg typu ciąg zawierający kompletne Wybierz instrukcji podczas wywoływania otwarte.Zamiast tworzenia własnej domyślny ciąg, zestawu rekordów używa podanego ciągu.Jeśli Twoim wyciągu zastępczego zawiera gdzie klauzuli, nie zostanie określony filtr w m_strFilter ponieważ miałyby wówczas filtrowanie dwóch instrukcji.Podobnie jeśli Twoim wyciągu zastępczego zawiera ORDER BY klauzuli, nie określono sortowanie 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 sufiks 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 tej 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 dodatek C w ODBC SDKProgrammer's Reference na CD biblioteki MSDN, aby uzyskać szczegółowe informacje o składni.
Obiekt recordset konstrukcje instrukcję SQL, która używa do wybierania rekordów, chyba że przekazać własne instrukcje SQL.Jak się to robi zależy głównie od wartości przebiegu w lpszSQL parametr Otwórz funkcji składowej.
Ogólny kształt SQL Wybierz jest instrukcja:
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 parametr Otwórz.Przypadków w tabeli zostały omówione poniżej tabeli.
LpszSQL parametr i wynikowy ciąg SQL
Sprawa |
Przebiegu w lpszSQL |
Wynikowa instrukcja SELECT |
---|---|---|
1 |
NULL |
Wybierzrfx pole Lista-hostów-zNazwa 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. |
2 |
Nazwa tabeli |
Wybierzrfx pole Lista-hostów-zNazwa 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 * |
Kompletny Wybierz instrukcja ale bez gdzie lub ORDER BY klauzuli |
Ponieważ przesunięta.Jeśli m_strFilter i m_strSort nie są puste, dodaje gdzie i/lub ORDER BY klauzul. |
4 * |
Kompletny Wybierz instrukcja z gdzie i/lub ORDER BY klauzuli |
Ponieważ przesunięta.m_strFilter i/lub m_strSort musi pozostać pusta lub dwóch filtrów i/lub instrukcji sortowania są produkowane. |
5 * |
Wywołanie procedury składowanej |
Ponieważ przesunięta. |
* m_nFields musi być mniejsza niż liczba kolumn określona w Wybierz instrukcji.Typ danych każdej kolumny, określona w Wybierz instrukcja musi być taki sam, jak typ danych odpowiedniej kolumny RFX w danych wyjściowych.
Sprawa 1 lpszSQL = NULL
Wybór zestawu rekordów zależy od co GetDefaultSQL zwraca, kiedy CRecordset::Open ją wywołuje.Przypadków 2 do 5 opis możliwych ciągów znaków.
Przypadek 2 lpszSQL = Nazwa tabeli
Zestaw rekordów używa pola rekordu programu exchange (RFX) do budowania listy kolumn z nazw kolumn pod warunkiem w RFX funkcja wywołuje w zastępująca klasę zestawu rekordów DoFieldExchange.Jeżeli użyto kreatora Aby zadeklarować własną klasę zestawu rekordów, tę sprawę ma taki sam wynik jak w przypadku 1 (pod warunkiem, że przekazać tę samą nazwę tabeli, określona w kreatorze).Jeśli nie używany jest Kreator, aby napisać swojej klasy, przypadek 2 jest najprostszym sposobem skonstruować instrukcję SQL.
Poniższy przykład tworzy instrukcję SQL, która wybiera rekordy z bazy danych aplikacji MFC.Kiedy wywołuje ramach GetDefaultSQL funkcji składowej, funkcja zwraca nazwę tabeli, SECTION.
CString CEnrollSet::GetDefaultSQL()
{
return "SECTION";
}
Aby uzyskać nazwy kolumn dla SQL Wybierz oświadczenie, wywołania 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 zakończeniu instrukcji SQL wygląda następująco:
SELECT CourseID, InstructorID, RoomNo, Schedule, SectionNo
FROM SECTION
Przypadek 3 lpszSQL = wybierz / z wyciągu
Określ listy kolumn jest ręcznie a nie poleganie na RFX zbudować automatycznie.Można to zrobić, gdy:
Aby określić DISTINCT następujące słowa kluczowego Wybierz.
Listy kolumna powinna odpowiadać nazwy kolumn i typy w tej samej kolejności wymienione w DoFieldExchange.
Mają powody, aby ręcznie pobrać wartości kolumny przy użyciu funkcji ODBC :: SQLGetData a nie poleganie na RFX powiązanie i pobierania kolumn dla Ciebie.
Na przykład, może chcesz wstawić nowe kolumny klienta aplikacji dodane do tabel bazy danych po aplikacji został wydany.Musisz dodać te elementy danych dodatkowe pola, które nie były znane w czasie tej klasy jest zadeklarowana za pomocą kreatora.
Listy kolumna powinna odpowiadać nazwy kolumn i typy w tej samej kolejności wymienione w DoFieldExchange, a następnie nazwy kolumny związanej ręcznie.Aby uzyskać dodatkowe informacje, zobacz Zestaw rekordów: dynamiczne wiązanie kolumn danych (ODBC).
Chcesz utworzyć sprzężenie między tabelami przez określenie wielu tabel w FROM klauzuli.
Aby uzyskać informacji i zobaczyć przykład, zobacz Zestaw rekordów: wykonywanie sprzężenia (ODBC).
LpszSQL przypadku 4 = Wybierz / FROM i WHERE i/lub ORDER BY
Określ wszystko: Lista kolumn (oparte na rozmowach telefonicznych RFX w DoFieldExchange), listę tabel i 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.
LpszSQL przypadku 5 = przechowywane wywołanie procedury
Jeśli trzeba zadzwonić wstępnie zdefiniowanej kwerendy (na przykład procedurę przechowywaną w bazie danych programu Microsoft SQL Server), należy napisać CALL instrukcji w ciągu przekazać do lpszSQL.Kreatorzy nie obsługują deklarowanie klasy zestawu rekordów do wywoływania wstępnie zdefiniowanej kwerendy.Nie wszystkie wstępnie zdefiniowanych kwerend zwraca rekordów.
Jeśli wstępnie zdefiniowane kwerenda nie zwraca rekordów, można użyć CDatabase funkcji składowej ExecuteSQL bezpośrednio.Dla wstępnie zdefiniowanej kwerendy, która zwraca rekordy, należy również ręcznie napisać RFX wywołuje w DoFieldExchange dla każdej kolumny, procedura zwraca.Wywołania RFX musi znajdować się w tej samej kolejności i zwracać te same typy jako wstępnie zdefiniowanej kwerendy.Aby uzyskać dodatkowe informacje, zobacz Zestaw rekordów: deklarowanie klasy dla wstępnie zdefiniowanego zapytania (ODBC).