Bagikan melalui


SQL: Menyesuaikan Pernyataan SQL Recordset Anda (ODBC)

Topik ini menjelaskan:

  • Bagaimana kerangka kerja membuat pernyataan SQL

  • Cara mengambil alih pernyataan SQL

Catatan

Informasi ini berlaku untuk kelas MFC ODBC. Jika Anda bekerja dengan kelas MFC DAO, lihat topik "Perbandingan Microsoft Jet Database Engine SQL dan ANSI SQL" di Bantuan DAO.

Konstruksi Pernyataan SQL

Pemilihan rekaman basis rekaman Anda terutama pada pernyataan SQL SELECT . Saat Anda mendeklarasikan kelas Anda dengan wizard, kelas menulis versi penggantian GetDefaultSQL fungsi anggota yang terlihat seperti ini (untuk kelas recordset yang disebut CAuthors).

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

Secara default, penimpaan ini mengembalikan nama tabel yang Anda tentukan dengan wizard. Dalam contoh, nama tabel adalah "AUTHORS." Saat Nanti Anda memanggil fungsi anggota kumpulan rekamanOpen, Open buat pernyataan SELECT akhir formulir:

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

di mana table-name diperoleh dengan memanggil GetDefaultSQL dan rfx-field-list diperoleh dari panggilan fungsi RFX di DoFieldExchange. Inilah yang Anda dapatkan untuk pernyataan SELECT kecuali Anda menggantinya dengan versi penimpaan pada waktu proses, meskipun Anda juga dapat mengubah pernyataan default dengan parameter atau filter.

Catatan

Jika Anda menentukan nama kolom yang berisi spasi (atau dapat berisi), Anda harus mengapit nama dalam tanda kurung siku. Misalnya, nama "Nama Depan" harus "[Nama Depan]".

Untuk mengambil alih pernyataan SELECT default, berikan string yang berisi pernyataan SELECT lengkap saat Anda memanggil Open. Alih-alih membuat string defaultnya sendiri, recordset menggunakan string yang Anda berikan. Jika pernyataan pengganti Anda berisi klausa WHERE , jangan tentukan filter karena m_strFilter Anda kemudian akan memiliki dua pernyataan filter. Demikian pula, jika pernyataan pengganti Anda berisi klausa ORDER BY , jangan tentukan pengurutan m_strSort sehingga Anda tidak akan memiliki dua pernyataan pengurutan.

Catatan

Jika Anda menggunakan string harfiah dalam filter Anda (atau bagian lain dari pernyataan SQL), Anda mungkin harus "mengutip" (mengapit pemisah yang ditentukan) string tersebut dengan awalan literal khusus DBMS dan karakter akhiran literal (atau karakter).

Anda mungkin juga menemukan persyaratan sintik khusus untuk operasi seperti gabungan luar, tergantung pada DBMS Anda. Gunakan fungsi ODBC untuk mendapatkan informasi ini dari driver Anda untuk DBMS. Misalnya, panggil ::SQLGetTypeInfo jenis data tertentu, seperti SQL_VARCHAR, untuk meminta karakter LITERAL_PREFIX dan LITERAL_SUFFIX. Jika Anda menulis kode independen database, lihat Lampiran C: Tata Bahasa SQL di Referensi Programmer ODBC untuk informasi sintaks terperinci.

Objek recordset membuat pernyataan SQL yang digunakannya untuk memilih rekaman kecuali Anda meneruskan pernyataan SQL kustom. Bagaimana hal ini dilakukan terutama tergantung pada nilai yang Anda berikan dalam parameter lpszSQL dari Open fungsi anggota.

Bentuk umum pernyataan SQL SELECT adalah:

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

Salah satu cara untuk menambahkan kata kunci DISTINCT ke pernyataan SQL recordset Anda adalah dengan menyematkan kata kunci dalam panggilan fungsi RFX pertama di DoFieldExchange. Contoh:

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

Catatan

Gunakan teknik ini hanya dengan recordset yang dibuka sebagai baca-saja.

Mengesampingkan Pernyataan SQL

Tabel berikut menunjukkan kemungkinan untuk parameter lpszSQL ke Open. Kasus dalam tabel dijelaskan mengikuti tabel.

Parameter lpszSQL dan String SQL yang Dihasilkan

Case Apa yang Anda berikan di lpszSQL Pernyataan SELECT yang dihasilkan
1 NULL SELECT rfx-field-list FROM table-name

CRecordset::OpenGetDefaultSQL panggilan untuk mendapatkan nama tabel. String yang dihasilkan adalah salah satu kasus 2 hingga 5, tergantung pada pengembalian apa GetDefaultSQL .
2 Nama tabel SELECT rfx-field-list FROM table-name

Daftar bidang diambil dari pernyataan RFX di DoFieldExchange. Jika m_strFilter dan m_strSort tidak kosong, tambahkan klausa WHERE dan/atau ORDER BY .
3 * Pernyataan SELECT lengkap tetapi tanpa klausa WHERE atau ORDER BY Seperti yang dilewati. Jika m_strFilter dan m_strSort tidak kosong, tambahkan klausa WHERE dan/atau ORDER BY .
4 * Pernyataan SELECT lengkap dengan klausa WHERE dan/atau ORDER BY Seperti yang dilewati. m_strFilter dan/atau m_strSort harus tetap kosong, atau dua pernyataan filter dan/atau pengurutan dihasilkan.
5 * Panggilan ke prosedur tersimpan Seperti yang dilewati.

* m_nFields harus kurang dari atau sama dengan jumlah kolom yang ditentukan dalam pernyataan SELECT . Jenis data dari setiap kolom yang ditentukan dalam pernyataan SELECT harus sama dengan jenis data kolom output RFX yang sesuai.

Kasus 1 lpszSQL = NULL

Pilihan kumpulan rekaman tergantung pada apa yang GetDefaultSQL kembali saat CRecordset::Open memanggilnya. Kasus 2 hingga 5 menjelaskan kemungkinan string.

Kasus 2 lpszSQL = Nama Tabel

Himpunan catatan menggunakan pertukaran bidang rekaman (RFX) untuk membangun daftar kolom dari nama kolom yang disediakan dalam panggilan fungsi RFX dalam penimpaan kelas recordset dari DoFieldExchange. Jika Anda menggunakan wizard untuk mendeklarasikan kelas recordset Anda, kasus ini memiliki hasil yang sama dengan kasus 1 (asalkan Anda meneruskan nama tabel yang sama dengan yang Anda tentukan dalam wizard). Jika Anda tidak menggunakan wizard untuk menulis kelas Anda, kasus 2 adalah cara paling sederhana untuk membuat pernyataan SQL.

Contoh berikut membuat pernyataan SQL yang memilih rekaman dari aplikasi database MFC. Saat kerangka kerja memanggil GetDefaultSQL fungsi anggota, fungsi mengembalikan nama tabel, SECTION.

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

Untuk mendapatkan nama kolom untuk pernyataan SQL SELECT , kerangka kerja memanggil DoFieldExchange fungsi anggota.

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

Setelah selesai, pernyataan SQL terlihat seperti ini:

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

Kasus 3 lpszSQL = Pernyataan SELECT/FROM

Anda menentukan daftar kolom secara manual daripada mengandalkan RFX untuk membangunnya secara otomatis. Anda mungkin ingin melakukan ini ketika:

  • Anda ingin menentukan kata kunci DISTINCT setelah SELECT.

    Daftar kolom Anda harus cocok dengan nama dan jenis kolom dalam urutan yang sama seperti yang tercantum dalam DoFieldExchange.

  • Anda memiliki alasan untuk mengambil nilai kolom secara manual menggunakan fungsi ::SQLGetData ODBC daripada mengandalkan RFX untuk mengikat dan mengambil kolom untuk Anda.

    Misalnya, Anda mungkin ingin mengakomodasi kolom baru yang ditambahkan pelanggan aplikasi Anda ke tabel database setelah aplikasi didistribusikan. Anda perlu menambahkan anggota data bidang tambahan ini, yang tidak diketahui pada saat Anda mendeklarasikan kelas dengan wizard.

    Daftar kolom Anda harus cocok dengan nama dan jenis kolom dalam urutan yang sama seperti yang tercantum dalam DoFieldExchange, diikuti dengan nama kolom yang terikat secara manual. Untuk informasi selengkapnya, lihat Recordset: Dynamically Binding Data Columns (ODBC).

  • Anda ingin menggabungkan tabel dengan menentukan beberapa tabel dalam klausa FROM .

    Untuk informasi dan contohnya, lihat Recordset: Melakukan Gabungan (ODBC).

Kasus 4 lpszSQL = SELECT/FROM Plus WHERE dan/atau ORDER BY

Anda menentukan semuanya: daftar kolom (berdasarkan panggilan RFX di DoFieldExchange), daftar tabel, dan konten klausa WHERE dan/atau ORDER BY . Jika Anda menentukan klausa WHERE dan/atau ORDER BY Anda dengan cara ini, jangan gunakan m_strFilter dan/atau m_strSort.

Kasus 5 lpszSQL = Panggilan Prosedur Tersimpan

Jika Anda perlu memanggil kueri yang telah ditentukan sebelumnya (seperti prosedur tersimpan dalam database Microsoft SQL Server), Anda harus menulis pernyataan CALL dalam string yang Anda teruskan ke lpszSQL. Panduan tidak mendukung deklarasikan kelas recordset untuk memanggil kueri yang telah ditentukan sebelumnya. Tidak semua kueri yang telah ditentukan sebelumnya mengembalikan rekaman.

Jika kueri yang telah ditentukan sebelumnya tidak mengembalikan rekaman, Anda bisa menggunakan fungsi ExecuteSQL anggota secara CDatabase langsung. Untuk kueri yang telah ditentukan sebelumnya yang mengembalikan rekaman, Anda juga harus menulis panggilan DoFieldExchange RFX secara manual untuk kolom apa pun yang dikembalikan prosedur. Panggilan RFX harus dalam urutan yang sama dan mengembalikan jenis yang sama, seperti kueri yang telah ditentukan sebelumnya. Untuk informasi selengkapnya, lihat Recordset: Mendeklarasikan Kelas untuk Kueri yang Telah Ditentukan (ODBC).

Lihat juga

SQL: Jenis Data SQL dan C++ (ODBC)
SQL: Melakukan Panggilan SQL Langsung (ODBC)