Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
DBMS'ler uzun verileri 255 karakter gibi belirli bir boyuttaki herhangi bir karakter veya ikili veri olarak tanımlar. Bu veriler, birkaç bin karakterlik bir parça açıklaması gibi tek bir arabellekte depolanabilecek kadar küçük olabilir. Ancak, uzun metin belgeleri veya bit eşlemler gibi bellekte depolamak çok uzun olabilir. Bu tür veriler tek bir arabellekte depolanamadığından, satırdaki diğer veriler getirildikten sonra SQLGetData kullanılarak parça parça sürücüden alınır.
Uyarı
Bir uygulama SQLGetData ile yalnızca uzun veri değil, aslında herhangi bir veri türünü geri getirebilir, ancak yalnızca karakter ve ikili veriler parçalar halinde alınabilir. Ancak, veriler tek bir arabelleğe sığacak kadar küçükse SQLGetData'yı kullanmak için genellikle bir neden yoktur. Bir arabelleği sütuna bağlamak ve sürücünün arabellekteki verileri döndürmesine izin vermek çok daha kolaydır.
Bir sütundan uzun verileri almak için, bir uygulama ilk olarak SQLFetchScroll veya SQLFetch'i çağırarak bir satıra geçer ve ilişkili sütunların verilerini getirir. Uygulama daha sonra SQLGetData'yi çağırır. SQLGetData , SQLBindCol ile aynı bağımsız değişkenlere sahiptir: deyim tanıtıcısı; sütun numarası; bir uygulama değişkeninin C veri türü, adresi ve bayt uzunluğu; ve uzunluk/gösterge arabelleğinin adresi. Her iki işlev de temelde aynı görevi gerçekleştirdiğinden aynı bağımsız değişkenlere sahiptir: Her ikisi de sürücüye yönelik bir uygulama değişkenini açıklar ve belirli bir sütuna ait verilerin bu değişkende döndürülmesi gerektiğini belirtir. Önemli farklar , SQLGetData'nın bir satır getirildikten sonra çağrılmış olması (ve bu nedenle bazen geç bağlama olarak da adlandırılır) ve SQLGetData tarafından belirtilen bağlamanın yalnızca çağrı süresince sürmesidir.
Tek bir sütunla ilgili olarak SQLGetData , SQLFetch gibi davranır: Sütunun verilerini alır, uygulama değişkeninin türüne dönüştürür ve bu değişkende döndürür. Ayrıca, uzunluk/gösterge arabelleğindeki verilerin bayt uzunluğunu döndürür. SQLFetch'in verileri nasıl döndürdüğü hakkında daha fazla bilgi için bkz. Veri Satırı Getirme.
SQLGetData , SQLFetch'ten önemli bir açıdan farklıdır. Aynı sütun için ardışık olarak birden fazla çağrılırsa, her çağrı verilerin ardışık bir bölümünü döndürür. Son çağrı dışındaki her çağrı SQL_SUCCESS_WITH_INFO ve SQLSTATE 01004 döndürür (Dize verileri, sağ kesilmiş); son çağrı SQL_SUCCESS döndürür. Parçalar halinde uzun verileri almak için SQLGetData bu şekilde kullanılır. Döndürülecek veri kalmadığında SQLGetData SQL_NO_DATA döndürür. Uygulama, uzun verileri bir araya getirmekle sorumludur ve bu da verilerin bölümlerinin birleştirilmesi anlamına gelebilir. Her bölüm null olarak sonlandırılır; parçalar birleştirilmişse uygulamanın null sonlandırma karakterini kaldırması gerekir. Parçalar halinde veri alma işlemi hem değişken uzunluklu yer işaretleri hem de diğer uzun veriler için yapılabilir. Uzunluk/gösterge arabelleğinde döndürülen değer, her çağrıda önceki çağrıda döndürülen bayt sayısına göre azalır, ancak sürücünün kullanılabilir veri miktarını bulamaması ve SQL_NO_TOTAL bayt uzunluğu döndürmesi yaygın bir durumdur. Örneğin:
// Declare a binary buffer to retrieve 5000 bytes of data at a time.
SQLCHAR BinaryPtr[5000];
SQLUINTEGER PartID;
SQLINTEGER PartIDInd, BinaryLenOrInd, NumBytes;
SQLRETURN rc;
SQLHSTMT hstmt;
// Create a result set containing the ID and picture of each part.
SQLExecDirect(hstmt, "SELECT PartID, Picture FROM Pictures", SQL_NTS);
// Bind PartID to the PartID column.
SQLBindCol(hstmt, 1, SQL_C_ULONG, &PartID, 0, &PartIDInd);
// Retrieve and display each row of data.
while ((rc = SQLFetch(hstmt)) != SQL_NO_DATA) {
// Display the part ID and initialize the picture.
DisplayID(PartID, PartIDInd);
InitPicture();
// Retrieve the picture data in parts. Send each part and the number
// of bytes in each part to a function that displays it. The number
// of bytes is always 5000 if there were more than 5000 bytes
// available to return (cbBinaryBuffer > 5000). Code to check if
// rc equals SQL_ERROR or SQL_SUCCESS_WITH_INFO not shown.
while ((rc = SQLGetData(hstmt, 2, SQL_C_BINARY, BinaryPtr, sizeof(BinaryPtr),
&BinaryLenOrInd)) != SQL_NO_DATA) {
NumBytes = (BinaryLenOrInd > 5000) || (BinaryLenOrInd == SQL_NO_TOTAL) ?
5000 : BinaryLenOrInd;
DisplayNextPictPart(BinaryPtr, NumBytes);
}
}
// Close the cursor.
SQLCloseCursor(hstmt);
SQLGetData'nın kullanılmasıyla ilgili çeşitli kısıtlamalar vardır. Genel olarak SQLGetData ile erişilen sütunlar:
Artan sütun numarası sırasına göre erişilmelidir (sonuç kümesinin sütunlarının veri kaynağından okunma şekli nedeniyle). Örneğin, 5. sütun için SQLGetData çağrısı yapmak ve ardından 4. sütun için çağırmak bir hatadır.
Bağlanması mümkün değil.
Son ilişkili sütundan daha yüksek bir sütun numarasına sahip olmalıdır. Örneğin, son ilişkili sütun sütun 3 ise, 2. sütun için SQLGetData çağrısı yapmak bir hatadır. Bu nedenle, uygulamalar uzun veri sütunlarını seçme listesinin sonuna yerleştirdiğinden emin olmalıdır.
Birden fazla satır almak için SQLFetch veya SQLFetchScroll çağrıldığında kullanılamaz. Daha fazla bilgi için bkz. Blok İmleçlerini Kullanma.
Bazı sürücüler bu kısıtlamaları uygulamaz. Birlikte çalışabilen uygulamalar var olduklarını varsaymalı veya sqlGetInfo SQL_GETDATA_EXTENSIONS seçeneğiyle çağrılarak hangi kısıtlamaların uygulanmadığını belirlemelidir.
Uygulamanın bir karakter veya ikili veri sütunundaki tüm verilere ihtiyacı yoksa, deyimini yürütmeden önce SQL_ATTR_MAX_LENGTH deyimi özniteliğini ayarlayarak DBMS tabanlı sürücülerdeki ağ trafiğini azaltabilir. Bu, herhangi bir karakter veya ikili sütun için döndürülecek veri bayt sayısını kısıtlar. Örneğin, bir sütunun uzun metin belgeleri içerdiğini varsayalım. Bu sütunu içeren tabloya göz atan bir uygulamanın her belgenin yalnızca ilk sayfasını görüntülemesi gerekebilir. Bu deyim özniteliği sürücüde simüle edilese de, bunu yapmak için bir neden yoktur. Özellikle, bir uygulama karakter veya ikili verileri kesmeyi istiyorsa, SQLBindCol ile sütuna küçük bir arabellek bağlamalı ve sürücünün verileri kesmesine izin vermelidir.