ODBC 應用中的對齊問題通常與其他應用無異。 也就是說,大多數 ODBC 應用程式幾乎沒有或沒有對齊問題。 未對齊位址的懲罰會依硬體與作業系統而異,可能輕微到輕微的效能損失,也可能嚴重到致命的執行時錯誤。 因此,ODBC 應用,尤其是可攜式 ODBC 應用,應謹慎對齊資料。
ODBC 應用程式遇到對齊問題的一個例子是,當他們分配一個大型記憶體區塊,並將該記憶體的不同部分綁定到結果集中的欄位時。 這種情況最常見於一般應用程式必須在執行時判斷結果集的形狀,並據此分配與綁定記憶體。
例如,假設一個應用程式執行使用者輸入的 SELECT 語句,並從該語句取得結果。 由於程式撰寫時尚未確定此結果集的形狀,應用程式必須在建立結果集後確定每個欄位的類型並相應綁定記憶體。 最簡單的方法是分配一個大型記憶體區塊,並將該區塊中不同的位址綁定到每一欄。 要存取欄位資料,應用程式會拋棄綁定在該欄位的記憶體。
下圖顯示了一個範例結果集,以及如何使用預設的 C 資料型別為每個 SQL 資料型別綁定記憶體區塊。 每個「X」代表一個記憶體位元組。 (此範例僅顯示綁定於欄位的資料緩衝區。這是為了簡化流程。在實際程式碼中,長度/指示緩衝區也必須對齊。)
假設綁定的位址儲存在 位址 陣列中,應用程式會使用以下表達式來存取綁定在每欄的記憶體:
(SQLCHAR *) Address[0]
(SQLSMALLINT *) Address[1]
(SQLINTEGER *) Address[2]
注意綁定在第二欄和第三欄的位址起始於奇數位元組,且綁定在第三欄的位址無法被四整除,這相當於一個 SDWORD 的大小。 在某些機器上,這不會成為問題;在其他情況下,則會造成輕微的效能懲罰;在其他情況下,則會導致致命的運行時間錯誤。 更好的解決方案是將每個綁定地址對齊在其自然對齊邊界上。 假設 UCHAR 為 1,SWORD 為 2,SDWORD 為 4,則如下圖所示,其中「X」代表已使用的記憶體位元組,「O」代表未使用的記憶體位元組。
雖然此方案不會使用全部應用程式記憶體,但不會遇到對齊問題。 不幸的是,實作此解決方案需要相當多的程式碼,因為每個欄位必須依其類型個別對齊。 一個更簡單的解決方案是將所有欄位對齊到最大對齊邊界的大小,該邊界在下圖所示的例子中為 4。
雖然此方案留下較大漏洞,但實作程式碼相對簡單且快速。 在大多數情況下,這會抵銷未使用記憶體中所支付的罰款。 使用此方法的範例請參見 使用 SQLBindCol。