Memetakan Fungsi Penggantian untuk Kompatibilitas Aplikasi Mundur
Aplikasi ODBC 3.x yang bekerja melalui Odbc 3.x Driver Manager akan bekerja melawan driver ODBC 2.x selama tidak ada fitur baru yang digunakan. Namun, fungsionalitas duplikat dan perubahan perilaku mempengaruhi cara kerja aplikasi ODBC 3.x pada driver ODBC 2.x . Saat bekerja dengan driver ODBC 2.x , Manajer Driver memetakan fungsi ODBC 3.x berikut, yang telah menggantikan satu atau beberapa fungsi ODBC 2.x , ke dalam fungsi ODBC 2.x yang sesuai.
Fungsi ODBC 3.x | Fungsi ODBC 2.x |
---|---|
SQLAllocHandle | SQLAllocEnv, SQLAlloc Koneksi, atau SQLAllocStmt |
SQLBulkOperations | SQLSetPos |
SQLColAttribute | SQLColAttributes |
SQLEndTran | SQLTransact |
SQLFetch | SQLExtendedFetch |
SQLFetchScroll | SQLExtendedFetch |
SQLFreeHandle | SQLFreeEnv, SQLFree Koneksi, atau SQLFreeStmt |
SQLGet Koneksi Attr | SQLGet Koneksi Option |
SQLGetDiagRec | SQLError |
SQLGetStmtAttr | SQLGetStmtOption[1] |
SQLSet Koneksi Attr | SQLSet Koneksi Option |
SQLSetStmtAttr | SQLSetStmtOption[1] |
[1] Tindakan lain mungkin juga diambil, tergantung pada atribut yang diminta.
SQLAllocHandle
Manajer Driver memetakan ini ke SQLAllocEnv, SQLAlloc Koneksi, atau SQLAllocStmt, sebagaimana mestinya. Panggilan berikut ke SQLAllocHandle:
SQLAllocHandle(HandleType, InputHandle, OutputHandlePtr);
akan mengakibatkan Manajer Driver melakukan pemetaan berikut (konseptual, tanpa pemeriksaan kesalahan):
switch (HandleType) {
case SQL_HANDLE_ENV: return (SQLAllocEnv(OutputHandlePtr));
case SQL_HANDLE_DBC: return (SQLAllocConnect (InputHandle, OutputHandlePtr));
case SQL_HANDLE_STMT: return (SQLAllocStmt (InputHandle, OutputHandlePtr));
default: // return SQL_ERROR, SQLSTATE HY092 ("Invalid attribute/option identifier")
}
SQLBulkOperations
Driver Manager memetakan ini ke SQLSetPos. Panggilan berikut ke SQLBulkOperations:
SQLBulkOperations(hstmt, Operation);
akan menghasilkan urutan langkah-langkah berikut:
Jika argumen Operasi SQL_ADD, Driver Manager memanggil SQLSetPos sebagai berikut:
SQLSetPos (hstmt, 0, SQL_ADD, SQL_LOCK_NO_CHANGE);
Jika argumen Operasi tidak SQL_ADD, driver mengembalikan SQLSTATE HY092 (Pengidentifikasi atribut/opsi tidak valid).
Jika aplikasi mencoba mengubah SQL_ATTR_ROW_STATUS_PTR antara panggilan ke SQLFetch atau SQLFetchScroll dan SQLBulkOperations, Manajer Driver akan mengembalikan SQLSTATE HY011 (Atribut tidak dapat diatur sekarang).
Jika argumen Operasi SQL_ADD, aplikasi harus memanggil SQLBindCol untuk mengikat data yang akan dimasukkan. Ini tidak dapat memanggil SQLSetDescField atau SQLSetDescRec untuk mengikat data yang akan disisipkan.
Jika argumen Operasi SQL_ADD dan jumlah baris yang akan disisipkan tidak sama dengan ukuran set baris saat ini, SQLSetStmtAttr harus dipanggil untuk mengatur atribut pernyataan SQL_ATTR_ROW_ARRAY_SIZE ke jumlah baris yang akan dimasukkan sebelum memanggil SQLBulkOperations. Untuk kembali ke ukuran set baris sebelumnya, aplikasi harus mengatur atribut pernyataan SQL_ATTR_ROW_ARRAY_SIZE sebelum SQLFetch, SQLFetchScroll, atau SQLSetPos dipanggil.
SQLColAttribute
Driver Manager memetakan ini ke SQLColAttributes. Panggilan berikut ke SQLColAttribute:
SQLColAttribute(StatementHandle, ColumnNumber, FieldIdentifier, CharacterAttributePtr, BufferLength, StringLengthPtr, NumericAttributePtr);
akan menghasilkan urutan langkah-langkah berikut:
Jika FieldIdentifier adalah salah satu hal berikut ini:
SQL_DESC_PRECISION, SQL_DESC_SCALE, SQL_DESC_LENGTH, SQL_DESC_OCTET_LENGTH, SQL_DESC_UNNAMED, SQL_DESC_BASE_COLUMN_NAME, SQL_DESC_LITERAL_PREFIX, SQL_DESC_LITERAL_SUFFIX, atau SQL_DESC_LOCAL_TYPE_NAME
Driver Manager mengembalikan SQL_ERROR dengan SQLSTATE HY091 (Pengidentifikasi bidang deskriptor tidak valid). Tidak ada aturan lebih lanjut dari bagian ini yang berlaku.
Manajer Driver masing-masing memetakan SQL_COLUMN_COUNT, SQL_COLUMN_NAME, atau SQL_COLUMN_NULLABLE ke SQL_DESC_COUNT, SQL_DESC_NAME, atau SQL_DESC_NULLABLE. (ODBC Driver 2.x hanya memerlukan dukungan SQL_COLUMN_COUNT, SQL_COLUMN_NAME, dan SQL_COLUMN_NULLABLE, bukan SQL_DESC_COUNT, SQL_DESC_NAME, dan SQL_DESC_NULLABLE.) Panggilan ke SQLColAttribute dipetakan ke:
SQLColAttributes(StatementHandle, ColumnNumber, FieldIdentifier, CharacterAttributePtr, BufferLength, StringLengthPtr, NumericAttributePtr);
Semua nilai FieldIdentifier lainnya diteruskan ke driver, dengan SQLColAttribute dipetakan ke SQLColAttributes seperti yang ditunjukkan sebelumnya.
Jika BufferLength kurang dari 0, Driver Manager mengembalikan SQL_ERROR dengan SQLSTATE HY090 (Panjang string atau buffer tidak valid). Tidak ada aturan lebih lanjut dari bagian ini yang berlaku.
Jika FieldIdentifier SQL_DESC_CONCISE_TYPE dan jenis yang dikembalikan adalah jenis data tanggalwaktu ringkas, Manajer Driver memetakan nilai pengembalian untuk kode tanggal, waktu, dan tanda waktu.
Driver Manager melakukan pemeriksaan yang diperlukan untuk melihat apakah SQLSTATE HY010 (Kesalahan urutan fungsi) perlu dimunculkan. Jika demikian, Driver Manager mengembalikan SQL_ERROR dan SQLSTATE HY010 (Kesalahan urutan fungsi). Tidak ada aturan lebih lanjut dari bagian ini yang berlaku.
SQLEndTran
Driver Manager memetakan ini ke SQLTransact. Panggilan berikut ke SQLEndTran:
SQLEndTran(HandleType, Handle, CompletionType);
akan mengakibatkan Manajer Driver melakukan pemetaan berikut (konseptual, tanpa pemeriksaan kesalahan):
switch (HandleType) {
case SQL_HANDLE_ENV:return(SQLTransact(Handle, SQL_NULL_HDBC, CompletionType));
case SQL_HANDLE_DBC:return(SQLTransact(SQL_NULL_HENV, Handle, CompletionType);
default: // return SQL_ERROR, SQLSTATE HY092 ("Invalid attribute/option identifier")
}
SQLFetch
Driver Manager memetakan ini ke SQLExtendedFetch dengan argumen FetchOrientation SQL_FETCH_NEXT. Panggilan berikut ke SQLFetch:
SQLFetch (StatementHandle);
akan menghasilkan Driver Manager yang memanggil SQLExtendedFetch, sebagai berikut:
rc = SQLExtendedFetch(StatementHandle, FetchOrientation, FetchOffset, &RowCount, RowStatusArray);
Dalam panggilan ini, argumen pcRow diatur ke nilai yang ditetapkan aplikasi atribut pernyataan SQL_ATTR_ROWS_FETCHED_PTR melalui panggilan ke SQLSetStmtAttr.
Catatan
Ketika aplikasi memanggil SQLSetStmtAttr untuk mengatur SQL_ATTR_ROW_STATUS_PTR untuk menunjuk ke array status, Manajer Driver menyimpan penunjuk. RowStatusArray bisa sama dengan pointer null.
Jika driver tidak mendukung SQLExtendedFetch dan pustaka kursor dimuat, Driver Manager menggunakan SQLExtendedFetch pustaka kursor untuk memetakan SQLFetch ke SQLExtendedFetch. Jika driver tidak mendukung SQLExtendedFetch dan pustaka kursor tidak dimuat, Manajer Driver meneruskan panggilan ke SQLFetch melalui ke driver. Jika aplikasi memanggil SQLSetStmtAttr untuk mengatur SQL_ATTR_ROW_STATUS_PTR, Manajer Driver memastikan bahwa array diisi. Jika aplikasi memanggil SQLSetStmtAttr untuk mengatur SQL_ATTR_ROWS_FETCHED_PTR, Manajer Driver mengatur bidang ini ke 1.
SQLFetchScroll
Driver Manager memetakan ini ke SQLExtendedFetch. Panggilan berikut ke SQLFetchScroll:
SQLFetchScroll(StatementHandle, FetchOrientation, FetchOffset);
akan menghasilkan urutan langkah-langkah berikut:
Ketika aplikasi memanggil SQLSetStmtAttr untuk mengatur SQL_ATTR_ROW_STATUS_PTR (yang mengatur bidang SQL_DESC_ARRAY_STATUS_PTR di IRD) untuk menunjuk ke array status, Manajer Driver menyimpan penunjuk ini. Biarkan pointer ini menjadi RowStatusArray; jika tidak, biarkan RowStatusArray sama dengan pointer null. Jika argumen RowStatusArray diatur ke penunjuk null, Manajer Driver menghasilkan array status baris.
Jika FetchOrientation bukan salah satu SQL_FETCH_NEXT, SQL_FETCH_PRIOR, SQL_FETCH_ABSOLUTE, SQL_FETCH_RELATIVE, SQL_FETCH_FIRST, SQL_FETCH_LAST, atau SQL_FETCH_BOOKMARK, Manajer Driver akan kembali dengan SQL_ERROR dan SQLSTATE HY106 (Jenis pengambilan di luar rentang). Tidak ada aturan lebih lanjut dari bagian ini yang berlaku.
Kasus:
Jika FetchOrientation sama dengan SQL_FETCH_BOOKMARK, maka:
Jika SQLSetStmtAttr dipanggil sebelumnya untuk menetapkan nilai SQL_ATTR_FETCH_BOOKMARK_PTR, maka biarkan Bmk menjadi nilai yang diperoleh dengan mendereferensiasi pointer SQL_DESC_FETCH_BOOKMARK_PTR.
Jika tidak, kembalikan SQL_ERROR dengan SQLSTATE HY111 (nilai bookmark tidak valid). Tidak ada aturan lebih lanjut dari bagian ini yang berlaku.
Driver Manager sekarang memanggil SQLExtendedFetch, sebagai berikut:
rc = SQLExtendedFetch(StatementHandle, FetchOrientation, Bmk, pcRow, RowStatusArray);
Jika tidak, Driver Manager memanggil SQLExtendedFetch, sebagai berikut:
rc = SQLExtendedFetch(StatementHandle, FetchOrientation, FetchOffset, pcRow, RowStatusArray);
Dalam panggilan ini, argumen pcRow diatur ke nilai yang ditetapkan aplikasi atribut pernyataan SQL_ATTR_ROWS_FETCHED_PTR melalui panggilan ke SQLSetStmtAttr.
SQL_ATTR_ROW_ARRAY_SIZE dipetakan ke SQL_ROWSET_SIZE.
Jika rc sama dengan SQL_SUCCESS atau SQL_SUCCESS_WITH_INFO, dan jika FetchOrientation sama dengan SQL_FETCH_BOOKMARK dan FetchOffset tidak sama dengan 0, maka Manajer Driver memposting peringatan, SQLSTATE 01S10 (Mencoba mengambil dengan offset marka buku, nilai offset diabaikan), dan mengembalikan SQL_SUCCESS_WITH_INFO.
SQLFreeHandle
Driver Manager memetakan ini ke SQLFreeEnv, SQLFree Koneksi, atau SQLFreeStmt sebagaimana mewajarkan. Panggilan berikut ke SQLFreeHandle:
SQLFreeHandle(HandleType, Handle);
akan mengakibatkan Manajer Driver melakukan pemetaan berikut (konseptual, tanpa pemeriksaan kesalahan):
switch (HandleType) {
case SQL_HANDLE_ENV: return (SQLFreeEnv(Handle));
case SQL_HANDLE_DBC: return (SQLFreeConnect(Handle));
case SQL_HANDLE_STMT: return (SQLFreeStmt(Handle, SQL_DROP));
default: // return SQL_ERROR, SQLSTATE HY092 ("Invalid attribute/option identifier")
}
SQLGetConnectAttr
Manajer Driver memetakan ini ke SQLGet Koneksi Option. Panggilan berikut ke SQLGet Koneksi Attr:
SQLGetConnectAttr(ConnectionHandle, Attribute, ValuePtr, BufferLength, StringLengthPtr);
akan menghasilkan urutan langkah-langkah berikut:
Jika Atribut bukan atribut koneksi atau pernyataan yang ditentukan driver dan bukan atribut yang ditentukan dalam ODBC 2.x, Manajer Driver mengembalikan SQL_ERROR dengan SQLSTATE HY092 (Pengidentifikasi atribut/opsi tidak valid). Tidak ada aturan lebih lanjut di bagian ini yang berlaku.
Jika Atribut sama dengan SQL_ATTR_AUTO_IPD atau SQL_ATTR_METADATA_ID, Driver Manager mengembalikan SQL_ERROR dengan SQLSTATE HY092 (Pengidentifikasi atribut/opsi tidak valid).
Driver Manager melakukan pemeriksaan yang diperlukan untuk melihat apakah SQLSTATE 08003 (Koneksi ion tidak terbuka) atau SQLSTATE HY010 (Kesalahan urutan fungsi) perlu dimunculkan. Jika demikian, Driver Manager mengembalikan SQL_ERROR dan memposting pesan kesalahan yang sesuai. Tidak ada aturan lebih lanjut dari bagian ini yang berlaku.
Driver Manager memanggil SQLGet Koneksi Option sebagai berikut:
SQLGetConnectOption (ConnectionHandle, Attribute, ValuePtr);
Perhatikan bahwa BufferLength dan StringLengthPtr diabaikan.
SQLGetData
Ketika aplikasi ODBC 3.x yang bekerja dengan driver ODBC 2.x memanggil SQLGetData dengan argumen ColumnNumber sama dengan 0, Manajer Driver ODBC 3.x memetakan ini ke panggilan ke SQLGetStmtOption dengan atribut Opsi yang diatur ke SQL_GET_BOOKMARK.
SQLGetStmtAttr
Manajer Driver memetakan ini ke SQLGetStmtOption. Panggilan berikut ke SQLGetStmtAttr:
SQLGetStmtAttr(StatementHandle, Attribute, ValuePtr, BufferLength, StringLengthPtr);
akan menghasilkan urutan langkah-langkah berikut:
Jika Atribut bukan atribut koneksi atau pernyataan yang ditentukan driver dan bukan atribut yang ditentukan dalam ODBC 2.x, Manajer Driver mengembalikan SQL_ERROR dengan SQLSTATE HY092 (Pengidentifikasi atribut/opsi tidak valid). Tidak ada aturan lebih lanjut di bagian ini yang berlaku.
Jika Atribut adalah salah satu dari berikut ini:
SQL_ATTR_APP_ROW_DESC
SQL_ATTR_APP_PARAM_DESC
SQL_ATTR_AUTO_IPD
SQL_ATTR_ROW_BIND_TYPE
SQL_ATTR_IMP_ROW_DESC
SQL_ATTR_IMP_PARAM_DESC
SQL_ATTR_METADATA_ID
SQL_ATTR_PARAM_BIND_TYPE
SQL_ATTR_PREDICATE_PTR
SQL_ATTR_PREDICATE_OCTET_LENGTH_PTR
SQL_ATTR_PARAM_BIND_OFFSET_PTR
SQL_ATTR_ROW_BIND_OFFSET_PTR
SQL_ATTR_ROW_OPERATION_PTR
SQL_ATTR_PARAM_OPERATION_PTR
Driver Manager mengembalikan SQL_ERROR dengan SQLSTATE HY092 (Pengidentifikasi atribut/opsi tidak valid). Tidak ada aturan lebih lanjut dari bagian ini yang berlaku.
Driver Manager melakukan pemeriksaan yang diperlukan untuk melihat apakah SQLSTATE HY010 (Kesalahan urutan fungsi) perlu dimunculkan. Jika demikian, Driver Manager mengembalikan SQL_ERROR dan SQLSTATE HY010 (Kesalahan urutan fungsi). Tidak ada aturan lebih lanjut dari bagian ini yang berlaku.
Jika Atribut sama dengan SQL_ATTR_ROWS_FETCHED_PTR, Manajer Driver mengembalikan pointer ke cRow variabel Driver Manager internal, yang telah digunakan atau akan digunakan dalam panggilan ke SQLExtendedFetch. Tidak ada aturan lebih lanjut dari bagian ini yang berlaku.
Jika Atribut sama dengan SQL_DESC_FETCH_BOOKMARK_PTR, Manajer Driver mengembalikan pointer yang sesuai yang telah di-cache selama panggilan ke SQLSetStmtAttr.
Jika Atribut sama dengan SQL_ATTR_ROW_STATUS_PTR, Manajer Driver mengembalikan pointer yang sesuai yang telah di-cache selama panggilan ke SQLSetStmtAttr.
Driver Manager memanggil SQLGetStmtOption sebagai berikut:
SQLGetStmtOption (hstmt, fOption, pvParam);
di mana hstmt, fOption, dan pvParam akan diatur ke nilai StatementHandle, Attribute, dan ValuePtr, masing-masing. BufferLength dan StringLengthPtr diabaikan.
SQLSetConnectAttr
Driver Manager memetakan ini ke SQLSet Koneksi Option. Panggilan berikut ke SQLSet Koneksi Attr:
SQLSetConnectAttr(ConnectionHandle, Attribute, ValuePtr, StringLength);
akan menghasilkan urutan langkah-langkah berikut:
Jika Atribut bukan atribut koneksi atau pernyataan yang ditentukan driver dan bukan atribut yang ditentukan dalam ODBC 2.x, Manajer Driver mengembalikan SQL_ERROR dengan SQLSTATE HY092 (Pengidentifikasi atribut/opsi tidak valid). Tidak ada aturan lebih lanjut di bagian ini yang berlaku.
Jika Atribut sama dengan SQL_ATTR_AUTO_IPD, Driver Manager mengembalikan SQL_ERROR dengan SQLSTATE HY092 (Pengidentifikasi atribut/opsi tidak valid).
Driver Manager melakukan pemeriksaan yang diperlukan untuk melihat apakah SQLSTATE 08003 (Koneksi ion tidak terbuka) atau SQLSTATE HY010 (Kesalahan urutan fungsi) perlu dimunculkan. Jika salah satu kesalahan ini perlu dimunculkan, Manajer Driver mengembalikan SQL_ERROR dan memposting pesan kesalahan yang sesuai. Tidak ada aturan lebih lanjut dari bagian ini yang berlaku.
Driver Manager memanggil SQLSet Koneksi Option sebagai berikut:
SQLSetConnectOption (hdbc, fOption, vParam);
di mana hdbc, fOption, dan vParam akan diatur ke nilai masing-masing Koneksi ionHandle, Attribute, dan ValuePtr. StringLengthPtr diabaikan.
Catatan
Kemampuan untuk mengatur atribut pernyataan pada tingkat koneksi telah ditolak. Atribut pernyataan tidak boleh diatur pada tingkat koneksi oleh aplikasi ODBC 3.x .
SQLSetStmtAttr
Driver Manager memetakan ini ke SQLSetStmtOption. Panggilan berikut ke SQLSetStmtAttr:
SQLSetStmtAttr(StatementHandle, Attribute, ValuePtr, StringLength);
akan menghasilkan urutan langkah-langkah berikut:
Jika Atribut bukan atribut koneksi atau pernyataan yang ditentukan driver dan bukan atribut yang ditentukan dalam ODBC 2.x, Manajer Driver mengembalikan SQL_ERROR dengan SQLSTATE HY092 (Pengidentifikasi atribut/opsi tidak valid). Tidak ada aturan lebih lanjut di bagian ini yang berlaku.
Jika Atribut adalah salah satu dari berikut ini:
SQL_ATTR_APP_ROW_DESC
SQL_ATTR_APP_PARAM_DESC
SQL_ATTR_AUTO_IPD
SQL_ATTR_ROW_BIND_TYPE
SQL_ATTR_IMP_ROW_DESC
SQL_ATTR_IMP_PARAM_DESC
SQL_ATTR_METADATA_ID
SQL_ATTR_PARAM_BIND_TYPE
SQL_ATTR_PREDICATE_PTR
SQL_ATTR_PREDICATE_OCTET_LENGTH_PTR
SQL_ATTR_PARAM_BIND_OFFSET_PTR
SQL_ATTR_ROW_BIND_OFFSET_PTR
SQL_ATTR_ROW_OPERATION_PTR
SQL_ATTR_PARAM_OPERATION_PTR
Driver Manager mengembalikan SQL_ERROR dengan SQLSTATE HY092 (Pengidentifikasi atribut/opsi tidak valid). Tidak ada aturan lebih lanjut dari bagian ini yang berlaku.
Driver Manager melakukan pemeriksaan yang diperlukan untuk melihat apakah SQLSTATE HY010 (Kesalahan urutan fungsi) perlu dimunculkan. Jika demikian, Driver Manager mengembalikan SQL_ERROR dan SQLSTATE HY010 (Kesalahan urutan fungsi). Tidak ada aturan lebih lanjut dari bagian ini yang berlaku.
Jika Atribut sama dengan SQL_ATTR_PARAMSET_SIZE atau SQL_ATTR_PARAMS_PROCESSED_PTR, lihat bagian "Pemetaan untuk Menangani Array Parameter," nanti dalam topik ini. Tidak ada aturan lebih lanjut dari bagian ini yang berlaku.
Jika Atribut sama dengan SQL_ATTR_ROWS_FETCHED_PTR, Driver Manager menyimpan nilai pointer untuk digunakan nanti dengan SQLFetchScroll.
Jika Atribut sama dengan SQL_ATTR_ROW_STATUS_PTR, Manajer Driver menyimpan nilai penunjuk untuk digunakan nanti dengan SQLFetchScroll atau SQLSetPos. Tidak ada aturan lebih lanjut dari bagian ini yang berlaku.
Jika Atribut sama dengan SQL_ATTR_FETCH_BOOKMARK_PTR, Manajer Driver akan menyimpan ValuePtr dan akan menggunakan nilai cache nanti dalam panggilan ke SQLFetchScroll. Tidak ada aturan lebih lanjut dari bagian ini yang berlaku.
Driver Manager memanggil SQLSetStmtOption sebagai berikut:
SQLSetStmtOption (hstmt, fOption, vParam);
di mana hstmt, fOption, dan vParam akan diatur ke nilai StatementHandle, Attribute, dan ValuePtr, masing-masing. Argumen StringLength diabaikan.
Jika driver ODBC 2.x mendukung string karakter, opsi pernyataan khusus driver, aplikasi ODBC 3.x harus memanggil SQLSetStmtOption untuk mengatur opsi tersebut.
Pemetaan untuk Menangani Array Parameter
Ketika aplikasi memanggil:
SQLSetStmtAttr (StatementHandle, SQL_ATTR_PARAMSET_SIZE, Size, StringLength);
Panggilan Driver Manager:
SQLParamOptions (StatementHandle, Size, &RowCount);
Driver Manager kemudian mengembalikan pointer ke variabel ini ketika aplikasi memanggil SQLGetStmtAttr untuk mengambil SQL_ATTR_PARAMS_PROCESSED_PTR. Manajer Driver tidak dapat mengubah variabel internal ini sampai handel pernyataan dikembalikan ke status disiapkan atau dialokasikan.
Aplikasi ODBC 3.x dapat memanggil SQLGetStmtAttr untuk mendapatkan nilai SQL_ATTR_PARAMS_PROCESSED_PTR meskipun belum secara eksplisit mengatur bidang SQL_DESC_ARRAY_SIZE di APD. Situasi ini dapat muncul, misalnya, jika aplikasi memiliki rutinitas generik yang memeriksa "baris" parameter saat ini yang sedang diproses ketika SQLExecute mengembalikan SQL_NEED_DATA. Rutinitas ini dipanggil apakah SQL_DESC_ARRAY_SIZE adalah 1 atau lebih besar dari 1. Untuk memperhitungkan hal ini, Driver Manager harus menentukan variabel internal ini apakah aplikasi telah memanggil SQLSetStmtAttr untuk mengatur bidang SQL_DESC_ARRAY_SIZE di APD atau tidak. Jika SQL_DESC_ARRAY_SIZE belum diatur, Manajer Driver harus memastikan bahwa variabel ini berisi nilai 1 sebelum kembali dari SQLExecDirect atau SQLExecute.
Penanganan Kesalahan
Di ODBC 3.x, memanggil SQLFetch atau SQLFetchScroll mengisi SQL_DESC_ARRAY_STATUS_PTR di IRD, dan bidang SQL_DIAG_ROW_NUMBER dari rekaman diagnostik tertentu berisi jumlah baris dalam kumpulan baris yang berkaitan dengan rekaman ini. Dengan menggunakan ini, aplikasi dapat menghubungkan pesan kesalahan dengan posisi baris tertentu.
Driver ODBC 2.x tidak akan dapat menyediakan fungsionalitas ini. Namun, ini akan memberikan demarkasi kesalahan dengan SQLSTATE 01S01 (Kesalahan berturut-turut). Aplikasi ODBC 3.x yang menggunakan SQLFetch atau SQLFetchScroll saat melawan driver ODBC 2.x perlu mengetahui fakta ini. Perhatikan juga bahwa aplikasi seperti itu tidak akan dapat memanggil SQLGetDiagField untuk benar-benar mendapatkan bidang SQL_DIAG_ROW_NUMBER pula. Aplikasi ODBC 3.x yang bekerja dengan driver ODBC 2.x akan dapat memanggil SQLGetDiagField hanya dengan argumen DiagIdentifier SQL_DIAG_MESSAGE_TEXT, SQL_DIAG_NATIVE, SQL_DIAG_RETURNCODE, atau SQL_DIAG_SQLSTATE. Driver Manager ODBC 3.x mempertahankan struktur data diagnostik saat bekerja dengan driver ODBC 2.x , tetapi driver ODBC 2.x hanya mengembalikan keempat bidang ini.
Ketika aplikasi ODBC 2.x bekerja dengan driver ODBC 2.x , jika operasi dapat menyebabkan beberapa kesalahan dikembalikan oleh Driver Manager, kesalahan yang berbeda dapat dikembalikan oleh Odbc 3.x Driver Manager daripada oleh ODBC 2.x Driver Manager.
Pemetaan untuk Operasi Bookmark
Odbc 3.x Driver Manager melakukan pemetaan berikut ketika aplikasi ODBC 3.x yang bekerja dengan driver ODBC 2.x melakukan operasi bookmark.
SQLBindCol
Ketika aplikasi ODBC 3.x yang bekerja dengan driver ODBC 2.x memanggil SQLBindCol untuk mengikat ke kolom 0 dengan fCType sama dengan SQL_C_VARBOOKMARK, Manajer Driver ODBC 3.x memeriksa untuk melihat apakah argumen BufferLength kurang dari 4 atau lebih besar dari 4, dan jika demikian, mengembalikan SQLSTATE HY090 (String tidak valid atau panjang buffer). Jika argumen BufferLength sama dengan 4, Driver Manager memanggil SQLBindCol di driver, setelah mengganti fCType dengan SQL_C_BOOKMARK.
SQLColAttribute
Ketika aplikasi ODBC 3.x yang bekerja dengan driver ODBC 2.x memanggil SQLColAttribute dengan argumen ColumnNumber yang diatur ke 0, Driver Manager mengembalikan nilai FieldIdentifier yang tercantum dalam tabel berikut.
Pengidentifikasi Bidang | Value |
---|---|
SQL_DESC_AUTO_UNIQUE_VALUE | SQL_FALSE |
SQL_DESC_CASE_SENSITIVE | SQL_FALSE |
SQL_DESC_CATALOG_NAME | "" (string kosong) |
SQL_DESC_CONCISE_TYPE | SQL_BINARY |
SQL_DESC_COUNT | Nilai yang sama yang dikembalikan oleh SQLNumResultCols |
SQL_DESC_DATETIME_INTERVAL_CODE | 0 |
SQL_DESC_DISPLAY_SIZE | 8 |
SQL_DESC_FIXED_PREC_SCALE | SQL_FALSE |
SQL_DESC_LABEL | "" (string kosong) |
SQL_DESC_LENGTH | 0 |
SQL_DESC_LITERAL_PREFIX | "" (string kosong) |
SQL_DESC_LITERAL_SUFFIX | "" (string kosong) |
SQL_DESC_LOCAL_TYPE_NAME | "" (string kosong) |
SQL_DESC_NAME | "" (string kosong) |
SQL_DESC_NULLABLE | SQL_NO_NULLS |
SQL_DESC_OCTET_LENGTH | 4 |
SQL_DESC_PRECISION | 4 |
SQL_DESC_SCALE | 0 |
SQL_DESC_SCHEMA_NAME | "" (string kosong) |
SQL_DESC_SEARCHABLE | SQL_PRED_NONE |
SQL_DESC_TABLE_NAME | "" (string kosong) |
SQL_DESC_TYPE | SQL_BINARY |
SQL_DESC_TYPE_NAME | "" (string kosong) |
SQL_DESC_UNNAMED | SQL_UNNAMED |
SQL_DESC_UNSIGNED | SQL_FALSE |
SQL_DESC_UPDATEABLE | SQL_ATTR_READ_ONLY |
SQLDescribeCol
Ketika aplikasi ODBC 3.x yang bekerja dengan driver ODBC 2.x memanggil SQLDescribeCol dengan argumen ColumnNumber diatur ke 0, Driver Manager mengembalikan nilai yang tercantum dalam tabel berikut.
Buffer | Value |
---|---|
ColumnName | "" (string kosong) |
*NameLengthPtr | 0 |
*DataTypePtr | SQL_BINARY |
*ColumnSizePtr | 4 |
*DecimalDigitsPtr | 0 |
*NullablePtr | SQL_NO_NULLS |
SQLGetData
Ketika aplikasi ODBC 3.x bekerja dengan driver ODBC 2.x melakukan panggilan berikut ke SQLGetData untuk mengambil marka buku:
SQLGetData(StatementHandle, 0, SQL_C_VARBOOKMARK, TargetValuePtr, BufferLength, StrLen_or_IndPtr)
panggilan dipetakan ke SQLGetStmtOption dengan fOption SQL_GET_BOOKMARK, sebagai berikut:
SQLGetStmtOption(hstmt, SQL_GET_BOOKMARK, TargetValuePtr)
di mana hstmt dan pvParam diatur ke nilai di StatementHandle dan TargetValuePtr, masing-masing. Bookmark dikembalikan dalam buffer yang diacu oleh argumen pvParam (TargetValuePtr). Nilai dalam buffer yang ditujukkan oleh argumen StrLen_or_IndPtr dalam panggilan ke SQLGetData diatur ke 4.
Pemetaan ini diperlukan untuk memperhitungkan kasus di mana SQLFetch dipanggil sebelum panggilan ke SQLGetData dan driver ODBC 2.x tidak mendukung SQLExtendedFetch. Dalam hal ini, SQLFetch akan diteruskan ke driver ODBC 2.x , dalam hal ini pengambilan bookmark tidak didukung.
SQLGetData tidak dapat dipanggil beberapa kali dalam driver ODBC 2.x untuk mengambil marka buku di bagian, jadi memanggil SQLGetData dengan argumen BufferLength yang diatur ke nilai kurang dari 4 dan argumen ColumnNumber yang diatur ke 0 akan mengembalikan SQLSTATE HY090 (String tidak valid atau panjang buffer). Namun, SQLGetData dapat dipanggil beberapa kali untuk mengambil marka buku yang sama.
SQLSetStmtAttr
Ketika aplikasi ODBC 3.x yang bekerja dengan driver ODBC 2.x memanggil SQLSetStmtAttr untuk mengatur atribut SQL_ATTR_USE_BOOKMARKS ke SQL_UB_VARIABLE, Driver Manager mengatur atribut ke SQL_UB_ON di driver ODBC 2.x yang mendasarinya.