Bagikan melalui


Menulis Aplikasi ODBC 3.x

Ketika aplikasi ODBC 2.x ditingkatkan ke ODBC 3.x, aplikasi tersebut harus ditulis sedemikian sehingga berfungsi dengan driver ODBC 2.x dan 3.x . Aplikasi harus menggabungkan kode bersyarat untuk memanfaatkan sepenuhnya fitur ODBC 3.x .

Atribut lingkungan SQL_ATTR_ODBC_VERSION harus diatur ke SQL_OV_ODBC2. Ini akan memastikan bahwa driver bereaksi seperti driver ODBC 2.x sehubungan dengan perubahan yang dijelaskan di bagian Perubahan Perilaku.

Jika aplikasi akan menggunakan salah satu fitur yang dijelaskan di bagian Fitur Baru, kode bersyarat harus digunakan untuk menentukan apakah driver adalah driver ODBC 3.x atau ODBC 2.x . Aplikasi ini menggunakan SQLGetDiagField dan SQLGetDiagRec untuk mendapatkan ODBC 3.x SQLSTATEs saat melakukan pemrosesan kesalahan pada fragmen kode kondisional ini. Poin-poin berikut tentang fungsionalitas baru harus dipertimbangkan:

  • Aplikasi yang terpengaruh oleh perubahan perilaku ukuran set baris harus berhati-hati untuk tidak memanggil SQLFetch ketika ukuran array lebih besar dari 1. Aplikasi ini harus mengganti panggilan ke SQLExtendedFetch dengan panggilan ke SQLSetStmtAttr untuk mengatur atribut pernyataan SQL_ATTR_ARRAY_STATUS_PTR dan ke SQLFetchScroll, sehingga mereka memiliki kode umum yang berfungsi dengan driver ODBC 3.x dan ODBC 2.x . Karena SQLSetStmtAttr dengan SQL_ATTR_ROW_ARRAY_SIZE akan dipetakan ke SQLSetStmtAttr dengan SQL_ROWSET_SIZE untuk driver ODBC 2.x , aplikasi hanya dapat mengatur SQL_ATTR_ROW_ARRAY_SIZE untuk operasi pengambilan multirow mereka.

  • Sebagian besar aplikasi yang memutakhirkan sebenarnya tidak terpengaruh oleh perubahan kode SQLSTATE. Untuk aplikasi yang terpengaruh, mereka dapat melakukan pencarian mekanis dan mengganti dalam kebanyakan kasus menggunakan tabel konversi kesalahan di bagian "Pemetaan SQLSTATE" untuk mengonversi kode kesalahan ODBC 3.x ke kode ODBC 2.x . Karena Odbc 3.x Driver Manager akan melakukan pemetaan dari ODBC 2.x SQLSTATEs ke ODBC 3.x SQLSTATEs, penulis aplikasi ini hanya perlu memeriksa ODBC 3.x SQLSTATEs dan tidak khawatir tentang menyertakan ODBC 2.x SQLSTATEs dalam kode bersyarat.

  • Jika aplikasi sangat menggunakan jenis data tanggal, waktu, dan tanda waktu, aplikasi dapat mendeklarasikan dirinya sebagai aplikasi ODBC 2.x dan menggunakan kode yang ada alih-alih menggunakan kode pengkondasan.

Peningkatan juga harus mencakup langkah-langkah berikut:

  • Panggil SQLSetEnvAttr sebelum mengalokasikan koneksi untuk mengatur atribut lingkungan SQL_ATTR_ODBC_VERSION ke SQL_OV_ODBC2.

  • Ganti semua panggilan ke SQLAllocEnv, SQLAlloc Koneksi, atau SQLAllocStmt dengan panggilan ke SQLAllocHandle dengan argumen HandleType yang sesuai dari SQL_HANDLE_ENV, SQL_HANDLE_DBC, atau SQL_HANDLE_STMT.

  • Ganti semua panggilan ke SQLFreeEnv atau SQLFree Koneksi dengan panggilan ke SQLFreeHandle dengan argumen HandleType yang sesuai dari SQL_HANDLE_DBC atau SQL_HANDLE_STMT.

  • Ganti semua panggilan ke SQLSet Koneksi Option dengan panggilan ke SQLSet Koneksi Attr. Jika mengatur atribut yang nilainya adalah string, atur argumen StringLength dengan tepat. Ubah argumen Atribut dari SQL_XXXX ke SQL_ATTR_XXXX.

  • Ganti semua panggilan ke SQLGet Koneksi Option dengan panggilan ke SQLGet Koneksi Attr. Jika mendapatkan string atau atribut biner, atur BufferLength ke nilai yang sesuai dan teruskan argumen StringLength . Ubah argumen Atribut dari SQL_XXXX ke SQL_ATTR_XXXX.

  • Ganti semua panggilan ke SQLSetStmtOption dengan panggilan ke SQLSetStmtAttr. Jika mengatur atribut yang nilainya adalah string, atur argumen StringLength dengan tepat. Ubah argumen Atribut dari SQL_XXXX ke SQL_ATTR_XXXX.

  • Ganti semua panggilan ke SQLGetStmtOption dengan panggilan ke SQLGetStmtAttr. Jika mendapatkan string atau atribut biner, atur BufferLength ke nilai yang sesuai dan teruskan argumen StringLength . Ubah argumen Atribut dari SQL_XXXX ke SQL_ATTR_XXXX.

  • Ganti semua panggilan ke SQLTransact dengan panggilan ke SQLEndTran. Jika handel paling valid di panggilan SQLTransact adalah handel lingkungan, argumen HandleType SQL_HANDLE_ENV harus digunakan dalam panggilan SQLEndTran dengan argumen Handle yang sesuai. Jika handel paling valid di panggilan SQLTransact Anda adalah handel koneksi, argumen HandleType SQL_HANDLE_DBC harus digunakan dalam panggilan SQLEndTran dengan argumen Handle yang sesuai.

  • Ganti semua panggilan ke SQLColAttributes dengan panggilan ke SQLColAttribute. Jika argumen FieldIdentifier SQL_COLUMN_PRECISION, SQL_COLUMN_SCALE, atau SQL_COLUMN_LENGTH, jangan ubah apa pun selain nama fungsi. Jika tidak, ubah FieldIdentifier dari SQL_COLUMN_XXXX ke SQL_DESC_XXXX. Jika FieldIdentifier SQL_DESC_CONCISE_TYPE dan jenis data adalah jenis data tanggalwaktu, ubah ke jenis data ODBC 3.x yang sesuai.

  • Jika menggunakan kursor blok, kursor yang dapat digulir, atau keduanya, aplikasi melakukan hal berikut:

    • Mengatur ukuran set baris, jenis kursor, dan konkurensi kursor menggunakan SQLSetStmtAttr.

    • Memanggil SQLSetStmtAttr untuk mengatur SQL_ATTR_ROW_STATUS_PTR untuk menunjuk ke array rekaman status.

    • Memanggil SQLSetStmtAttr untuk mengatur SQL_ATTR_ROWS_FETCHED_PTR untuk menunjuk ke SQLINTEGER.

    • Melakukan pengikatan yang diperlukan dan menjalankan pernyataan SQL.

    • Memanggil SQLFetchScroll dalam perulangan untuk mengambil baris dan berpindah-pindah dalam kumpulan hasil.

    • Jika ingin mengambil berdasarkan marka buku, aplikasi memanggil SQLSetStmtAttr untuk mengatur SQL_ATTR_FETCH_BOOKMARK_PTR ke variabel yang akan berisi bookmark untuk baris yang ingin diambilnya, dan memanggil SQLFetchScroll dengan argumen FetchOrientation SQL_FETCH_BOOKMARK.

  • Jika menggunakan array parameter, aplikasi melakukan hal berikut:

    • Memanggil SQLSetStmtAttr untuk mengatur atribut SQL_ATTR_PARAMSET_SIZE ke ukuran array parameter.

    • Memanggil SQLSetStmtAttr untuk mengatur SQL_ATTR_ROWS_PROCESSED_PTR untuk menunjuk ke variabel UDWORD internal.

    • Melakukan operasi persiapan, pengikatan, dan eksekusi sebagaimana mewajibkan.

    • Jika eksekusi berhenti karena beberapa alasan (seperti SQL_NEED_DATA), eksekusi dapat menemukan baris parameter "saat ini" dengan memeriksa lokasi yang ditunjukkan oleh SQL_ATTR_ROWS_PROCESSED_PTR.

Bagian ini berisi topik berikut.