Bagikan melalui


Fungsi SQLSetPos

Kesesuaian
Versi Diperkenalkan: Kepatuhan Standar ODBC 1.0: ODBC

Ringkasan
SQLSetPos mengatur posisi kursor dalam set baris dan memungkinkan aplikasi untuk me-refresh data di set baris atau memperbarui atau menghapus data dalam tataan hasil.

Sintaks

  
SQLRETURN SQLSetPos(  
      SQLHSTMT        StatementHandle,  
      SQLSETPOSIROW   RowNumber,  
      SQLUSMALLINT    Operation,  
      SQLUSMALLINT    LockType);  

Argumen

StatementHandle
[Input] Handel pernyataan.

RowNumber
[Input] Posisi baris dalam set baris untuk melakukan operasi yang ditentukan dengan argumen Operasi . Jika RowNumber adalah 0, operasi berlaku untuk setiap baris dalam set baris.

Untuk informasi tambahan, lihat "Komentar."

Operasi
[Input] Operasi yang akan dilakukan:

SQL_POSITION SQL_REFRESH SQL_UPDATE SQL_DELETE

Catatan

Nilai SQL_ADD untuk argumen Operasi tidak digunakan lagi untuk ODBC 3.x. Driver ODBC 3.x perlu mendukung SQL_ADD untuk kompatibilitas mundur. Fungsionalitas ini telah digantikan oleh panggilan ke SQLBulkOperations dengan Operasi SQL_ADD. Ketika aplikasi ODBC 3.x bekerja dengan driver ODBC 2.x , Driver Manager memetakan panggilan ke SQLBulkOperations dengan Operasi SQL_ADD ke SQLSetPos dengan Operasi SQL_ADD.

Untuk informasi selengkapnya, lihat "Komentar."

LockType
[Input] Menentukan cara mengunci baris setelah melakukan operasi yang ditentukan dalam argumen Operasi .

SQL_LOCK_NO_CHANGE SQL_LOCK_EXCLUSIVE SQL_LOCK_UNLOCK

Untuk informasi selengkapnya, lihat "Komentar."

Mengembalikan

SQL_SUCCESS, SQL_SUCCESS_WITH_INFO, SQL_NEED_DATA, SQL_STILL_EXECUTING, SQL_ERROR, atau SQL_INVALID_HANDLE.

Diagnostik

Saat SQLSetPos mengembalikan SQL_ERROR atau SQL_SUCCESS_WITH_INFO, nilai SQLSTATE terkait dapat diperoleh dengan memanggil SQLGetDiagRec dengan HandleType SQL_HANDLE_STMT dan Handle of StatementHandle. Tabel berikut mencantumkan nilai SQLSTATE yang umumnya dikembalikan oleh SQLSetPos dan menjelaskan masing-masing dalam konteks fungsi ini; notasi "(DM)" mendahului deskripsi SQLSTATEs yang dikembalikan oleh Driver Manager. Kode pengembalian yang terkait dengan setiap nilai SQLSTATE SQL_ERROR, kecuali disebutkan sebaliknya.

Untuk semua SQLSTATEs yang dapat mengembalikan SQL_SUCCESS_WITH_INFO atau SQL_ERROR (kecuali 01xxxx SQLSTATEs), SQL_SUCCESS_WITH_INFO dikembalikan jika kesalahan terjadi pada satu atau beberapa, tetapi tidak semua, baris operasi multirow, dan SQL_ERROR dikembalikan jika kesalahan terjadi pada operasi satu baris.

SQLSTATE Kesalahan Deskripsi
01000 Peringatan umum Pesan informasi khusus driver. (Fungsi mengembalikan SQL_SUCCESS_WITH_INFO.)
01001 Konflik operasi kursor Argumen Operasi SQL_DELETE atau SQL_UPDATE, dan tidak ada baris atau lebih dari satu baris yang dihapus atau diperbarui. (Untuk informasi selengkapnya tentang pembaruan ke lebih dari satu baris, lihat deskripsi SQL_ATTR_SIMULATE_CURSOR Atribut di SQLSetStmtAttr.) (Fungsi mengembalikan SQL_SUCCESS_WITH_INFO.)

Argumen Operasi SQL_DELETE atau SQL_UPDATE, dan operasi gagal karena konkurensi optimis. (Fungsi mengembalikan SQL_SUCCESS_WITH_INFO.)
01004 Pemotongan kanan data string Argumen Operasi SQL_REFRESH, dan string atau data biner yang dikembalikan untuk kolom atau kolom dengan tipe data SQL_C_CHAR atau SQL_C_BINARY menghasilkan pemotongan karakter tidak kosong atau data biner non-NULL.
01S01 Kesalahan berturut-turut Argumen RowNumber adalah 0, dan terjadi kesalahan dalam satu atau beberapa baris saat melakukan operasi yang ditentukan dengan argumen Operasi .

(SQL_SUCCESS_WITH_INFO dikembalikan jika kesalahan terjadi pada satu atau beberapa, tetapi tidak semua, baris operasi multirow, dan SQL_ERROR dikembalikan jika kesalahan terjadi pada operasi satu baris.)

(SQLSTATE ini dikembalikan hanya ketika SQLSetPos dipanggil setelah SQLExtendedFetch, jika driver adalah driver ODBC 2.x dan pustaka kursor tidak digunakan.)
01S07 Pemotongan pecahan Argumen Operasi SQL_REFRESH, jenis data buffer aplikasi tidak SQL_C_CHAR atau SQL_C_BINARY, dan data yang dikembalikan ke buffer aplikasi untuk satu atau beberapa kolom terpotong. Untuk jenis data numerik, bagian pecahan dari angka dipotong. Untuk jenis data waktu, tanda waktu, dan interval yang berisi komponen waktu, bagian pecahan waktu dipotong.

(Fungsi mengembalikan SQL_SUCCESS_WITH_INFO.)
07006 Pelanggaran atribut jenis data terbatas Nilai data kolom dalam tataan hasil tidak dapat dikonversi ke jenis data yang ditentukan oleh TargetType dalam panggilan ke SQLBindCol.
07009 Indeks deskriptor tidak valid Argumen Operasi SQL_REFRESH atau SQL_UPDATE, dan kolom terikat dengan nomor kolom yang lebih besar dari jumlah kolom dalam tataan hasil.
21S02 Tingkat tabel turunan tidak cocok dengan daftar kolom Argumen Operasi SQL_UPDATE, dan tidak ada kolom yang dapat diperbarui karena semua kolom tidak terikat, baca-saja, atau nilai dalam buffer panjang/indikator terikat SQL_COLUMN_IGNORE.
22001 Data string, pemotongan kanan Argumen Operasi SQL_UPDATE, dan penetapan karakter atau nilai biner ke kolom menghasilkan pemotongan karakter atau byte nonblank (untuk karakter) atau non-null (untuk biner).
22003 Nilai numerik di luar rentang Argumen Operasi SQL_UPDATE, dan penetapan nilai numerik ke kolom dalam tataan hasil menyebabkan seluruh (dibandingkan dengan pecahan) bagian dari angka yang akan dipotong.

Argumen Operasi SQL_REFRESH, dan mengembalikan nilai numerik untuk satu atau beberapa kolom terikat akan menyebabkan hilangnya digit signifikan.
22007 Format tanggalwaktu tidak valid Argumen Operasi SQL_UPDATE, dan penetapan nilai tanggal atau tanda waktu ke kolom dalam kumpulan hasil menyebabkan bidang tahun, bulan, atau hari berada di luar rentang.

Argumen Operasi SQL_REFRESH, dan mengembalikan nilai tanggal atau tanda waktu untuk satu atau beberapa kolom terikat akan menyebabkan bidang tahun, bulan, atau hari berada di luar rentang.
22008 Bidang tanggal/waktu meluap Argumen Operasi SQL_UPDATE, dan performa aritmatika tanggalwaktu pada data yang dikirim ke kolom dalam kumpulan hasil menghasilkan bidang tanggalwaktu (bidang tahun, bulan, hari, jam, menit, atau bidang kedua) dari hasil berada di luar rentang nilai yang diizinkan untuk bidang tersebut, atau tidak valid berdasarkan aturan alami kalender Gregorian untuk tanggalwaktu.

Argumen Operasi SQL_REFRESH, dan performa aritmatika tanggalwaktu pada data yang diambil dari kumpulan hasil menghasilkan bidang tanggalwaktu (bidang tahun, bulan, hari, jam, menit, atau kedua) dari hasil berada di luar rentang nilai yang diizinkan untuk bidang tersebut, atau tidak valid berdasarkan aturan alami kalender Gregorian untuk tanggalwaktu.
22015 Meluapnya bidang interval Argumen Operasi SQL_UPDATE, dan penetapan jenis C numerik atau interval yang tepat ke jenis data SQL interval menyebabkan hilangnya digit signifikan.

Argumen Operasi SQL_UPDATE; saat menetapkan ke jenis SQL interval, tidak ada representasi nilai jenis C dalam jenis SQL interval.

Argumen Operasi SQL_REFRESH, dan menetapkan dari jenis SQL numerik atau interval yang tepat ke jenis C interval menyebabkan hilangnya digit signifikan di bidang depan.

Argumen Operasi SQL_ REFRESH; saat menetapkan ke tipe C interval, tidak ada representasi nilai jenis SQL dalam jenis interval C.
22018 Nilai karakter tidak valid untuk spesifikasi cast Argumen Operasi SQL_REFRESH; jenis C adalah jenis data numerik atau perkiraan yang tepat, tanggalwaktu, atau jenis data interval; jenis SQL kolom adalah tipe data karakter; dan nilai dalam kolom bukan harfiah yang valid dari tipe C terikat.

Argumen Operasi SQL_UPDATE; jenis SQL adalah tepat atau perkiraan numerik, tanggalwaktu, atau tipe data interval; jenis C SQL_C_CHAR; dan nilai dalam kolom bukan literal yang valid dari jenis SQL terikat.
23000 Pelanggaran batasan integritas Argumen Operasi SQL_DELETE atau SQL_UPDATE, dan batasan integritas dilanggar.
24000 Status kursor tidak valid StatementHandle berada dalam status dijalankan, tetapi tidak ada kumpulan hasil yang dikaitkan dengan StatementHandle.

(DM) Kursor terbuka pada StatementHandle, tetapi SQLFetch atau SQLFetchScroll belum dipanggil.

Kursor terbuka pada StatementHandle, dan SQLFetch atau SQLFetchScroll telah dipanggil, tetapi kursor diposisikan sebelum awal kumpulan hasil atau setelah akhir tataan hasil.

Argumen Operasi SQL_DELETE, SQL_REFRESH, atau SQL_UPDATE, dan kursor diposisikan sebelum awal kumpulan hasil atau setelah akhir tataan hasil.
40001 Kegagalan serialisasi Transaksi digulung balik karena kebuntuan sumber daya dengan transaksi lain.
40003 Penyelesaian pernyataan tidak diketahui Koneksi terkait gagal selama eksekusi fungsi ini, dan status transaksi tidak dapat ditentukan.
42000 Kesalahan sintaks atau pelanggaran akses Driver tidak dapat mengunci baris sesuai kebutuhan untuk melakukan operasi yang diminta dalam argumen Operasi.

Driver tidak dapat mengunci baris seperti yang diminta dalam argumen LockType.
44000 DENGAN PELANGGARAN OPSI PEMERIKSAAN Argumen Operasi SQL_UPDATE, dan pembaruan dilakukan pada tabel yang dilihat atau tabel yang berasal dari tabel yang dilihat yang dibuat dengan menentukan WITH CHECK OPTION, sehingga satu atau beberapa baris yang terpengaruh oleh pembaruan tidak akan ada lagi dalam tabel yang dilihat.
HY000 Kesalahan umum Terjadi kesalahan yang tidak ada SQLSTATE tertentu dan tidak ada SQLSTATE khusus implementasi yang ditentukan. Pesan kesalahan yang dikembalikan oleh SQLGetDiagRec di buffer *MessageText menjelaskan kesalahan dan penyebabnya.
HY001 Kesalahan alokasi memori Driver tidak dapat mengalokasikan memori yang diperlukan untuk mendukung eksekusi atau penyelesaian fungsi.
HY008 Operasi dibatalkan Pemrosesan asinkron diaktifkan untuk StatementHandle. Fungsi ini dipanggil, dan sebelum selesai dieksekusi, SQLCancel atau SQLCancelHandle dipanggil pada StatementHandle, dan kemudian fungsi dipanggil lagi pada StatementHandle.

Fungsi ini dipanggil, dan sebelum selesai dieksekusi, SQLCancel atau SQLCancelHandle dipanggil pada StatementHandle dari utas yang berbeda dalam aplikasi multithread.
HY010 Kesalahan urutan fungsi (DM) Fungsi eksekusi asinkron dipanggil untuk handel koneksi yang terkait dengan StatementHandle. Fungsi asinkron ini masih dijalankan ketika fungsi SQLSetPos dipanggil.

(DM) StatementHandle yang ditentukan tidak dalam status dijalankan. Fungsi ini dipanggil tanpa terlebih dahulu memanggil fungsi SQLExecDirect, SQLExecute, atau katalog.

(DM) Fungsi eksekusi asinkron (bukan yang ini) dipanggil untuk StatementHandle dan masih dijalankan ketika fungsi ini dipanggil.

(DM) SQLExecute, SQLExecDirect, SQLBulkOperations, atau SQLSetPos dipanggil untuk StatementHandle dan dikembalikan SQL_NEED_DATA. Fungsi ini dipanggil sebelum data dikirim untuk semua parameter atau kolom data-at-execution.

(DM) Driver adalah driver ODBC 2.x , dan SQLSetPos dipanggil untuk StatementHandle setelah SQLFetch dipanggil.
HY011 Atribut tidak dapat diatur sekarang (DM) Driver adalah driver ODBC 2.x ; atribut pernyataan SQL_ATTR_ROW_STATUS_PTR diatur; kemudian SQLSetPos dipanggil sebelum SQLFetch, SQLFetchScroll, atau SQLExtendedFetch dipanggil.
HY013 Kesalahan manajemen memori Panggilan fungsi tidak dapat diproses karena objek memori yang mendasar tidak dapat diakses, mungkin karena kondisi memori yang rendah.
HY090 String atau panjang buffer tidak valid Argumen Operasi SQL_UPDATE, nilai data adalah penunjuk null, dan nilai panjang kolom bukan 0, SQL_DATA_AT_EXEC, SQL_COLUMN_IGNORE, SQL_NULL_DATA, atau kurang dari atau sama dengan SQL_LEN_DATA_AT_EXEC_OFFSET.

Argumen Operasi SQL_UPDATE; nilai data bukan penunjuk null; tipe data C SQL_C_BINARY atau SQL_C_CHAR; dan nilai panjang kolom kurang dari 0 tetapi tidak sama dengan SQL_DATA_AT_EXEC, SQL_COLUMN_IGNORE, SQL_NTS, atau SQL_NULL_DATA, atau kurang dari atau sama dengan SQL_LEN_DATA_AT_EXEC_OFFSET.

Nilai dalam buffer panjang/indikator SQL_DATA_AT_EXEC; jenis SQL SQL_LONGVARCHAR, SQL_LONGVARBINARY, atau jenis data khusus sumber data yang panjang; dan jenis informasi SQL_NEED_LONG_DATA_LEN di SQLGetInfo adalah "Y".
HY092 Pengidentifikasi atribut tidak valid (DM) Nilai yang ditentukan untuk argumen Operasi tidak valid.

(DM) Nilai yang ditentukan untuk argumen LockType tidak valid.

Argumen Operasi SQL_UPDATE atau SQL_DELETE, dan atribut pernyataan SQL_ATTR_CONCURRENCY SQL_ATTR_CONCUR_READ_ONLY.
HY107 Nilai baris di luar rentang Nilai yang ditentukan untuk argumen RowNumber lebih besar dari jumlah baris dalam set baris.
HY109 Posisi kursor tidak valid Kursor yang terkait dengan StatementHandle didefinisikan sebagai forward-only, sehingga kursor tidak dapat diposisikan dalam set baris. Lihat deskripsi untuk atribut SQL_ATTR_CURSOR_TYPE di SQLSetStmtAttr.

Argumen Operasi SQL_UPDATE, SQL_DELETE, atau SQL_REFRESH, dan baris yang diidentifikasi oleh argumen RowNumber telah dihapus atau belum diambil.

(DM) Argumen RowNumber adalah 0, dan argumen Operasi SQL_POSITION.

SQLSetPos dipanggil setelah SQLBulkOperations dipanggil dan sebelum SQLFetchScroll atau SQLFetch dipanggil.
HY117 Koneksi ditangguhkan karena status transaksi yang tidak diketahui. Hanya fungsi putuskan sambungan dan baca-saja yang diizinkan. (DM) Untuk informasi selengkapnya tentang status ditangguhkan, lihat Fungsi SQLEndTran.
HYC00 Fitur opsional tidak diimplementasikan Driver atau sumber data tidak mendukung operasi yang diminta dalam argumen Operasi atau argumen LockType .
HYT00 Waktu habis kedaluwarsa Periode batas waktu kueri kedaluwarsa sebelum sumber data mengembalikan tataan hasil. Periode batas waktu diatur melalui SQLSetStmtAttr dengan Atribut SQL_ATTR_QUERY_TIMEOUT.
HYT01 Kesalahan waktu habis koneksi kedaluwarsa Periode batas waktu koneksi kedaluwarsa sebelum sumber data merespons permintaan. Periode batas waktu koneksi diatur melalui SQLSetConnectAttr, SQL_ATTR_CONNECTION_TIMEOUT.
IM001 Driver tidak mendukung fungsi ini (DM) Driver yang terkait dengan StatementHandle tidak mendukung fungsi.
IM017 Polling dinonaktifkan dalam mode pemberitahuan asinkron Setiap kali model pemberitahuan digunakan, polling dinonaktifkan.
IM018 SQLCompleteAsync belum dipanggil untuk menyelesaikan operasi asinkron sebelumnya pada handel ini. Jika panggilan fungsi sebelumnya pada handel mengembalikan SQL_STILL_EXECUTING dan jika mode pemberitahuan diaktifkan, SQLCompleteAsync harus dipanggil pada handel untuk melakukan pasca-pemrosesan dan menyelesaikan operasi.

Komentar

Perhatian

Untuk informasi tentang pernyataan menyatakan bahwa SQLSetPos dapat dipanggil dan apa yang perlu dilakukan untuk kompatibilitas dengan aplikasi ODBC 2.x , lihat Kursor Blok, Kursor yang Dapat Digulir, dan Kompatibilitas Mundur.

Argumen RowNumber

Argumen RowNumber menentukan jumlah baris dalam himpunan baris untuk melakukan operasi yang ditentukan oleh argumen Operasi . Jika RowNumber adalah 0, operasi berlaku untuk setiap baris dalam set baris. RowNumber harus berupa nilai dari 0 hingga jumlah baris dalam set baris.

Catatan

Dalam bahasa C, array berbasis 0 dan argumen RowNumber berbasis 1. Misalnya, untuk memperbarui baris kelima set baris, aplikasi memodifikasi buffer set baris pada indeks array 4 tetapi menentukan RowNumber 5.

Semua operasi memosisikan kursor pada baris yang ditentukan oleh RowNumber. Operasi berikut memerlukan posisi kursor:

  • Pernyataan pembaruan dan penghapusan yang diposisikan.

  • Panggilan ke SQLGetData.

  • Panggilan ke SQLSetPos dengan opsi SQL_DELETE, SQL_REFRESH, dan SQL_UPDATE.

Misalnya, jika RowNumber adalah 2 untuk panggilan ke SQLSetPos dengan Operasi SQL_DELETE, kursor diposisikan pada baris kedua dari set baris dan baris tersebut dihapus. Entri dalam array status baris implementasi (ditunjukkan oleh atribut pernyataan SQL_ATTR_ROW_STATUS_PTR) untuk baris kedua diubah menjadi SQL_ROW_DELETED.

Aplikasi dapat menentukan posisi kursor saat memanggil SQLSetPos. Umumnya, ini memanggil SQLSetPos dengan operasi SQL_POSITION atau SQL_REFRESH untuk memosisikan kursor sebelum menjalankan pernyataan pembaruan atau penghapusan yang diposisikan atau memanggil SQLGetData.

Argumen Operasi

Argumen Operasi mendukung operasi berikut. Untuk menentukan opsi mana yang didukung oleh sumber data, aplikasi memanggil SQLGetInfo dengan jenis informasi SQL_DYNAMIC_CURSOR_ATTRIBUTES1, SQL_FORWARD_ONLY_CURSOR_ATTRIBUTES1, SQL_KEYSET_CURSOR_ATTRIBUTES1, atau SQL_STATIC_CURSOR_ATTRIBUTES1 (tergantung pada jenis kursor).

Operasi

argumen
Operasi
SQL_POSITION Driver memposisikan kursor pada baris yang ditentukan oleh RowNumber.

Konten array status baris yang ditunjukkan oleh atribut pernyataan SQL_ATTR_ROW_OPERATION_PTR diabaikan untuk Operasi SQL_POSITION.
SQL_REFRESH Driver memposisikan kursor pada baris yang ditentukan oleh RowNumber dan menyegarkan data dalam buffer set baris untuk baris tersebut. Untuk informasi selengkapnya tentang cara driver mengembalikan data di buffer set baris, lihat deskripsi pengikatan row-wise dan column-wise di SQLBindCol.

SQLSetPos dengan Operasi SQL_REFRESH memperbarui status dan konten baris dalam set baris yang diambil saat ini. Ini termasuk merefresh marka buku. Karena data dalam buffer di-refresh tetapi tidak diambil ulang, keanggotaan dalam set baris diperbaiki. Ini berbeda dari refresh yang dilakukan oleh panggilan ke SQLFetchScroll dengan FetchOrientation SQL_FETCH_RELATIVE dan RowNumber sama dengan 0, yang mengambil kembali set baris dari kumpulan hasil sehingga dapat menampilkan data yang ditambahkan dan menghapus data yang dihapus jika operasi tersebut didukung oleh driver dan kursor.

Refresh yang berhasil dengan SQLSetPos tidak akan mengubah status baris SQL_ROW_DELETED. Baris yang dihapus dalam set baris akan terus ditandai sebagai dihapus hingga pengambilan berikutnya. Baris akan hilang pada pengambilan berikutnya jika kursor mendukung pengemasan (di mana SQLFetch atau SQLFetchScroll berikutnya tidak mengembalikan baris yang dihapus).

Baris yang ditambahkan tidak muncul saat refresh dengan SQLSetPos dilakukan. Perilaku ini berbeda dari SQLFetchScroll dengan FetchType SQL_FETCH_RELATIVE dan RowNumber sama dengan 0, yang juga me-refresh set baris saat ini tetapi akan menampilkan catatan tambahan atau mengemas rekaman yang dihapus jika operasi ini didukung oleh kursor.

Refresh yang berhasil dengan SQLSetPos akan mengubah status baris SQL_ROW_ADDED menjadi SQL_ROW_SUCCESS (jika array status baris ada).

Refresh yang berhasil dengan SQLSetPos akan mengubah status baris SQL_ROW_UPDATED ke status baru baris (jika ada array status baris).

Jika terjadi kesalahan dalam operasi SQLSetPos pada baris, status baris diatur ke SQL_ROW_ERROR (jika array status baris ada).

Untuk kursor yang dibuka dengan atribut pernyataan SQL_ATTR_CONCURRENCY SQL_CONCUR_ROWVER atau SQL_CONCUR_VALUES, refresh dengan SQLSetPos mungkin memperbarui nilai konkurensi optimis yang digunakan oleh sumber data untuk mendeteksi bahwa baris telah berubah. Jika ini terjadi, versi baris atau nilai yang digunakan untuk memastikan konkurensi kursor diperbarui setiap kali buffer set baris disegarkan dari server. Ini terjadi untuk setiap baris yang di-refresh.

Konten array status baris yang ditunjukkan oleh atribut pernyataan SQL_ATTR_ROW_OPERATION_PTR diabaikan untuk Operasi SQL_REFRESH.
SQL_UPDATE Driver memposisikan kursor pada baris yang ditentukan oleh RowNumber dan memperbarui baris data yang mendasar dengan nilai dalam buffer set baris ( argumen TargetValuePtr di SQLBindCol). Ini mengambil panjang data dari buffer panjang/indikator ( argumen StrLen_or_IndPtr di SQLBindCol). Jika panjang kolom apa pun SQL_COLUMN_IGNORE, kolom tidak diperbarui. Setelah memperbarui baris, driver mengubah elemen terkait dari array status baris menjadi SQL_ROW_UPDATED atau SQL_ROW_SUCCESS_WITH_INFO (jika array status baris ada).

Ini ditentukan driver apa perilakunya jika SQLSetPos dengan argumen Operasi SQL_UPDATE dipanggil pada kursor yang berisi kolom duplikat. Driver dapat mengembalikan SQLSTATE yang ditentukan driver, dapat memperbarui kolom pertama yang muncul dalam tataan hasil, atau melakukan perilaku lain yang ditentukan driver.

Array operasi baris yang ditunjukkan oleh atribut pernyataan SQL_ATTR_ROW_OPERATION_PTR dapat digunakan untuk menunjukkan bahwa baris dalam set baris saat ini harus diabaikan selama pembaruan massal. Untuk informasi selengkapnya, lihat "Array Status dan Operasi" nanti dalam referensi fungsi ini.
SQL_DELETE Driver memposisikan kursor pada baris yang ditentukan oleh RowNumber dan menghapus baris data yang mendasar. Ini mengubah elemen yang sesuai dari array status baris menjadi SQL_ROW_DELETED. Setelah baris dihapus, berikut ini tidak valid untuk baris: pernyataan pembaruan dan penghapusan yang diposisikan, panggilan ke SQLGetData, dan panggilan ke SQLSetPos dengan Operasi diatur ke apa pun kecuali SQL_POSITION. Untuk driver yang mendukung pengemasan, baris dihapus dari kursor saat data baru diambil dari sumber data.

Apakah baris tetap terlihat tergantung pada jenis kursor. Misalnya, baris yang dihapus terlihat oleh kursor statis dan berbasis keyset tetapi tidak terlihat oleh kursor dinamis.

Array operasi baris yang ditunjukkan oleh atribut pernyataan SQL_ATTR_ROW_OPERATION_PTR dapat digunakan untuk menunjukkan bahwa baris dalam set baris saat ini harus diabaikan selama penghapusan massal. Untuk informasi selengkapnya, lihat "Array Status dan Operasi" nanti dalam referensi fungsi ini.

Argumen LockType

Argumen LockType menyediakan cara bagi aplikasi untuk mengontrol konkurensi. Dalam kebanyakan kasus, sumber data yang mendukung tingkat konkurensi dan transaksi hanya akan mendukung nilai SQL_LOCK_NO_CHANGE argumen LockType . Argumen LockType umumnya hanya digunakan untuk dukungan berbasis file.

Argumen LockType menentukan status kunci baris setelah SQLSetPos dijalankan. Jika driver tidak dapat mengunci baris baik untuk melakukan operasi yang diminta atau untuk memenuhi argumen LockType , itu mengembalikan SQL_ERROR dan SQLSTATE 42000 (Kesalahan sintaks atau pelanggaran akses).

Meskipun argumen LockType ditentukan untuk satu pernyataan, kunci mengakordekan hak istimewa yang sama untuk semua pernyataan pada koneksi. Secara khusus, kunci yang diperoleh oleh satu pernyataan pada koneksi dapat dibuka kuncinya dengan pernyataan yang berbeda pada koneksi yang sama.

Baris yang dikunci melalui SQLSetPos tetap terkunci sampai aplikasi memanggil SQLSetPos untuk baris dengan LockType diatur ke SQL_LOCK_UNLOCK, atau sampai aplikasi memanggil SQLFreeHandle untuk pernyataan atau SQLFreeStmt dengan opsi SQL_CLOSE. Untuk driver yang mendukung transaksi, baris yang dikunci melalui SQLSetPos tidak terkunci saat aplikasi memanggil SQLEndTran untuk menerapkan atau mengembalikan transaksi pada koneksi (jika kursor ditutup ketika transaksi dilakukan atau digulung balik, seperti yang ditunjukkan oleh jenis informasi SQL_CURSOR_COMMIT_BEHAVIOR dan SQL_CURSOR_ROLLBACK_BEHAVIOR yang dikembalikan oleh SQLGetInfo).

Argumen LockType mendukung jenis kunci berikut. Untuk menentukan kunci mana yang didukung oleh sumber data, aplikasi memanggil SQLGetInfo dengan jenis informasi SQL_DYNAMIC_CURSOR_ATTRIBUTES1, SQL_FORWARD_ONLY_CURSOR_ATTRIBUTES1, SQL_KEYSET_CURSOR_ATTRIBUTES1, atau SQL_STATIC_CURSOR_ATTRIBUTES1 (tergantung pada jenis kursor).

Argumen LockType Jenis kunci
SQL_LOCK_NO_CHANGE Driver atau sumber data memastikan bahwa baris dalam keadaan terkunci atau tidak terkunci yang sama seperti sebelum SQLSetPos dipanggil. Nilai LockType ini memungkinkan sumber data yang tidak mendukung penguncian tingkat baris eksplisit untuk menggunakan penguncian apa pun yang diperlukan oleh tingkat konkurensi dan isolasi transaksi saat ini.
SQL_LOCK_EXCLUSIVE Driver atau sumber data mengunci baris secara eksklusif. Pernyataan pada koneksi yang berbeda atau dalam aplikasi yang berbeda tidak dapat digunakan untuk memperoleh kunci apa pun pada baris.
SQL_LOCK_UNLOCK Driver atau sumber data membuka kunci baris.

Jika driver mendukung SQL_LOCK_EXCLUSIVE tetapi tidak mendukung SQL_LOCK_UNLOCK, baris yang dikunci akan tetap terkunci sampai salah satu panggilan fungsi yang dijelaskan dalam paragraf sebelumnya terjadi.

Jika driver mendukung SQL_LOCK_EXCLUSIVE tetapi tidak mendukung SQL_LOCK_UNLOCK, baris yang dikunci akan tetap terkunci sampai aplikasi memanggil SQLFreeHandle untuk pernyataan atau SQLFreeStmt dengan opsi SQL_CLOSE. Jika driver mendukung transaksi dan menutup kursor setelah melakukan atau menggulung balik transaksi, aplikasi akan memanggil SQLEndTran.

Untuk operasi pembaruan dan penghapusan di SQLSetPos, aplikasi menggunakan argumen LockType sebagai berikut:

  • Untuk menjamin bahwa baris tidak berubah setelah diambil, aplikasi memanggil SQLSetPos dengan Operasi yang diatur ke SQL_REFRESH dan LockType diatur ke SQL_LOCK_EXCLUSIVE.

  • Jika aplikasi mengatur LockType ke SQL_LOCK_NO_CHANGE, driver menjamin bahwa operasi pembaruan atau penghapusan hanya akan berhasil jika aplikasi yang ditentukan SQL_CONCUR_LOCK untuk atribut pernyataan SQL_ATTR_CONCURRENCY.

  • Jika aplikasi menentukan SQL_CONCUR_ROWVER atau SQL_CONCUR_VALUES untuk atribut pernyataan SQL_ATTR_CONCURRENCY, driver membandingkan versi atau nilai baris dan menolak operasi jika baris telah berubah sejak aplikasi mengambil baris.

  • Jika aplikasi menentukan SQL_CONCUR_READ_ONLY untuk atribut pernyataan SQL_ATTR_CONCURRENCY, driver menolak operasi pembaruan atau penghapusan apa pun.

Untuk informasi selengkapnya tentang atribut pernyataan SQL_ATTR_CONCURRENCY, lihat SQLSetStmtAttr.

Array Status dan Operasi

Status dan array operasi berikut digunakan saat memanggil SQLSetPos:

  • Array status baris (seperti yang ditunjukkan oleh bidang SQL_DESC_ARRAY_STATUS_PTR di IRD dan atribut pernyataan SQL_ATTR_ROW_STATUS_ARRAY) berisi nilai status untuk setiap baris data dalam set baris. Driver mengatur nilai status dalam array ini setelah panggilan ke SQLFetch, SQLFetchScroll, SQLBulkOperations, atau SQLSetPos. Array ini ditujukkan oleh atribut pernyataan SQL_ATTR_ROW_STATUS_PTR.

  • Array operasi baris (seperti yang ditunjukkan oleh bidang SQL_DESC_ARRAY_STATUS_PTR di ARD dan atribut pernyataan SQL_ATTR_ROW_OPERATION_ARRAY) berisi nilai untuk setiap baris dalam set baris yang menunjukkan apakah panggilan ke SQLSetPos untuk operasi massal diabaikan atau dilakukan. Setiap elemen dalam array diatur ke SQL_ROW_PROCEED (default) atau SQL_ROW_IGNORE. Array ini ditujukkan oleh atribut pernyataan SQL_ATTR_ROW_OPERATION_PTR.

Jumlah elemen dalam status dan array operasi harus sama dengan jumlah baris dalam set baris (seperti yang ditentukan oleh atribut pernyataan SQL_ATTR_ROW_ARRAY_SIZE).

Untuk informasi tentang array status baris, lihat SQLFetch. Untuk informasi tentang array operasi baris, lihat "Mengabaikan Baris dalam Operasi Massal," nanti di bagian ini.

Menggunakan SQLSetPos

Sebelum aplikasi memanggil SQLSetPos, aplikasi harus melakukan urutan langkah-langkah berikut:

  1. Jika aplikasi akan memanggil SQLSetPos dengan Operasi yang diatur ke SQL_UPDATE, panggil SQLBindCol (atau SQLSetDescRec) untuk setiap kolom untuk menentukan jenis data dan buffer pengikatannya untuk data dan panjang kolom.

  2. Jika aplikasi akan memanggil SQLSetPos dengan Operasi yang diatur ke SQL_DELETE atau SQL_UPDATE, panggil SQLColAttribute untuk memastikan bahwa kolom yang akan dihapus atau diperbarui dapat diperbarui.

  3. Panggil fungsi SQLExecDirect, SQLExecute, atau katalog untuk membuat kumpulan hasil.

  4. Panggil SQLFetch atau SQLFetchScroll untuk mengambil data.

Untuk informasi selengkapnya tentang menggunakan SQLSetPos, lihat Memperbarui Data dengan SQLSetPos.

Menghapus data menggunakan SQLSetPos

Untuk menghapus data dengan SQLSetPos, aplikasi memanggil SQLSetPos dengan RowNumber yang diatur ke jumlah baris untuk dihapus dan Operasi diatur ke SQL_DELETE.

Setelah data dihapus, driver mengubah nilai dalam array status baris implementasi untuk baris yang sesuai menjadi SQL_ROW_DELETED (atau SQL_ROW_ERROR).

Memperbarui Data Menggunakan SQLSetPos

Aplikasi dapat meneruskan nilai untuk kolom baik di buffer data terikat atau dengan satu atau beberapa panggilan ke SQLPutData. Kolom yang datanya diteruskan dengan SQLPutData dikenal sebagai kolom data-at-execution. Ini biasanya digunakan untuk mengirim data untuk kolom SQL_LONGVARBINARY dan SQL_LONGVARCHAR dan dapat dicampur dengan kolom lain.

Untuk memperbarui data dengan SQLSetPos, aplikasi:

  1. Tempatkan nilai dalam buffer data dan panjang/indikator yang terikat dengan SQLBindCol:

    • Untuk kolom normal, aplikasi menempatkan nilai kolom baru dalam buffer *TargetValuePtr dan panjang nilai tersebut dalam buffer *StrLen_or_IndPtr . Jika baris tidak boleh diperbarui, aplikasi menempatkan SQL_ROW_IGNORE dalam elemen baris tersebut dari array operasi baris.

    • Untuk kolom data-at-execution, aplikasi menempatkan nilai yang ditentukan aplikasi, seperti nomor kolom, di buffer *TargetValuePtr . Nilai dapat digunakan nanti untuk mengidentifikasi kolom.

      Aplikasi menempatkan hasil makro SQL_LEN_DATA_AT_EXEC(panjang) dalam buffer *StrLen_or_IndPtr . Jika jenis data SQL kolom SQL_LONGVARBINARY, SQL_LONGVARCHAR, atau jenis data khusus sumber data panjang dan driver mengembalikan "Y" untuk jenis informasi SQL_NEED_LONG_DATA_LEN di SQLGetInfo, panjangnya adalah jumlah byte data yang akan dikirim untuk parameter; jika tidak, itu harus menjadi nilai non-negatif dan diabaikan.

  2. Memanggil SQLSetPos dengan argumen Operasi diatur ke SQL_UPDATE untuk memperbarui baris data.

    • Jika tidak ada kolom data-at-execution, proses selesai.

    • Jika ada kolom data-at-execution, fungsi mengembalikan SQL_NEED_DATA dan melanjutkan ke langkah 3.

  3. Memanggil SQLParamData untuk mengambil alamat buffer *TargetValuePtr untuk kolom data-at-execution pertama yang akan diproses. SQLParamData mengembalikan SQL_NEED_DATA. Aplikasi mengambil nilai yang ditentukan aplikasi dari buffer *TargetValuePtr .

    Catatan

    Meskipun parameter data-at-execution mirip dengan kolom data-at-execution, nilai yang dikembalikan oleh SQLParamData berbeda untuk masing-masing.

    Catatan

    Parameter data-at-execution adalah parameter dalam pernyataan SQL tempat data akan dikirim dengan SQLPutData ketika pernyataan dijalankan dengan SQLExecDirect atau SQLExecute. Mereka terikat dengan SQLBindParameter atau dengan mengatur deskriptor dengan SQLSetDescRec. Nilai yang dikembalikan oleh SQLParamData adalah nilai 32-bit yang diteruskan ke SQLBindParameter dalam argumen ParameterValuePtr.

    Catatan

    Kolom data yang dieksekusi adalah kolom dalam set baris yang datanya akan dikirim dengan SQLPutData saat baris diperbarui dengan SQLSetPos. Mereka terikat dengan SQLBindCol. Nilai yang dikembalikan oleh SQLParamData adalah alamat baris dalam buffer *TargetValuePtr yang sedang diproses.

  4. Memanggil SQLPutData satu atau beberapa kali untuk mengirim data untuk kolom. Lebih dari satu panggilan diperlukan jika semua nilai data tidak dapat dikembalikan dalam buffer *TargetValuePtr yang ditentukan dalam SQLPutData; beberapa panggilan ke SQLPutData untuk kolom yang sama hanya diperbolehkan saat mengirim data C karakter ke kolom dengan tipe data khusus karakter, biner, atau sumber data atau saat mengirim data C biner ke kolom dengan karakter, biner, atau jenis data khusus sumber data.

  5. Memanggil SQLParamData lagi untuk memberi sinyal bahwa semua data telah dikirim untuk kolom.

    • Jika ada lebih banyak kolom data saat eksekusi, SQLParamData mengembalikan SQL_NEED_DATA dan alamat buffer TargetValuePtr untuk kolom data-at-execution berikutnya yang akan diproses. Aplikasi mengulangi langkah 4 dan 5.

    • Jika tidak ada lagi kolom data-at-execution, proses selesai. Jika pernyataan berhasil dijalankan, SQLParamData mengembalikan SQL_SUCCESS atau SQL_SUCCESS_WITH_INFO; jika eksekusi gagal, maka akan mengembalikan SQL_ERROR. Pada titik ini, SQLParamData dapat mengembalikan SQLSTATE apa pun yang dapat dikembalikan oleh SQLSetPos.

Jika data telah diperbarui, driver mengubah nilai dalam array status baris implementasi untuk baris yang sesuai menjadi SQL_ROW_UPDATED.

Jika operasi dibatalkan atau terjadi kesalahan di SQLParamData atau SQLPutData, setelah SQLSetPos mengembalikan SQL_NEED_DATA dan sebelum data dikirim untuk semua kolom data-at-execution, aplikasi hanya dapat memanggil SQLCancel, SQLGetDiagField, SQLGetDiagRec, SQLGetFunctions, SQLParamData, atau SQLPutData untuk pernyataan atau koneksi yang terkait dengan pernyataan. Jika memanggil fungsi lain untuk pernyataan atau koneksi yang terkait dengan pernyataan, fungsi mengembalikan SQL_ERROR dan SQLSTATE HY010 (Kesalahan urutan fungsi).

Jika aplikasi memanggil SQLCancel saat driver masih memerlukan data untuk kolom data yang sedang dieksekusi, driver membatalkan operasi. Aplikasi kemudian dapat memanggil SQLSetPos lagi; pembatalan tidak memengaruhi status kursor atau posisi kursor saat ini.

Ketika daftar SELECT spesifikasi kueri yang terkait dengan kursor berisi lebih dari satu referensi ke kolom yang sama, apakah kesalahan dihasilkan atau driver mengabaikan referensi duplikat dan melakukan operasi yang diminta ditentukan driver.

Melakukan Operasi Massal

Jika argumen RowNumber adalah 0, driver melakukan operasi yang ditentukan dalam argumen Operasi untuk setiap baris dalam set baris yang memiliki nilai SQL_ROW_PROCEED di bidangnya dalam array operasi baris yang ditunjukkan oleh atribut pernyataan SQL_ATTR_ROW_OPERATION_PTR. Ini adalah nilai argumen RowNumber yang valid untuk argumen Operasi SQL_DELETE, SQL_REFRESH, atau SQL_UPDATE, tetapi tidak SQL_POSITION. SQLSetPos dengan Operasi SQL_POSITION dan RowNumber yang sama dengan 0 akan mengembalikan SQLSTATE HY109 (Posisi kursor tidak valid).

Jika terjadi kesalahan yang berkaitan dengan seluruh set baris, seperti SQLSTATE HYT00 (Batas Waktu habis), driver mengembalikan SQL_ERROR dan SQLSTATE yang sesuai. Konten buffer set baris tidak terdefinisi, dan posisi kursor tidak berubah.

Jika terjadi kesalahan yang berkaitan dengan satu baris, driver:

  • Mengatur elemen untuk baris dalam array status baris yang ditunjukkan oleh atribut pernyataan SQL_ATTR_ROW_STATUS_PTR ke SQL_ROW_ERROR.

  • Memposting satu atau beberapa SQLSTATEs tambahan untuk kesalahan dalam antrean kesalahan dan mengatur bidang SQL_DIAG_ROW_NUMBER dalam struktur data diagnostik.

Setelah memproses kesalahan atau peringatan, jika driver menyelesaikan operasi untuk baris yang tersisa dalam set baris, maka akan mengembalikan SQL_SUCCESS_WITH_INFO. Dengan demikian, untuk setiap baris yang mengembalikan kesalahan, antrean kesalahan berisi nol atau lebih SQLSTATEs tambahan. Jika driver menghentikan operasi setelah memproses kesalahan atau peringatan, driver akan mengembalikan SQL_ERROR.

Jika driver mengembalikan peringatan apa pun, seperti SQLSTATE 01004 (Data terpotong), driver mengembalikan peringatan yang berlaku untuk seluruh set baris atau ke baris yang tidak diketahui dalam set baris sebelum mengembalikan informasi kesalahan yang berlaku untuk baris tertentu. Ini mengembalikan peringatan untuk baris tertentu bersama dengan informasi kesalahan lainnya tentang baris tersebut.

Jika RowNumber sama dengan 0 dan Operasi SQL_UPDATE, SQL_REFRESH, atau SQL_DELETE, jumlah baris yang dioperasikan SQLSetPos ditunjukkan oleh atribut pernyataan SQL_ATTR_ROWS_FETCHED_PTR.

Jika RowNumber sama dengan 0 dan Operasi SQL_DELETE, SQL_REFRESH, atau SQL_UPDATE, baris saat ini setelah operasi sama dengan baris saat ini sebelum operasi.

Mengabaikan Baris dalam Operasi Massal

Array operasi baris dapat digunakan untuk menunjukkan bahwa baris dalam set baris saat ini harus diabaikan selama operasi massal menggunakan SQLSetPos. Untuk mengarahkan driver untuk mengabaikan satu atau beberapa baris selama operasi massal, aplikasi harus melakukan langkah-langkah berikut:

  1. Panggil SQLSetStmtAttr untuk mengatur atribut pernyataan SQL_ATTR_ROW_OPERATION_PTR untuk menunjuk ke array SQLUSMALLINTs. Bidang ini juga dapat diatur dengan memanggil SQLSetDescField untuk mengatur bidang header SQL_DESC_ARRAY_STATUS_PTR ARD, yang mengharuskan aplikasi mendapatkan handel deskriptor.

  2. Atur setiap elemen array operasi baris ke salah satu dari dua nilai:

    • SQL_ROW_IGNORE, untuk menunjukkan bahwa baris dikecualikan untuk operasi massal.

    • SQL_ROW_PROCEED, untuk menunjukkan bahwa baris disertakan dalam operasi massal. (Ini adalah nilai default.)

  3. Panggil SQLSetPos untuk melakukan operasi massal.

Aturan berikut berlaku untuk array operasi baris:

  • SQL_ROW_IGNORE dan SQL_ROW_PROCEED hanya memengaruhi operasi massal menggunakan SQLSetPos dengan Operasi SQL_DELETE atau SQL_UPDATE. Mereka tidak memengaruhi panggilan ke SQLSetPos dengan Operasi SQL_REFRESH atau SQL_POSITION.

  • Penunjuk diatur ke null secara default.

  • Jika penunjuk null, semua baris diperbarui seolah-olah semua elemen diatur ke SQL_ROW_PROCEED.

  • Mengatur elemen ke SQL_ROW_PROCEED tidak menjamin bahwa operasi akan terjadi pada baris tertentu. Misalnya, jika baris tertentu dalam set baris memiliki status SQL_ROW_ERROR, driver mungkin tidak dapat memperbarui baris tersebut terlepas dari apakah aplikasi yang ditentukan SQL_ROW_PROCEED. Aplikasi harus selalu memeriksa array status baris untuk melihat apakah operasi berhasil.

  • SQL_ROW_PROCEED didefinisikan sebagai 0 dalam file header. Aplikasi dapat menginisialisasi array operasi baris ke 0 untuk memproses semua baris.

  • Jika nomor elemen "n" dalam array operasi baris diatur ke SQL_ROW_IGNORE dan SQLSetPos dipanggil untuk melakukan operasi pembaruan atau penghapusan massal, baris ke-n dalam set baris tetap tidak berubah setelah panggilan ke SQLSetPos.

  • Aplikasi harus secara otomatis mengatur kolom baca-saja ke SQL_ROW_IGNORE.

Mengabaikan Kolom dalam Operasi Massal

Untuk menghindari diagnostik pemrosesan yang tidak perlu yang dihasilkan oleh upaya pembaruan untuk satu atau beberapa kolom baca-saja, aplikasi dapat mengatur nilai dalam buffer panjang/indikator terikat ke SQL_COLUMN_IGNORE. Untuk informasi selengkapnya, lihat SQLBindCol.

Contoh Kode

Dalam contoh berikut, aplikasi memungkinkan pengguna untuk menelusuri tabel ORDERS dan memperbarui status pesanan. Kursor digerakkan oleh keyset dengan ukuran set baris 20 dan menggunakan kontrol konkurensi optimis yang membandingkan versi baris. Setelah setiap set baris diambil, aplikasi mencetaknya dan memungkinkan pengguna untuk memilih dan memperbarui status pesanan. Aplikasi menggunakan SQLSetPos untuk memosisikan kursor pada baris yang dipilih dan melakukan pembaruan baris yang diposisikan. (Penanganan kesalahan dihilangkan untuk kejelasan.)

#define ROWS 20  
#define STATUS_LEN 6  
  
SQLCHAR        szStatus[ROWS][STATUS_LEN], szReply[3];  
SQLINTEGER     cbStatus[ROWS], cbOrderID;  
SQLUSMALLINT   rgfRowStatus[ROWS];  
SQLUINTEGER    sOrderID, crow = ROWS, irow;  
SQLHSTMT       hstmtS, hstmtU;  
  
SQLSetStmtAttr(hstmtS, SQL_ATTR_CONCURRENCY, (SQLPOINTER) SQL_CONCUR_ROWVER, 0);  
SQLSetStmtAttr(hstmtS, SQL_ATTR_CURSOR_TYPE, (SQLPOINTER) SQL_CURSOR_KEYSET_DRIVEN, 0);  
SQLSetStmtAttr(hstmtS, SQL_ATTR_ROW_ARRAY_SIZE, (SQLPOINTER) ROWS, 0);  
SQLSetStmtAttr(hstmtS, SQL_ATTR_ROW_STATUS_PTR, (SQLPOINTER) rgfRowStatus, 0);  
SQLSetCursorName(hstmtS, "C1", SQL_NTS);  
SQLExecDirect(hstmtS, "SELECT ORDERID, STATUS FROM ORDERS ", SQL_NTS);  
  
SQLBindCol(hstmtS, 1, SQL_C_ULONG, &sOrderID, 0, &cbOrderID);  
SQLBindCol(hstmtS, 2, SQL_C_CHAR, szStatus, STATUS_LEN, &cbStatus);  
  
while ((retcode == SQLFetchScroll(hstmtS, SQL_FETCH_NEXT, 0)) != SQL_ERROR) {  
   if (retcode == SQL_NO_DATA_FOUND)  
      break;  
   for (irow = 0; irow < crow; irow++) {  
      if (rgfRowStatus[irow] != SQL_ROW_DELETED)  
         printf("%2d %5d %*s\n", irow+1, sOrderID, NAME_LEN-1, szStatus[irow]);  
   }  
   while (TRUE) {  
      printf("\nRow number to update?");  
      gets_s(szReply, 3);  
      irow = atoi(szReply);  
      if (irow > 0 && irow <= crow) {  
         printf("\nNew status?");  
         gets_s(szStatus[irow-1], (ROWS * STATUS_LEN));  
         SQLSetPos(hstmtS, irow, SQL_POSITION, SQL_LOCK_NO_CHANGE);  
         SQLPrepare(hstmtU,  
          "UPDATE ORDERS SET STATUS=? WHERE CURRENT OF C1", SQL_NTS);  
         SQLBindParameter(hstmtU, 1, SQL_PARAM_INPUT,  
            SQL_C_CHAR, SQL_CHAR,  
            STATUS_LEN, 0, szStatus[irow], 0, NULL);  
         SQLExecute(hstmtU);  
      } else if (irow == 0) {  
         break;  
      }  
   }  
}  

Untuk contoh selengkapnya, lihat Pernyataan Pembaruan dan Penghapusan yang Diposisikan dan Memperbarui Baris di Set Baris dengan SQLSetPos.

Untuk informasi tentang Lihat
Mengikat buffer ke kolom dalam tataan hasil Fungsi SQLBindCol
Melakukan operasi massal yang tidak terkait dengan posisi kursor blok Fungsi SQLBulkOperations
Membatalkan pemrosesan pernyataan Fungsi SQLCancel
Mengambil blok data atau menggulir melalui kumpulan hasil Fungsi SQLFetchScroll
Mendapatkan satu bidang deskriptor Fungsi SQLGetDescField
Mendapatkan beberapa bidang deskriptor Fungsi SQLGetDescRec
Mengatur satu bidang deskriptor Fungsi SQLSetDescField
Mengatur beberapa bidang deskriptor Fungsi SQLSetDescRec
Mengatur atribut pernyataan Fungsi SQLSetStmtAttr

Lihat Juga

Referensi API ODBC
File Header ODBC