Bagikan melalui


Penjajaran

Masalah penyelarasan dalam aplikasi ODBC umumnya tidak berbeda dari yang ada di aplikasi lain. Artinya, sebagian besar aplikasi ODBC memiliki sedikit atau tidak ada masalah dengan penyelarasan. Hukuman untuk tidak menyelaraskan alamat bervariasi dengan perangkat keras dan sistem operasi dan mungkin sama kecilnya dengan sedikit penalti performa atau sebagai utama sebagai kesalahan run-time fatal. Oleh karena itu, aplikasi ODBC, dan aplikasi ODBC portabel khususnya, harus berhati-hati untuk menyelaraskan data dengan benar.

Salah satu contoh ketika aplikasi ODBC mengalami masalah penyelarasan adalah ketika mereka mengalokasikan blok memori yang besar dan mengikat berbagai bagian memori tersebut ke kolom dalam tataan hasil. Ini kemungkinan besar terjadi ketika aplikasi generik harus menentukan bentuk hasil yang ditetapkan pada waktu proses dan mengalokasikan dan mengikat memori yang sesuai.

Misalnya, aplikasi menjalankan pernyataan SELECT yang dimasukkan oleh pengguna dan mengambil hasil dari pernyataan ini. Karena bentuk tataan hasil ini tidak diketahui ketika program ditulis, aplikasi harus menentukan jenis setiap kolom setelah tataan hasil dibuat dan mengikat memori yang sesuai. Cara term mudah untuk melakukan ini adalah dengan mengalokasikan blok memori yang besar dan mengikat alamat yang berbeda di blok tersebut ke setiap kolom. Untuk mengakses data dalam kolom, aplikasi melemparkan memori yang terikat ke kolom tersebut.

Diagram berikut menunjukkan kumpulan hasil sampel dan bagaimana blok memori mungkin terikat dengannya menggunakan jenis data C default untuk setiap jenis data SQL. Setiap "X" mewakili satu byte memori. (Contoh ini hanya memperlihatkan buffer data yang terikat ke kolom. Ini dilakukan untuk kesederhanaan. Dalam kode aktual, buffer panjang/indikator juga harus diselaraskan.)

Binding by default C data type to SQL data type

Dengan asumsi alamat terikat disimpan dalam array Alamat , aplikasi menggunakan ekspresi berikut untuk mengakses memori yang terikat ke setiap kolom:

(SQLCHAR *)       Address[0]  
(SQLSMALLINT *)   Address[1]  
(SQLINTEGER *)    Address[2]  

Perhatikan bahwa alamat yang terikat ke kolom kedua dan ketiga dimulai pada byte bernomor ganjil dan bahwa alamat yang terikat ke kolom ketiga tidak dapat dibagi empat, yang merupakan ukuran SDWORD. Pada beberapa mesin, ini tidak akan menjadi masalah; Pada orang lain, itu akan menyebabkan sedikit penalti kinerja; pada orang lain, itu akan menyebabkan kesalahan run-time yang fatal. Solusi yang lebih baik adalah menyelaraskan setiap alamat terikat pada batas keselarasan alaminya. Dengan asumsi ini adalah 1 untuk UCHAR, 2 untuk SWORD, dan 4 untuk SDWORD, ini akan memberikan hasil yang ditunjukkan dalam ilustrasi berikut, di mana "X" mewakili byte memori yang digunakan dan "O" mewakili byte memori yang tidak digunakan.

Binding by natural alignment boundary

Meskipun solusi ini tidak menggunakan semua memori aplikasi, solusi ini tidak mengalami masalah penyelarasan. Sayangnya, dibutuhkan cukup banyak kode untuk mengimplementasikan solusi ini, karena setiap kolom harus diselaraskan secara individual sesuai dengan jenisnya. Solusi yang lebih sederhana adalah menyelaraskan semua kolom pada ukuran batas perataan terbesar, yaitu 4 dalam contoh yang ditunjukkan dalam ilustrasi berikut.

Binding by largest alignment boundary

Meskipun solusi ini meninggalkan lubang yang lebih besar, kode untuk mengimplementasikannya relatif sederhana dan cepat. Dalam kebanyakan kasus, ini mengimbangi penalti yang dibayarkan dalam memori yang tidak digunakan. Untuk contoh yang menggunakan metode ini, lihat Menggunakan SQLBindCol.