Aracılığıyla paylaş


Hizalama

ODBC uygulamasındaki hizalama sorunları genellikle diğer herhangi bir uygulamadakinden farklı değildir. Diğer bir ifadeyle, odbc uygulamalarının çoğunda hizalamayla ilgili çok az sorun olur veya hiç sorun olmaz. Adresleri hizalamama cezaları donanıma ve işletim sistemine göre değişir ve hafif bir performans cezası kadar küçük veya önemli bir çalışma zamanı hatası kadar önemli olabilir. Bu nedenle, ODBC uygulamaları ve özellikle taşınabilir ODBC uygulamaları, verileri düzgün hizalamaya dikkat etmelidir.

ODBC uygulamalarının hizalama sorunlarıyla karşılaşmasına örnek olarak büyük bir bellek bloğu ayırmaları ve bu belleğin farklı bölümlerini bir sonuç kümesindeki sütunlara bağlamaları gösteriliyor. Bu durum, büyük olasılıkla genel bir uygulamanın çalışma zamanında bir sonuç kümesinin şeklini belirlemesi ve buna göre bellek ayırması ve bağlaması gerektiğinde ortaya çıkar.

Örneğin, bir uygulamanın kullanıcı tarafından girilen bir SELECT deyimini yürüttüğü ve sonuçları bu deyimden aldığı varsayılır. Program yazıldığında bu sonuç kümesinin şekli bilinmediğinden, sonuç kümesi oluşturulduktan sonra uygulamanın her sütunun türünü belirlemesi ve buna göre belleği bağlaması gerekir. Bunu yapmanın en kolay yolu, büyük bir bellek bloğu ayırmak ve bu bloktaki farklı adresleri her sütuna bağlamaktır. Bir sütundaki verilere erişmek için uygulama bu sütuna bağlı belleği yayınlar.

Aşağıdaki diyagramda örnek bir sonuç kümesi ve her SQL veri türü için varsayılan C veri türü kullanılarak bir bellek bloğunun buna nasıl bağlanabileceği gösterilmektedir. Her "X" tek bir bellek baytını temsil eder. (Bu örnekte yalnızca sütunlara bağlı olan veri arabellekleri gösterilir. Bu basitlik için yapılır. Gerçek kodda uzunluk/gösterge arabellekleri de hizalanmalıdır.)

Varsayılan olarak C veri türünü SQL veri türüne bağlama

İlişkili adreslerin Adres dizisinde depolandığını varsayarsak, uygulama her sütuna bağlı belleğe erişmek için aşağıdaki ifadeleri kullanır:

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

İkinci ve üçüncü sütunlara bağlı adreslerin tek numaralı baytlarla başladığına ve üçüncü sütuna bağlı adresin SDWORD boyutu olan dört ile bölünemediğini görebilirsiniz. Bazı makinelerde bu sorun olmayacaktır; diğerlerinde ise hafif bir performans cezasına neden olur; diğerlerinde ise önemli bir çalışma zamanı hatasına neden olur. Her ilişkili adresi doğal hizalama sınırına hizalamak daha iyi bir çözüm olabilir. Bunun UCHAR için 1, SWORD için 2 ve SDWORD için 4 olduğunu varsayarsak, bu sonuç aşağıdaki çizimde gösterilen sonucu verir; burada "X" kullanılan bir bellek baytını, "O" ise kullanılmayan bir bellek baytını temsil eder.

Doğal hizalama sınırına göre bağlama

Bu çözüm uygulamanın tüm belleğini kullanmasa da herhangi bir hizalama sorunuyla karşılaşmaz. Ne yazık ki, her sütunun türüne göre ayrı ayrı hizalanması gerektiğinden, bu çözümü uygulamak için makul miktarda kod gerekir. Daha basit bir çözüm, tüm sütunları aşağıdaki çizimde gösterilen örnekte 4 olan en büyük hizalama sınırının boyutuna hizalamaktır.

En büyük hizalama sınırına göre bağlama

Bu çözüm daha büyük delikler bıraksa da, bunu uygulamak için kod nispeten basit ve hızlıdır. Çoğu durumda bu, kullanılmayan bellekte ödenen cezayı dengeler. Bu yöntemi kullanan bir örnek için bkz. SQLBindCol kullanma.