Bagikan melalui


Recordset: Cara MenambahkanBaru, Mengedit, dan Menghapus Pekerjaan (ODBC)

Topik ini berlaku untuk kelas MFC ODBC.

Topik ini menjelaskan cara AddNewkerja fungsi anggota kelas CRecordset , Edit, dan Delete . Topik yang dibahas meliputi:

Catatan

Topik ini berlaku untuk objek yang berasal dari CRecordset tempat pengambilan baris massal belum diimplementasikan. Jika Anda menggunakan pengambilan baris massal, lihat Recordset: Mengambil Rekaman secara Massal (ODBC).

Sebagai suplemen, Anda mungkin ingin membaca Record Field Exchange: Cara Kerja RFX, yang menjelaskan peran RFX yang sesuai dalam operasi pembaruan.

Menambahkan Rekaman

Menambahkan rekaman baru ke kumpulan rekaman melibatkan panggilan fungsi Tambahkan Anggota baru dari kumpulan rekaman, mengatur nilai anggota data bidang rekaman baru, dan memanggil fungsi Perbarui anggota untuk menulis rekaman ke sumber data.

Sebagai prasyarat untuk memanggil AddNew, kumpulan rekaman tidak boleh dibuka sebagai baca-saja. Fungsi CanUpdate anggota dan CanAppend memungkinkan Anda menentukan kondisi ini.

Saat Anda memanggil AddNew:

  • Rekaman dalam buffer edit disimpan, sehingga kontennya dapat dipulihkan jika operasi dibatalkan.

  • Anggota data bidang ditandai sehingga dimungkinkan untuk mendeteksi perubahan di dalamnya nanti. Anggota data bidang juga ditandai bersih (tidak berubah) dan diatur ke Null.

Setelah Anda memanggil AddNew, buffer edit mewakili rekaman baru yang kosong, siap untuk diisi dengan nilai. Untuk melakukan ini, Anda mengatur nilai secara manual dengan menetapkannya. Alih-alih menentukan nilai data aktual untuk bidang, Anda dapat memanggil SetFieldNull untuk menentukan nilai Null.

Untuk menerapkan perubahan, Anda memanggil Update. Saat Anda memanggil Update rekaman baru:

  • Jika driver ODBC Anda mendukung ::SQLSetPos fungsi ODBC API, MFC menggunakan fungsi untuk menambahkan rekaman pada sumber data. Dengan ::SQLSetPos, MFC dapat menambahkan catatan secara lebih efisien karena tidak harus membuat dan memproses pernyataan SQL.

  • Jika ::SQLSetPos tidak dapat digunakan, MFC melakukan hal berikut:

    1. Jika tidak ada perubahan yang terdeteksi, Update tidak melakukan apa pun dan mengembalikan 0.

    2. Jika ada perubahan, Update buat pernyataan SQL INSERT . Kolom yang diwakili oleh semua anggota data bidang kotor tercantum dalam pernyataan INSERT . Untuk memaksa kolom disertakan, panggil fungsi anggota SetFieldDirty :

      SetFieldDirty( &m_dataMember, TRUE );
      
    3. Update menerapkan rekaman baru — pernyataan INSERT dijalankan dan rekaman diterapkan ke tabel pada sumber data (dan kumpulan rekaman, jika bukan rekam jepret) kecuali transaksi sedang berlangsung.

    4. Rekaman tersimpan dipulihkan ke buffer edit. Rekaman yang saat ini sebelum AddNew panggilan dijalankan lagi terlepas dari apakah pernyataan INSERT berhasil dijalankan.

    Tip

    Untuk kontrol lengkap rekaman baru, ambil pendekatan berikut: atur nilai bidang apa pun yang akan memiliki nilai dan kemudian secara eksplisit mengatur bidang apa pun yang akan tetap Null dengan memanggil SetFieldNull dengan penunjuk ke bidang dan parameter TRUE (default). Jika Anda ingin memastikan bahwa bidang tidak ditulis ke sumber data, panggil SetFieldDirty dengan penunjuk ke bidang dan parameter FALSE, dan jangan ubah nilai bidang. Untuk menentukan apakah bidang diizinkan menjadi Null, panggil IsFieldNullable.

    Tip

    Untuk mendeteksi kapan anggota data kumpulan rekaman mengubah nilai, MFC menggunakan nilai PSEUDO_NULL yang sesuai dengan setiap jenis data yang dapat Anda simpan dalam kumpulan rekaman. Jika Anda harus secara eksplisit mengatur bidang ke nilai PSEUDO_NULL dan bidang sudah ditandai Null, Anda juga harus memanggil SetFieldNull, meneruskan alamat bidang dalam parameter pertama dan FALSE di parameter kedua.

Visibilitas Rekaman yang Ditambahkan

Kapan catatan tambahan terlihat oleh kumpulan rekaman Anda? Rekaman yang ditambahkan terkadang muncul dan terkadang tidak terlihat, tergantung pada dua hal:

  • Apa yang dapat dilakukan sopir Anda.

  • Apa yang dapat dimanfaatkan kerangka kerja.

Jika driver ODBC Anda mendukung ::SQLSetPos fungsi ODBC API, MFC menggunakan fungsi untuk menambahkan rekaman. Dengan ::SQLSetPos, rekaman tambahan terlihat oleh kumpulan catatan MFC yang dapat diperbarui. Tanpa dukungan untuk fungsi, rekaman yang ditambahkan tidak terlihat dan Anda harus memanggil Requery untuk melihatnya. Penggunaan ::SQLSetPos juga lebih efisien.

Mengedit Rekaman yang Sudah Ada

Mengedit rekaman yang sudah ada dalam kumpulan rekaman melibatkan pengguliran ke rekaman, memanggil fungsi Edit anggota kumpulan rekaman, mengatur nilai anggota data bidang rekaman baru, dan memanggil fungsi Perbarui anggota untuk menulis rekaman yang diubah ke sumber data.

Sebagai prasyarat untuk memanggil Edit, recordset harus dapat diperbarui dan pada rekaman. Fungsi CanUpdate anggota dan IsDeleted memungkinkan Anda menentukan kondisi ini. Rekaman saat ini juga belum boleh dihapus, dan harus ada rekaman dalam kumpulan rekaman (keduanya IsBOF dan IsEOF mengembalikan 0).

Saat Anda memanggil Edit, rekaman di buffer edit (rekaman saat ini) disimpan. Nilai rekaman tersimpan nantinya digunakan untuk mendeteksi apakah ada bidang yang telah berubah.

Setelah Anda memanggil Edit, buffer edit masih mewakili rekaman saat ini tetapi sekarang siap untuk menerima perubahan pada anggota data bidang. Untuk mengubah catatan, Anda mengatur nilai setiap anggota data bidang yang ingin Anda edit secara manual. Alih-alih menentukan nilai data aktual untuk bidang, Anda dapat memanggil SetFieldNull untuk menentukan nilai Null. Untuk menerapkan perubahan Anda, panggil Update.

Tip

Untuk keluar dari AddNew mode atau Edit , hubungi Move dengan parameter AFX_MOVE_REFRESH.

Sebagai prasyarat untuk memanggil Update, kumpulan rekaman tidak boleh kosong dan rekaman saat ini tidak boleh dihapus. IsBOF, IsEOF, dan IsDeleted semua harus mengembalikan 0.

Saat Anda memanggil Update rekaman yang diedit:

  • Jika driver ODBC Anda mendukung ::SQLSetPos fungsi ODBC API, MFC menggunakan fungsi untuk memperbarui rekaman pada sumber data. Dengan ::SQLSetPos, driver membandingkan buffer edit Anda dengan rekaman yang sesuai di server, memperbarui rekaman di server jika keduanya berbeda. Dengan ::SQLSetPos, MFC dapat memperbarui catatan secara lebih efisien karena tidak perlu membuat dan memproses pernyataan SQL.

    - atau -

  • Jika ::SQLSetPos tidak dapat digunakan, MFC melakukan hal berikut:

    1. Jika belum ada perubahan, Update tidak melakukan apa pun dan mengembalikan 0.

    2. Jika ada perubahan, Update buat pernyataan PEMBARUAN SQL. Kolom yang tercantum dalam pernyataan UPDATE didasarkan pada anggota data bidang yang telah berubah.

    3. Update menerapkan perubahan — menjalankan pernyataan UPDATE — dan rekaman diubah pada sumber data, tetapi tidak dilakukan jika transaksi sedang berlangsung (lihat Transaksi: Melakukan Transaksi dalam Recordset (ODBC) untuk informasi tentang bagaimana transaksi memengaruhi pembaruan). ODBC menyimpan salinan catatan, yang juga berubah.

    4. Tidak seperti proses untuk AddNew, Edit proses tidak memulihkan rekaman yang disimpan. Rekaman yang diedit tetap ada sebagai rekaman saat ini.

    Perhatian

    Saat Anda bersiap untuk memperbarui kumpulan rekaman dengan memanggil Update, berhati-hatilah bahwa kumpulan catatan Anda menyertakan semua kolom yang membentuk kunci utama tabel (atau semua kolom indeks unik apa pun pada tabel, atau kolom yang cukup untuk mengidentifikasi baris secara unik). Dalam beberapa kasus, kerangka kerja hanya dapat menggunakan kolom yang dipilih di kumpulan catatan Anda untuk mengidentifikasi rekaman mana dalam tabel yang akan diperbarui. Tanpa semua kolom yang diperlukan, beberapa rekaman mungkin diperbarui dalam tabel. Dalam hal ini, kerangka kerja melempar pengecualian saat Anda memanggil Update.

    Tip

    Jika Anda memanggil AddNew atau Edit setelah memanggil salah satu fungsi sebelumnya tetapi sebelum Anda memanggil Update, buffer edit di-refresh dengan rekaman tersimpan, mengganti rekaman baru atau yang diedit sedang berlangsung. Perilaku ini memberi Anda cara untuk membatalkan AddNew atau Edit dan memulai yang baru: jika Anda menentukan bahwa rekaman yang sedang berlangsung rusak, cukup panggil Edit atau AddNew lagi.

Menghapus Rekaman

Menghapus rekaman dari kumpulan rekaman melibatkan pengguliran ke rekaman dan memanggil fungsi Hapus anggota kumpulan rekaman. Tidak seperti AddNew dan Edit, Delete tidak memerlukan panggilan yang cocok ke Update.

Sebagai prasyarat untuk memanggil Delete, recordset harus dapat diperbarui dan harus ada di rekaman. Fungsi CanUpdateanggota , IsBOF, IsEOF, dan IsDeleted memungkinkan Anda menentukan kondisi ini.

Saat Anda memanggil Delete:

  • Jika driver ODBC Anda mendukung ::SQLSetPos fungsi ODBC API, MFC menggunakan fungsi untuk menghapus rekaman pada sumber data. Penggunaan ::SQLSetPos biasanya lebih efisien daripada menggunakan SQL.

    - atau -

  • Jika ::SQLSetPos tidak dapat digunakan, MFC melakukan hal berikut:

    1. Rekaman saat ini dalam buffer edit tidak dicadangkan sebagai dalam AddNew dan Edit.

    2. Delete membuat pernyataan SQL DELETE yang menghapus rekaman.

      Rekaman saat ini dalam buffer edit tidak disimpan sebagai dalam AddNew dan Edit.

    3. Delete melakukan penghapusan — menjalankan pernyataan DELETE . Rekaman ditandai dihapus pada sumber data dan, jika rekaman adalah rekam jepret, di ODBC.

    4. Nilai rekaman yang dihapus masih berada di anggota data bidang dari kumpulan rekaman, tetapi anggota data bidang ditandai Null dan fungsi anggota kumpulan rekaman IsDeleted mengembalikan nilai bukan nol.

    Catatan

    Setelah menghapus rekaman, Anda harus menggulir ke rekaman lain untuk mengisi ulang buffer edit dengan data rekaman baru. Ini adalah kesalahan untuk memanggil Delete lagi atau untuk memanggil Edit.

Untuk informasi tentang pernyataan SQL yang digunakan dalam operasi pembaruan, lihat SQL.

Lihat juga

Recordset (ODBC)
Recordset: Selengkapnya tentang pembaruan (ODBC)
Pertukaran Bidang Rekaman (RFX)