Bagikan melalui


Recordset: Mendeklarasikan Kelas untuk Kueri yang Telah Ditentukan Sebelumnya (ODBC)

Catatan

Wizard MFC ODBC Consumer tidak tersedia di Visual Studio 2019 dan yang lebih baru. Anda masih dapat membuat konsumen secara manual.

Topik ini berlaku untuk kelas MFC ODBC.

Topik ini menjelaskan cara membuat kelas recordset untuk kueri yang telah ditentukan sebelumnya (terkadang disebut prosedur tersimpan, seperti di Microsoft SQL Server).

Catatan

Topik ini berlaku untuk objek yang berasal dari CRecordset tempat pengambilan baris massal belum diimplementasikan. Jika pengambilan baris massal diimplementasikan, prosesnya sangat mirip. Untuk memahami perbedaan antara kumpulan rekaman yang menerapkan pengambilan baris massal dan yang tidak, lihat Recordset: Mengambil Rekaman secara Massal (ODBC).

Beberapa sistem manajemen database (DBMSs) memungkinkan Anda membuat kueri yang telah ditentukan sebelumnya dan memanggilnya dari program Anda seperti fungsi. Kueri memiliki nama, mungkin mengambil parameter, dan mungkin mengembalikan rekaman. Prosedur dalam topik ini menjelaskan cara memanggil kueri yang telah ditentukan sebelumnya yang mengembalikan rekaman (dan mungkin mengambil parameter).

Kelas database tidak mendukung pembaruan kueri yang telah ditentukan sebelumnya. Perbedaan antara kueri rekam jepret yang telah ditentukan sebelumnya dan kueri yang ditentukan sebelumnya tidak dapat diperbarui tetapi apakah perubahan yang dilakukan oleh pengguna lain (atau kumpulan rekaman lain dalam program Anda) terlihat di kumpulan catatan Anda.

Tip

Anda tidak memerlukan kumpulan rekaman untuk memanggil kueri yang telah ditentukan sebelumnya yang tidak mengembalikan rekaman. Siapkan pernyataan SQL seperti yang dijelaskan di bawah ini, tetapi jalankan dengan memanggil CDatabase fungsi anggota ExecuteSQL.

Anda dapat membuat satu kelas recordset untuk mengelola panggilan kueri yang telah ditentukan sebelumnya, tetapi Anda harus melakukan beberapa pekerjaan sendiri. Panduan tidak mendukung pembuatan kelas khusus untuk tujuan ini.

Untuk membuat kelas untuk memanggil kueri yang telah ditentukan sebelumnya (prosedur tersimpan)

  1. Gunakan MFC ODBC Consumer Wizard dari Tambahkan Kelas untuk membuat kelas recordset untuk tabel yang berkontribusi paling banyak kolom yang dikembalikan oleh kueri. Ini memberimu awalan.

  2. Tambahkan anggota data bidang secara manual untuk kolom tabel apa pun yang dikembalikan kueri tetapi panduan tidak dibuat untuk Anda.

    Misalnya, jika kueri mengembalikan tiga kolom masing-masing dari dua tabel tambahan, tambahkan enam anggota data bidang (dari jenis data yang sesuai) ke kelas .

  3. Tambahkan panggilan fungsi RFX secara manual dalam fungsi anggota DoFieldExchange kelas, satu yang sesuai dengan jenis data dari setiap anggota data bidang yang ditambahkan.

    Immediately before these RFX calls, call <MSHelp:link keywords="_mfc_CFieldExchange.3a3a.SetFieldType" TABINDEX="0">SetFieldType</MSHelp:link>, as shown here:
    pFX->SetFieldType( CFieldExchange::outputColumn );
    

    Catatan

    Anda harus mengetahui jenis data dan urutan kolom yang dikembalikan dalam tataan hasil. Urutan panggilan fungsi RFX harus DoFieldExchange sesuai dengan urutan kolom tataan hasil.

  4. Tambahkan inisialisasi secara manual untuk anggota data bidang baru di konstruktor kelas recordset.

    Anda juga harus menaikkan nilai inisialisasi untuk anggota data m_nFields . Wizard menulis inisialisasi, tetapi hanya mencakup anggota data bidang yang ditambahkannya untuk Anda. Contohnya:

    m_nFields += 6;
    

    Beberapa jenis data tidak boleh diinisialisasi di sini, misalnya, CLongBinary atau array byte.

  5. Jika kueri mengambil parameter, tambahkan anggota data parameter untuk setiap parameter, panggilan fungsi RFX untuk masing-masing, dan inisialisasi untuk masing-masing.

  6. Anda harus menambah m_nParams untuk setiap parameter yang ditambahkan, seperti yang Anda lakukan m_nFields untuk bidang tambahan di langkah 4 prosedur ini. Untuk informasi selengkapnya, lihat Recordset: Parameterizing a Recordset (ODBC).

  7. Tulis string pernyataan SQL secara manual dengan formulir berikut:

    {CALL proc-name [(? [, ?]...)]}
    

    di mana CALL adalah kata kunci ODBC, nama proc adalah nama kueri seperti yang diketahui pada sumber data, dan item "?" adalah tempat penampung untuk nilai parameter yang Anda berikan ke kumpulan rekaman pada run time (jika ada). Contoh berikut menyiapkan tempat penampung untuk satu parameter:

    CString mySQL = "{CALL Delinquent_Accts (?)}";
    
  8. Dalam kode yang membuka kumpulan rekaman, atur nilai anggota data parameter kumpulan rekaman lalu panggil Open fungsi anggota, lewati string SQL Anda untuk parameter lpszSQL . Atau sebagai gantinya, ganti string yang GetDefaultSQL dikembalikan oleh fungsi anggota di kelas Anda.

Contoh berikut menunjukkan prosedur untuk memanggil kueri yang telah ditentukan sebelumnya, bernama Delinquent_Accts, yang mengambil satu parameter untuk nomor distrik penjualan. Kueri ini mengembalikan tiga kolom: Acct_No, , L_NamePhone. Semua kolom berasal dari tabel Pelanggan.

Himpunan catatan berikut menentukan anggota data bidang untuk kolom yang dikembalikan kueri dan parameter untuk nomor distrik penjualan yang diminta pada waktu proses.

class CDelinquents : public CRecordset
{
// Field/Param Data
    LONG m_lAcct_No;
    CString m_strL_Name;
    CString m_strPhone;
    LONG m_lDistParam;
    // ...
};

Deklarasi kelas ini adalah saat wizard menulisnya, kecuali untuk anggota yang m_lDistParam ditambahkan secara manual. Anggota lain tidak ditampilkan di sini.

Contoh berikutnya menunjukkan inisialisasi untuk anggota data di CDelinquents konstruktor.

CDelinquents::CDelinquents(CDatabase* pdb)
   : CRecordset(pdb)
{
    // Wizard-generated params:
    m_lAcct_No = 0;
    m_strL_Name = "";
    m_strPhone = "";
    m_nFields = 3;
    // User-defined params:
    m_nParams = 1;
    m_lDistParam = 0;
}

Perhatikan inisialisasi untuk m_nFields dan m_nParams. Wizard menginisialisasi m_nFields; Anda menginisialisasi m_nParams.

Contoh berikutnya menunjukkan fungsi RFX di CDelinquents::DoFieldExchange:

void CDelinquents::DoFieldExchange(CFieldExchange* pFX)
{
    pFX->SetFieldType(CFieldExchange::outputColumn);
    RFX_Long(pFX, "Acct_No", m_lAcct_No);
    RFX_Text(pFX, "L_Name", m_strL_Name);
    RFX_Text(pFX, "Phone", m_strPhone);
    pFX->SetFieldType(CFieldExchange::param);
    RFX_Long(pFX, "Dist_No", m_lDistParam);
}

Selain melakukan panggilan RFX untuk tiga kolom yang dikembalikan, kode ini mengelola pengikatan parameter yang Anda lewati pada waktu proses. Parameter di-key ke Dist_No kolom (nomor distrik).

Contoh berikutnya menunjukkan cara menyiapkan string SQL dan cara menggunakannya untuk membuka kumpulan catatan.

// Construct a CDelinquents recordset object
CDelinquents rsDel( NULL );
CString strSQL = "{CALL Delinquent_Accts (?)}"
// Specify a parameter value (obtained earlier from the user)
rsDel.m_lDistParam = lDistrict;
// Open the recordset and run the query
if( rsDel.Open( CRecordset::snapshot, strSQL ) )
    // Use the recordset ...

Kode ini membuat rekam jepret, meneruskannya parameter yang diperoleh sebelumnya dari pengguna, dan memanggil kueri yang telah ditentukan sebelumnya. Saat kueri berjalan, kueri mengembalikan rekaman untuk distrik penjualan yang ditentukan. Setiap rekaman berisi kolom untuk nomor akun, nama belakang pelanggan, dan nomor telepon pelanggan.

Tip

Anda mungkin ingin menangani nilai pengembalian (parameter output) dari prosedur tersimpan. Untuk informasi selengkapnya dan contohnya, lihat CFieldExchange::SetFieldType.

Baca juga

Recordset (ODBC)
Recordset: Mengkueri ulang Recordset (ODBC)
Recordset: Mendeklarasikan Kelas untuk Tabel (ODBC)
Recordset: Melakukan Gabungan (ODBC)