Aracılığıyla paylaş


Karakter Verileri ve C Dizeleri

Değişken uzunluktaki karakter verilerine (sütun adları, dinamik parametreler ve dize özniteliği değerleri gibi) başvuran giriş parametrelerinin ilişkili uzunluk parametresi vardır. Uygulama, C'de olduğu gibi null karakterle dizeleri sonlandırırsa, dizenin bayt cinsinden uzunluğunu (null sonlandırıcısı dahil değil) veya SQL_NTS (Null-Terminated Dize) olarak bir bağımsız değişken olarak sağlar. Negatif olmayan uzunluk bağımsız değişkeni, ilişkili dizenin gerçek uzunluğunu belirtir. Uzunluk bağımsız değişkeni, NULL değerinden farklı olan sıfır uzunluklu bir dize belirtmek için 0 olabilir. negatif değer SQL_NTS, null sonlandırma karakterini bularak sürücüyü dizenin uzunluğunu belirlemeye yönlendirir.

Sürücüden uygulamaya karakter verileri döndürüldüğünde, sürücü her zaman verileri null ile sonlandırmalıdır. Bu, uygulamaya verilerin dize olarak mı yoksa karakter dizisi olarak mı işleneceğini seçme olanağı verir. Uygulama arabelleği tüm karakter verilerini döndürecek kadar büyük değilse, sürücü bunu arabelleğin bayt uzunluğuna, null sonlandırma karakteri için gereken bayt sayısından daha az olacak şekilde kısaltır, kesilen verileri null olarak sonlandırır ve arabellekte depolar. Bu nedenle, uygulamaların karakter verilerini almak için kullanılan arabelleklerde null sonlandırma karakteri için her zaman ek alan ayırması gerekir. Örneğin, 50 karakterlik verileri almak için 51 baytlık arabellek gerekir.

SQLPutData veya SQLGetData ile parçalar halinde uzun karakter verileri gönderirken veya alırken hem uygulama hem de sürücü tarafından özel özen gösterilmelidir. Veriler bir dizi null sonlandırılan dize olarak geçirilirse, verilerin yeniden birleştirilebilmesi için önce bu dizelerdeki null sonlandırma karakterleri kaldırılmalıdır.

Birkaç ODBC programcısı, karakter verileri ve C dizelerini karıştırdı. Bunun meydana gelmesi, ODBC işlevlerini tanımlarken C dilinin kullanılmasının bir sonucudur. Odbc sürücüsü veya uygulaması başka bir dil kullanıyorsa (ODBC'nin dilden bağımsız olduğunu unutmayın) bu karışıklığın ortaya çıkma olasılığı daha düşüktür.

Karakter verilerini tutmak için C dizeleri kullanıldığında, null sonlandırma karakteri verilerin bir parçası olarak kabul edilmez ve bayt uzunluğunun bir parçası olarak sayılmaz. Örneğin, "ABC" karakter verileri "ABC\0" C dizesi veya {'A', 'B', 'C'} karakter dizisi olarak tutulabilir. Verilerin bayt uzunluğu, dize veya karakter dizisi olarak ele alınmasa da 3'tür.

Uygulamalar ve sürücüler karakter verilerini tutmak için genellikle C dizeleri (null ile sonlandırılan karakter dizileri) kullansa da, bunu yapmak gerekmez. C'de, karakter bilgileri bir karakterler dizisi (null sonlandırma olmadan) olarak işlenebilir ve bayt uzunluğu, uzunluk/gösterge tamponuna ayrı olarak geçirilir.

Karakter verileri null olarak sonlandırılmamış bir dizide tutulabildiğinden ve bayt uzunluğu ayrı olarak geçirildiğinden, karakter verilerine null karakterler eklemek mümkündür. Ancak, bu durumda ODBC işlevlerinin davranışı tanımlanmamıştır ve bir sürücünün bunu doğru işleyip işlemediği sürücüye özgüdür. Bu nedenle, birlikte çalışabilen uygulamalar her zaman ekli null karakterleri ikili veri olarak içerebilen karakter verilerini işlemelidir.