Bagikan melalui


Mengambil Data Hasil

Berlaku untuk: SQL Server Azure SQL DatabaseAzure SQL Managed InstanceAzure Synapse Analytics AnalyticsPlatform System (PDW)

Aplikasi ODBC memiliki tiga opsi untuk mengambil data hasil.

Opsi pertama didasarkan pada SQLBindCol. Sebelum mengambil kumpulan hasil, aplikasi menggunakan SQLBindCol untuk mengikat setiap kolom dalam hasil yang diatur ke variabel program. Setelah kolom terikat, driver mentransfer data baris saat ini ke dalam variabel yang terikat ke kolom tataan hasil setiap kali aplikasi memanggil SQLFetch atau SQLFetchScroll. Driver menangani konversi data jika kolom kumpulan hasil dan variabel program memiliki jenis data yang berbeda. Jika aplikasi telah SQL_ATTR_ROW_ARRAY_SIZE mengatur lebih besar dari 1, aplikasi dapat mengikat kolom hasil ke array variabel, yang semuanya akan diisi pada setiap panggilan ke SQLFetchScroll.

Opsi kedua didasarkan pada SQLGetData. Aplikasi tidak menggunakan SQLBindCol untuk mengikat kolom tataan hasil ke variabel program. Setelah setiap panggilan ke SQLFetch, aplikasi memanggil SQLGetData sekali untuk setiap kolom dalam tataan hasil. SQLGetData menginstruksikan driver untuk mentransfer data dari kolom tataan hasil tertentu ke variabel program tertentu dan menentukan jenis data kolom dan variabel. Ini memungkinkan driver untuk mengonversi data jika kolom hasil dan variabel program memiliki jenis data yang berbeda. Kolom teks, ntext, dan gambar biasanya terlalu besar untuk masuk ke dalam variabel program tetapi masih dapat diambil menggunakan SQLGetData. Jika data teks, ntext, atau gambar di kolom hasil lebih besar dari variabel program, SQLGetData mengembalikan SQL_SUCCESS_WITH_INFO dan SQLSTATE 01004 (data string, terpotong kanan). Panggilan berturut-turut ke SQLGetData mengembalikan potongan teks atau data gambar berturut-turut. Saat akhir data tercapai, SQLGetData mengembalikan SQL_SUCCESS. Setiap pengambilan mengembalikan sekumpulan baris, atau set baris, jika SQL_ATTR_ROW_ARRAY_SIZE lebih besar dari 1. Sebelum menggunakan SQLGetData, Anda harus terlebih dahulu menggunakan SQLSetPos untuk menentukan baris tertentu dalam set baris sebagai baris saat ini.

Opsi ketiga adalah menggunakan campuran SQLBindCol dan SQLGetData. Aplikasi dapat, misalnya, mengikat sepuluh kolom pertama dari kumpulan hasil dan kemudian, pada setiap pengambilan, panggil SQLGetData tiga kali untuk mengambil data dari tiga kolom yang tidak terikat. Ini biasanya akan digunakan ketika kumpulan hasil berisi satu atau beberapa kolom teks atau gambar .

Bergantung pada opsi kursor yang diatur untuk kumpulan hasil, aplikasi juga dapat menggunakan opsi pengguliran SQLFetchScroll untuk menggulir di sekitar tataan hasil.

Kelebihan penggunaan SQLBindCol untuk mengikat kolom tataan hasil ke variabel program mahal karena SQLBindCol menyebabkan driver ODBC mengalokasikan memori. Saat Anda mengikat kolom hasil ke variabel, pengikatan tersebut tetap berlaku hingga Anda memanggil SQLFreeHandle untuk membebaskan pegangan pernyataan atau memanggil SQLFreeStmt dengan fOption diatur ke SQL_UNBIND. Pengikatan tidak secara otomatis dibatalkan ketika pernyataan selesai.

Logika ini memungkinkan Anda untuk secara efektif menangani pelaksanaan pernyataan SELECT yang sama beberapa kali dengan parameter yang berbeda. Karena tataan hasil mempertahankan struktur yang sama, Anda dapat mengikat tataan hasil sekali, memproses semua pernyataan SELECT, lalu memanggil SQLFreeStmt dengan fOption diatur ke SQL_UNBIND setelah eksekusi terakhir. Anda tidak boleh memanggil SQLBindCol untuk mengikat kolom dalam tataan hasil tanpa terlebih dahulu memanggil SQLFreeStmt dengan fOption diatur ke SQL_UNBIND untuk membebaskan pengikatan sebelumnya.

Saat menggunakan SQLBindCol, Anda dapat melakukan pengikatan row-wise atau column-wise. Pengikatan baris agak lebih cepat daripada pengikatan kolom.

Anda dapat menggunakan SQLGetData untuk mengambil data berdasarkan kolom demi kolom alih-alih mengikat kolom tataan hasil menggunakan SQLBindCol. Jika kumpulan hasil hanya berisi beberapa baris, menggunakan SQLGetData alih-alih SQLBindCol lebih cepat; jika tidak, SQLBindCol memberikan performa terbaik. Jika Anda tidak selalu memasukkan data ke dalam kumpulan variabel yang sama, Anda harus menggunakan SQLGetData alih-alih terus-menerus mengikat ulang. Anda hanya dapat menggunakan SQLGetData pada kolom yang ada dalam daftar pilih setelah semua kolom terikat dengan SQLBindCol. Kolom juga harus muncul setelah kolom tempat Anda telah menggunakan SQLGetData.

Fungsi ODBC yang menangani pemindahan data ke dalam atau ke luar variabel program, seperti SQLGetData, SQLBindCol, dan SQLBindParameter, mendukung konversi jenis data implisit. Misalnya, jika aplikasi mengikat kolom bilangan bulat ke variabel program string karakter, driver secara otomatis mengonversi data dari bilangan bulat ke karakter sebelum menempatkannya ke dalam variabel program.

Konversi data dalam aplikasi harus diminimalkan. Kecuali konversi data diperlukan untuk pemrosesan yang dilakukan oleh aplikasi, aplikasi harus mengikat kolom dan parameter ke variabel program dari jenis data yang sama. Namun, jika data harus dikonversi dari satu jenis ke jenis lainnya, lebih efisien jika driver melakukan konversi daripada melakukannya dalam aplikasi. Driver SQL Server Native Client ODBC biasanya hanya mentransfer data langsung dari buffer jaringan ke variabel aplikasi. Meminta driver untuk melakukan konversi data memaksa driver untuk menyangga data dan menggunakan siklus CPU untuk mengonversi data.

Variabel program harus cukup besar untuk menyimpan data yang ditransfer dari kolom, kecuali untuk data teks, ntext, dan gambar . Jika aplikasi mencoba mengambil data kumpulan hasil dan menempatkannya ke dalam variabel yang terlalu kecil untuk menahannya, driver akan menghasilkan peringatan. Ini memaksa driver untuk mengalokasikan memori untuk pesan, dan driver dan aplikasi keduanya harus menghabiskan siklus CPU yang memproses pesan dan melakukan penanganan kesalahan. Aplikasi harus mengalokasikan variabel yang cukup besar untuk menyimpan data yang diambil atau menggunakan fungsi SUBSTRING dalam daftar pilih untuk mengurangi ukuran kolom dalam tataan hasil.

Perawatan harus dilakukan saat menggunakan SQL_C_DEFAULT untuk menentukan jenis variabel C. SQL_C_DEFAULT menentukan bahwa jenis variabel C cocok dengan jenis data SQL kolom atau parameter. Jika SQL_C_DEFAULT ditentukan untuk kolom ntext, nchar, atau nvarchar , data Unicode dikembalikan ke aplikasi. Hal ini dapat menyebabkan berbagai masalah jika aplikasi belum dikodekan untuk menangani data Unicode. Jenis masalah yang sama dapat terjadi dengan jenis data pengidentifikasi unik (SQL_GUID).

data teks, ntext, dan gambar biasanya terlalu besar untuk dimasukkan ke dalam satu variabel program, dan biasanya diproses dengan SQLGetData alih-alih SQLBindCol. Saat menggunakan kursor server, driver SQL Server Native Client ODBC dioptimalkan untuk tidak mengirimkan data untuk kolom teks, ntext, atau gambar yang tidak terikat pada saat baris diambil. Data teks, ntext, atau gambar sebenarnya tidak diambil dari server sampai aplikasi mengeluarkan SQLGetData untuk kolom.

Pengoptimalan ini dapat diterapkan ke aplikasi sehingga tidak ada data teks, ntext, atau gambar yang ditampilkan saat pengguna menggulir ke atas dan ke bawah kursor. Setelah pengguna memilih baris, aplikasi dapat memanggil SQLGetData untuk mengambil data teks, ntext, atau gambar . Ini menghemat pengiriman teks, ntext, atau data gambar untuk salah satu baris yang tidak dipilih pengguna dan dapat menyimpan transmisi data dalam jumlah yang sangat besar.

Lihat juga

Hasil Pemrosesan (ODBC)