Aracılığıyla paylaş


Veri Uzunluğu, Arabellek Uzunluğu ve Kesme

Veri uzunluğu, veri kaynağında değil, uygulamanın veri arabelleğinde depolanma şekline göre verinin bayt cinsinden uzunluğudur. Veriler genellikle veri kaynağındakinden farklı türlerde veri arabelleğinde depolandığından bu ayrım önemlidir. Bu nedenle, veri kaynağına gönderilen veriler için bu, veri kaynağının türüne dönüştürmeden önce verilerin bayt uzunluğudur. Veri kaynağından alınan veriler için bu, veri arabelleğinin türüne dönüştürüldükten sonra ve herhangi bir kesme işlemi yapılmadan önce verilerin bayt uzunluğudur.

Tamsayı veya tarih yapısı gibi sabit uzunluktaki veriler için verilerin bayt uzunluğu her zaman veri türünün boyutudur. Genel olarak, uygulamalar veri türünün boyutu olan bir veri arabelleği ayırır. Uygulama daha küçük bir arabellek ayırırsa, sürücü veri arabelleğinin veri türünün boyutu olduğunu varsaydığından ve verileri daha küçük bir arabelleğe sığacak şekilde kesmediğinden sonuçları tanımlanmamış olur. Uygulama daha büyük bir arabellek ayırırsa, ek alan hiçbir zaman kullanılmaz.

Karakter veya ikili veri gibi değişken uzunluktaki veriler için, verilerin bayt uzunluğunun arabelleğin bayt uzunluğundan ayrı ve genellikle ondan farklı olduğunu anlamak önemlidir. Bu iki uzunluğun ilişkisi Arabellekler bölümünde açıklanmıştır. Verilerin bayt uzunluğu arabelleğin bayt uzunluğundan büyükse, sürücü getirilen verileri arabelleğin bayt uzunluğuna kadar kısaltır ve SQLSTATE 01004 (Veri kesildi) ile SQL_SUCCESS_WITH_INFO döndürür. Ancak, döndürülen bayt uzunluğu, doğrulanmamış verilerin uzunluğudur.

Örneğin, bir uygulamanın ikili veri arabelleği için 50 bayt ayırmış olduğunu varsayalım. Sürücüde döndürülecek 10 bayt ikili veri varsa, arabellekteki bu 10 bayt'ı döndürür. Verilerin bayt uzunluğu 10, arabelleğinde bayt uzunluğu ise 50'dir. Sürücüde döndürülecek 60 bayt ikili veri varsa, verileri 50 bayta kısaltıp arabellekteki bu baytları döndürür ve SQL_SUCCESS_WITH_INFO döndürür. Verilerin bayt uzunluğu 60 'tır (kesilmeden önceki uzunluk) ve arabelleğin bayt uzunluğu hala 50'dir.

Kesilen her sütun için bir tanılama kaydı oluşturulur. Sürücünün bu kayıtları oluşturması ve uygulamanın bunları işlemesi zaman aldığından, kesme işlemi performansı düşürebilir. Genellikle bir uygulama, uzun verilerle çalışırken mümkün olmasa da yeterince büyük arabellekler ayırarak bu sorunu önleyebilir. Veri kesilmesi gerçekleştiğinde, uygulama bazen daha büyük bir arabellek ayırabilir ve verileri yeniden oluşturabilir; bu her durumda doğru değildir. SQLGetData çağrılarıyla veri alırken kesme gerçekleşirse, uygulamanın daha önce döndürülen veriler için SQLGetData çağrısı yapmaması gerekir; daha fazla bilgi için bkz. Uzun Veri Alma.