Aracılığıyla paylaş


SQLGetData İşlevi

uyumluluk
Kullanıma Sunulan Sürüm: ODBC 1.0 Standartları Uyumluluğu: ISO 92

Özeti
SQLGetData, SQLParamData SQL_PARAM_DATA_AVAILABLE döndürdüğü nde, sonuç kümesindeki tek bir sütunun veya tek bir parametrenin verilerini alır. Parçalar halinde değişken uzunluktaki verileri almak için birden çok kez çağrılabilir.

Sözdizimi

  
SQLRETURN SQLGetData(  
      SQLHSTMT       StatementHandle,  
      SQLUSMALLINT   Col_or_Param_Num,  
      SQLSMALLINT    TargetType,  
      SQLPOINTER     TargetValuePtr,  
      SQLLEN         BufferLength,  
      SQLLEN *       StrLen_or_IndPtr);  

Bağımsız değişken

StatementHandle
[Giriş] Deyim tanıtıcısı.

Col_or_Param_Num
[Giriş] Sütun verilerini almak için, veri döndürülecek sütunun sayısıdır. Sonuç kümesi sütunları, 1'den başlayarak artan sütun sırasına göre numaralandırılır. Yer işareti sütunu 0 numaralı sütundur; bu yalnızca yer işaretleri etkinse belirtilebilir.

Parametre verilerini almak için, parametrenin 1'de başlayan sıra değeridir.

TargetType
[Giriş] *TargetValuePtr arabelleğinin C veri türünün tür tanımlayıcısı. Geçerli C veri türlerinin ve tür tanımlayıcılarının listesi için Ek D: Veri Türleri'ndeki C Veri Türleri bölümüne bakın.

TargetType SQL_ARD_TYPE ise, sürücü ARD'nin SQL_DESC_CONCISE_TYPE alanında belirtilen tür tanımlayıcısını kullanır. TargetType SQL_APD_TYPE SQLGetData, SQLBindParameteriçinde belirtilen C veri türünü kullanır. Aksi takdirde, sqlgetdata belirtilen C veri türü, SQLBindParameteriçinde belirtilen C veri türünü geçersiz kılar. SQL_C_DEFAULT ise, sürücü kaynağın SQL veri türüne göre varsayılan C veri türünü seçer.

Genişletilmiş bir C veri türü de belirtebilirsiniz. Daha fazla bilgi için bkz. ODBCC Veri Türleri.

TargetValuePtr
[Çıkış] Verilerin döndürüleceği arabelleğe ilişkin işaretçi.

TargetValuePtr NULL olamaz.

BufferLength
[Giriş] *TargetValuePtr arabelleğinin bayt cinsinden uzunluğu.

Sürücü, karakter veya ikili veriler gibi değişken uzunlukta veriler döndürürken *TargetValuePtr arabelleğinin sonuna yazmamak için BufferLength kullanır. Sürücü, karakter verilerini *TargetValuePtrdöndürürken null sonlandırma karakterini sayar. * TargetValuePtr bu nedenle null sonlandırma karakteri için alan içermelidir, aksi takdirde sürücü verileri kesecektir.

Sürücü tamsayı veya tarih yapısı gibi sabit uzunlukta veriler döndürdüğünde, sürücü bufferLength yoksayar ve arabellek verileri barındıracak kadar büyük olduğunu varsayar. Bu nedenle, uygulamanın sabit uzunluktaki veriler için yeterince büyük bir arabellek ayırması önemlidir; aksi takdirde sürücü arabelleğin sonundan sonra yazar.

BufferLength 0'dan küçükse ancak BufferLength 0 olduğunda sqlstate HY090 (Geçersiz dize veya arabellek uzunluğu) SQLGetData döndürür.

StrLen_or_IndPtr
[Çıkış] Uzunluk veya gösterge değerinin döndürüleceği arabelleğe ilişkin işaretçi. Bu null bir işaretçiyse, uzunluk veya gösterge değeri döndürülür. Bu, getirilen veriler NULL olduğunda bir hata döndürür.

SQLGetData uzunluk/gösterge arabelleğinde aşağıdaki değerleri döndürebilir:

  • Döndürülecek verilerin uzunluğu

  • SQL_NO_TOTAL

  • SQL_NULL_DATA

Daha fazla bilgi için bu konudaki Uzunluk/Gösterge Değerlerini Kullanma ve "Açıklamalar" bölümüne bakın.

Döndürür

SQL_SUCCESS, SQL_SUCCESS_WITH_INFO, SQL_NO_DATA, SQL_STILL_EXECUTING, SQL_ERROR veya SQL_INVALID_HANDLE.

Tanılama

SQLGetData SQL_ERROR veya SQL_SUCCESS_WITH_INFO döndürdüğünde, SQL_HANDLE_STMT HandleType ve StatementHandleHandle ile SQLGetDiagRec çağrılarak ilişkili bir SQLSTATE değeri elde edilebilir. Aşağıdaki tabloda, SQLGetData tarafından yaygın olarak döndürülen SQLSTATE değerleri listelenmektedir ve her biri bu işlev bağlamında açıklanmaktadır; "(DM)" gösterimi, Sürücü Yöneticisi tarafından döndürülen SQLSTATEs açıklamalarından önce gelir. Aksi belirtilmediği sürece, her SQLSTATE değeriyle ilişkili dönüş kodu SQL_ERROR.

SQLSTATE Hata Açıklama
01000 Genel uyarı Sürücüye özgü bilgilendirici ileti. (İşlev SQL_SUCCESS_WITH_INFO döndürür.)
01004 Dize verileri, sağ kesilmiş belirtilen sütunun Col_or_Param_Numtüm verileri işleve yapılan tek bir çağrıda alınamadı. SQL_NO_TOTAL veya geçerli SQLGetData çağrısından önceki belirtilen sütunda kalan verilerin uzunluğu *StrLen_or_IndPtriçinde döndürülür. (İşlev SQL_SUCCESS_WITH_INFO döndürür.)

Tek bir sütun için sqlgetdata birden çok çağrı kullanma hakkında daha fazla bilgi için bkz. "Açıklamalar."
01S07 Kesirli kesme Bir veya daha fazla sütun için döndürülen veriler kesildi. Sayısal veri türleri için sayının kesirli kısmı kesildi. Zaman bileşeni içeren zaman, zaman damgası ve aralık veri türleri için, zamanın kesirli kısmı kesildi.

(İşlev SQL_SUCCESS_WITH_INFO döndürür.)
07006 Kısıtlanmış veri türü özniteliği ihlali Sonuç kümesindeki bir sütunun veri değeri, TargetTypebağımsız değişkeni tarafından belirtilen C veri türüne dönüştürülemez.
07009 Geçersiz tanımlayıcı dizini Col_or_Param_Num bağımsız değişkeni için belirtilen değer 0'dı ve SQL_ATTR_USE_BOOKMARKS deyimi özniteliği SQL_UB_OFF olarak ayarlandı.

Col_or_Param_Num bağımsız değişkeni için belirtilen değer, sonuç kümesindeki sütun sayısından fazlaydı.

Col_or_Param_Num değeri, kullanılabilir parametrenin sıralı değerine eşit değildi.

(DM) Belirtilen sütun bağlıydı. Bu açıklama, sqlgetinfoSQL_GETDATA_EXTENSIONS seçeneği için SQL_GD_BOUND bit maskesi döndüren sürücüler için geçerli değildir.

(DM) Belirtilen sütunun sayısı en yüksek ilişkili sütunun sayısından küçük veya buna eşitti. Bu açıklama, sqlgetinfo
SQL_GETDATA_EXTENSIONS seçeneği için SQL_GD_ANY_COLUMN bit maskesi döndüren sürücüler için geçerli değildir.

(DM) Uygulama zaten geçerli satır için SQLGetData çağırdı; geçerli çağrıda belirtilen sütunun sayısı, önceki çağrıda belirtilen sütunun sayısından küçüktü; ve sürücü sqlgetinfoSQL_GETDATA_EXTENSIONS seçeneği için SQL_GD_ANY_ORDER bit maskesi döndürmez.

(DM) TargetType bağımsız değişkeni SQL_ARD_TYPE ve ARD'deki Col_or_Param_Num tanımlayıcı kaydı tutarlılık denetiminde başarısız oldu.

(DM) TargetType bağımsız değişkeni SQL_ARD_TYPE ve ARD'nin SQL_DESC_COUNT alanındaki değer Col_or_Param_Num bağımsız değişkenden küçüktür.
08S01 İletişim bağlantısı hatası sürücü ile sürücünün bağlandığı veri kaynağı arasındaki iletişim bağlantısı, işlev işlenmeden önce başarısız oldu.
22002 Gösterge değişkeni gerekli ancak sağlanmadı StrLen_or_IndPtr null bir işaretçiydi ve NULL veriler alındı.
22003 Sayısal değer aralık dışında Sütunun sayısal değerini (sayısal veya dize olarak) döndürmek sayının tamamının (kesirlinin aksine) kesilmesine neden olabilir.

Daha fazla bilgi için bkz. Ek D: Veri Türleri.
22007 Geçersiz tarih saat biçimi Sonuç kümesindeki karakter sütunu C tarih, saat veya zaman damgası yapısına bağlıydı ve sütundaki değer sırasıyla geçersiz bir tarih, saat veya zaman damgasıydı. Daha fazla bilgi için bkz. Ek D: Veri Türleri.
22012 Sıfıra bölme Aritmetik ifadeden sıfıra bölmeyle sonuçlanan bir değer döndürüldü.
22015 Aralık alanı taşması Tam bir sayısal veya aralık SQL türünden C aralığı türüne atama, baştaki alanda önemli basamak kaybına neden oldu.

Verileri bir C aralığına döndürürken, C aralığında SQL türünün değerinin gösterimi yoktu.
22018 Atama belirtimi için geçersiz karakter değeri Sonuç kümesindeki bir karakter sütunu bir C karakteri arabelleğine döndürüldü ve sütun, arabelleğin karakter kümesinde gösterimi olmayan bir karakter içeriyordu.

C türü tam veya yaklaşık bir sayısal, tarih saat veya aralık veri türü idi; sütunun SQL türü bir karakter veri türü idi; ve sütundaki değer, ilişkili C türünün geçerli bir değişmez değeri değildi.
24000 Geçersiz imleç durumu (DM) İşlev, ilk olarak SQLFetch veya sqlFetchScroll çağrılmadan çağrılarak imleci gereken veri satırına konumlandırıldı.

(DM) StatementHandle yürütüldü, ancak StatementHandleile hiçbir sonuç kümesi ilişkilendirilmemiş.

StatementHandle üzerinde bir imleç açıktı ve SQLFetch
veya SQLFetchScroll çağrıldı, ancak imleç sonuç kümesinin başlangıcından önce veya sonuç kümesinin sonundan sonra konumlandırıldı.
HY000 Genel hata Belirli bir SQLSTATE olmayan ve uygulamaya özgü SQLSTATE tanımlanmayan bir hata oluştu. MessageText arabelleğindeki SQLGetDiagRec tarafından döndürülen hata iletisi, hatayı ve nedenini açıklar.
HY001 Bellek ayırma hatası Sürücü, işlevin yürütülmesini veya tamamlanmasını desteklemek için gereken belleği ayıramadı.
HY003 Program türü aralık dışında (DM) TargetType bağımsız değişkeni geçerli bir veri türü, SQL_C_DEFAULT, SQL_ARD_TYPE (sütun verilerinin alınması durumunda) veya SQL_APD_TYPE (parametre verilerinin alınması durumunda) değildi.

(DM) Col_or_Param_Num bağımsız değişkeni 0'dı ve TargetType bağımsız değişkeni sabit uzunlukta yer işareti için SQL_C_BOOKMARK veya değişken uzunluklu yer işareti için SQL_C_VARBOOKMARK değildi.
HY008 İşlem iptal edildi StatementHandleiçin zaman uyumsuz işleme etkinleştirildi. İşlev çağrıldı ve yürütmeyi tamamlamadan önce SQLCancel veya SQLCancelHandle StatementHandleüzerinde çağrıldı ve ardından işlev StatementHandleüzerinde yeniden çağrıldı.

İşlev çağrıldı ve yürütmeyi tamamlamadan önce SQLCancel
veya SQLCancelHandle , çok iş parçacıklı bir uygulamadaki farklı bir iş parçacığından StatementHandle çağrıldı ve ardından işlev StatementHandleüzerinde yeniden çağrıldı.
HY009 Geçersiz null işaretçi kullanımı (DM) TargetValuePtr bağımsız değişkeni null işaretçiydi.
HY010 İşlev dizisi hatası (DM) Belirtilen StatementHandle yürütüldü durumunda değildi. İşlev, sqlexecute veya katalog işlevi SQLExecDirectçağrılmadan çağrıldı.

(DM) StatementHandleile ilişkili bağlantı tanıtıcısı için zaman uyumsuz olarak yürütülen bir işlev çağrıldı. SQLGetData işlevi çağrıldığında bu zaman uyumsuz işlev hala yürütülüyordu.

(DM) StatementHandle için zaman uyumsuz olarak yürütülen bir işlev (bu işlev değil) çağrıldı ve bu işlev çağrıldığında hala yürütülüyordu.

(DM) SQLExecute, SQLExecDirect, SQLBulkOperationsveya SQLSetPos, StatementHandle için çağrıldı ve SQL_NEED_DATA döndürdü. Bu işlev, tüm yürütme sırasında veri parametreleri veya sütunları için veri gönderilmeden önce çağrıldı.

(DM) StatementHandle yürütüldü, ancak StatementHandleile hiçbir sonuç kümesi ilişkilendirilmemiş.

SQLExecute, sqlexecdirect
veya SQLMoreResults çağrısı SQL_PARAM_DATA_AVAILABLE döndürdü, ancak SQLParamDatayerine SQLGetData çağrıldı.
HY013 Bellek yönetimi hatası Büyük olasılıkla düşük bellek koşulları nedeniyle, temel alınan bellek nesnelerine erişilemediğinden işlev çağrısı işlenemedi.
HY090 Geçersiz dize veya arabellek uzunluğu (DM) BufferLength bağımsız değişkeni için belirtilen değer 0'dan küçüktür.

BufferLength
bağımsız değişkeni için belirtilen değer 4'ten küçük, Col_or_Param_Num bağımsız değişkeni 0 olarak ayarlandı ve sürücü bir ODBC 2*.x* sürücüsü oldu.
HY109 Geçersiz imleç konumu İmleç silinmiş veya getirilemeyen bir satırda (SQLSetPos, SQLFetch, SQLFetchScrollveya SQLBulkOperations) konumlandırıldı.

İmleç yalnızca ileriye dönük bir imleçti ve satır kümesi boyutu birden büyük.
HY117 Bilinmeyen işlem durumu nedeniyle bağlantı askıya alındı. Yalnızca bağlantıyı kesme ve salt okunur işlevlere izin verilir. (DM) Askıya alma durumu hakkında daha fazla bilgi için bkz. SQLEndTran İşlevi.
HYC00 İsteğe bağlı özellik uygulanmadı Sürücü veya veri kaynağı, SQLFetchScroll'da birden çok satıra sahip SQLGetData kullanımını desteklemez. Bu açıklama, sqlgetinfoSQL_GETDATA_EXTENSIONS seçeneği için SQL_GD_BLOCK bit maskesi döndüren sürücüler için geçerli değildir.

Sürücü veya veri kaynağı, TargetType bağımsız değişkeninin ve ilgili sütunun SQL veri türünün birleşimiyle belirtilen dönüştürmeyi desteklemez. Bu hata yalnızca sütunun SQL veri türü sürücüye özgü bir SQL veri türüne eşlendiğinde geçerlidir.

Sürücü yalnızca ODBC 2*.x* sürümünü destekler ve TargetType
bağımsız değişkeni aşağıdakilerden biriydi:

SQL_C_NUMERIC SQL_C_SBIGINT SQL_C_UBIGINT

ve ek D: Veri Türleri'nde C Veri Türleri listelenen C veri türlerinden herhangi biri.

Sürücü yalnızca 3.50 öncesi ODBC sürümlerini destekler ve TargetType
bağımsız değişkeni SQL_C_GUID.
HYT01 Bağlantı zaman aşımı süresi doldu Veri kaynağı isteği yanıtlamadan önce bağlantı zaman aşımı süresi doldu. Bağlantı zaman aşımı süresi SQLSetConnectAttrSQL_ATTR_CONNECTION_TIMEOUT üzerinden ayarlanır.
IM001 Sürücü bu işlevi desteklemiyor (DM) StatementHandle karşılık gelen sürücü işlevi desteklemez.
IM017 Yoklama zaman uyumsuz bildirim modunda devre dışı bırakıldı Bildirim modeli her kullanıldığında yoklama devre dışı bırakılır.
IM018 SQLCompleteAsync bu tanıtıcıda önceki zaman uyumsuz işlemi tamamlamak için çağrılmadı. Tanıtıcıdaki önceki işlev çağrısı SQL_STILL_EXECUTING döndürüyorsa ve bildirim modu etkinse, SQLCompleteAsync işlem sonrası işlem yapmak ve işlemi tamamlamak için tanıtıcıda çağrılmalıdır.

Yorum

SQLGetData belirtilen sütundaki verileri döndürür. SQLGetData yalnızca SQLFetch, SQLFetchScrollveya SQLExtendedFetchtarafından ayarlanan sonuç kümesinden bir veya daha fazla satır getirildikten sonra çağrılabilir. SqlGetData (uygulamadaki bir sınırlama nedeniyle) için tek bir çağrıda döndürülemeyecek kadar değişken uzunlukta veriler döndürülemeyecek kadar büyükse, SQLGetData bunları parçalar halinde alabilir. Bazı kısıtlamalara tabi olsa da, bazı sütunları bir satıra bağlamak ve diğerleri için SQLGetData çağırmak mümkündür. Daha fazla bilgi için bkz. uzun veri alma.

Akışlı çıkış parametreleriyle SQLGetData kullanma hakkında bilgi için bkz. SQLGetDataKullanarak Çıktı Parametrelerini Alma.

SQLGetData kullanma

Sürücü SQLGetDatauzantılarını desteklemiyorsa, işlev yalnızca son ilişkili sütundan daha büyük bir sayıya sahip ilişkisiz sütunlar için veri döndürebilir. Ayrıca, bir veri satırı içinde, SQLGetData her çağrıdaki Col_or_Param_Num bağımsız değişkeninin değeri önceki çağrıdaki Col_or_Param_Num değerinden büyük veya buna eşit olmalıdır; yani, verilerin artan sütun numarası sırasına göre alınması gerekir. Son olarak, hiçbir uzantı desteklenmiyorsa, satır kümesi boyutu 1'den büyükse SQLGetData çağrılamaz.

Sürücüler bu kısıtlamaların herhangi birini gevşetebilir. Bir uygulama, bir sürücünün hangi kısıtlamaları gevşeteceğini belirlemek için aşağıdaki SQL_GETDATA_EXTENSIONS seçeneklerden herhangi biriyle SQLGetInfo çağırır:

  • SQL_GD_OUTPUT_PARAMS = SQLGetData çıkış parametresi değerlerini döndürmek için çağrılabilir. Daha fazla bilgi için bkz. SQLGetDataKullanarak Çıktı Parametrelerini Alma .

  • SQL_GD_ANY_COLUMN. Bu seçenek döndürülürse SQLGetData, son ilişkili sütundan öncekiler de dahil olmak üzere ilişkisiz herhangi bir sütun için çağrılabilir.

  • SQL_GD_ANY_ORDER. Bu seçenek döndürülürse, sqlgetdata herhangi bir sırada ilişkisiz sütunlar için çağrılabilir.

  • SQL_GD_BLOCK. Bu seçenek SQL_GETDATA_EXTENSIONS InfoType için SQLGetInfo döndürülürse, sürücü satır kümesi boyutu 1'den büyük olduğunda sqlgetdata çağrılarını destekler ve uygulama SQLGetData'yı çağırmadan önce imleci doğru satıra konumlandırmak için SQL_POSITION seçeneğiyle SQLSetPos çağırabilir.

  • SQL_GD_BOUND. Bu seçenek döndürülürse, sqlgetdata ilişkili sütunlar ve ilişkisiz sütunlar için çağrılabilir.

Bu kısıtlamaların iki istisnası vardır ve bir sürücünün bunları gevşetme yeteneği vardır. İlk olarak, satır kümesi boyutu 1'den büyük olduğunda SQLGetData hiçbir zaman yalnızca ileri imleç için çağrılmamalıdır. İkinci olarak, bir sürücü yer işaretlerini destekliyorsa, uygulamaların son ilişkili sütundan önce diğer sütunlar için SQLGetData çağırmasına izin vermese bile, 0 sütunu için SQLGetData çağırma özelliğini her zaman desteklemelidir. (Bir uygulama ODBC 2*.x* sürücüsüyle çalışırken, SQLGetData SQLFetchçağrısından sonra 0'a eşit Col_or_Param_Num ile çağrıldığında bir yer işareti döndürür çünkü SQLFetch ODBC 3*.x* Sürücü Yöneticisi tarafından SQLExtendedFetch ile FetchOrientation SQL_FETCH_NEXT eşlenir, ve 0 Col_or_Param_Num sahip SQLGetData ODBC 3*.x* Sürücü Yöneticisi tarafından sqlGetStmtOption SQL_GET_BOOKMARK fOption ile eşlenir.)

SQLGetData, SQLBulkOperations SQL_ADD seçeneğiyle çağrılarak eklenen satırın yer işaretini almak için kullanılamaz, çünkü imleç satıra konumlandırılmaz. Bir uygulama, sqlbulkoperations SQL_ADD çağırmadan önce 0 sütununu bağlayarak bu tür bir satırın yer işaretini alabilir ve bu durumda SQLBulkOperations ilişkili arabellekteki yer işaretini döndürür. SQLFetchScroll, imleci bu satırda yeniden konumlandırmak için SQL_FETCH_BOOKMARK ile çağrılabilir.

TargetType bağımsız değişkeni bir aralık veri türüyse, veriler için sırasıyla ARD'nin SQL_DESC_DATETIME_INTERVAL_PRECISION ve SQL_DESC_PRECISION alanlarında ayarlandığı gibi varsayılan aralık baştaki duyarlık (2) ve varsayılan aralık saniye duyarlığı (6) kullanılır. TargetType bağımsız değişkeni SQL_C_NUMERIC bir veri türüyse, veriler için ARD'nin SQL_DESC_PRECISION ve SQL_DESC_SCALE alanlarında ayarlandığı gibi varsayılan duyarlık (sürücü tanımlı) ve varsayılan ölçek (0) kullanılır. Herhangi bir varsayılan duyarlık veya ölçek uygun değilse, uygulamanın SQLSetDescField veya SQLSetDescRecçağrısıyla uygun tanımlayıcı alanını açıkça ayarlaması gerekir. SQL_DESC_CONCISE_TYPE alanını SQL_C_NUMERIC olarak ayarlayabilir ve SQL_ARD_TYPE TargetType bağımsız değişkeniyle SQLGetData çağırabilir ve bu da tanımlayıcı alanlarındaki duyarlık ve ölçek değerlerinin kullanılmasına neden olur.

Not

ODBC 2*.x*'te uygulamalar TargetType SQL_C_DATE, SQL_C_TIME veya SQL_C_TIMESTAMP olarak ayarlayarak *TargetValuePtr bir tarih, saat veya zaman damgası yapısı olduğunu gösterir. ODBC 3*.x*'te uygulamalar TargetType SQL_C_TYPE_DATE, SQL_C_TYPE_TIME veya SQL_C_TYPE_TIMESTAMP olarak ayarlar. Sürücü Yöneticisi, uygulama ve sürücü sürümüne göre gerekirse uygun eşlemeleri yapar.

Parçalar halinde Variable-Length Verileri Alma

SQLGetData, sütundaki SQL veri türünün tanımlayıcısı SQL_CHAR, SQL_VARCHAR, SQL_LONGVARCHAR, SQL_WCHAR, SQL_WVARCHAR, SQL_WLONGVARCHAR, SQL_BINARY, SQL_VARBINARY, SQL_LONGVARBINARY veya değişken uzunluklu bir tür için sürücüye özgü tanımlayıcı olduğunda, parçalar halinde değişken uzunlukta veriler içeren bir sütundan veri almak için kullanılabilir.

Parçalar halindeki bir sütundan veri almak için uygulama sqlgetdata birden çok kez aynı sütun için çağırır. Her çağrıda SQLGetData verilerin sonraki bölümünü döndürür. Karakter verilerinin ara bölümlerinden null sonlandırma karakterini kaldırmaya özen göstererek parçaları yeniden bir araya getirmek uygulamaya bağlı. Döndürülecek daha fazla veri varsa veya sonlandırıcı karakter için yeterli arabellek ayrılmadıysa, SQLGetData SQL_SUCCESS_WITH_INFO ve SQLSTATE 01004 döndürür (Veriler kesildi). Verilerin son bölümünü döndürdüğünde SQLGetData SQL_SUCCESS döndürür. Bir sütundan veri almak için son geçerli çağrıda SQL_NO_TOTAL veya sıfır döndürülemez, çünkü uygulamanın uygulama arabelleğindeki verilerin ne kadarının geçerli olduğunu bilmesi mümkün olmaz. SQLGetData bundan sonra çağrılırsa SQL_NO_DATA döndürür. Daha fazla bilgi için sonraki "SQLGetData ile Veri Alma" bölümüne bakın.

SqlGetDatadeğişken uzunlukta yer işaretleri parçalar halinde döndürülebilir. Diğer verilerde olduğu gibi, parçalarda değişken uzunlukta yer işaretleri döndürmek için SQLGetData çağrısı SQLSTATE 01004 (Dize verileri, sağ kesilmiş) döndürür ve döndürülecek daha fazla veri olduğunda SQL_SUCCESS_WITH_INFO. Bu durum, SQL_ERROR ve SQLSTATE 22001 (Dize verileri, sağ kesilmiş) döndüren SQLFetch veya SQLFetchScrollçağrısıyla değişken uzunluktaki yer işaretinin kesilmesi durumundan farklıdır.

SQLGetData parçalar halinde sabit uzunlukta veriler döndürmek için kullanılamaz. SQLGetData sabit uzunlukta veri içeren bir sütun için bir satırda birden fazla kez çağrılırsa, ilkinden sonraki tüm çağrılar için SQL_NO_DATA döndürür.

Akışa Alınan Çıkış Parametreleri Alınıyor

Bir sürücü akışlı çıkış parametrelerini destekliyorsa, uygulama büyük bir parametre değeri almak için küçük bir arabelleğe sahip SQLGetData birçok kez çağırabilir. Akışlı çıkış parametresi hakkında daha fazla bilgi için bkz. SQLGetDataKullanarak Çıktı Parametrelerini Alma .

SQLGetData ile Veri Alma

Belirtilen sütunun verilerini döndürmek için SQLGetData aşağıdaki adım dizisini gerçekleştirir:

  1. Sütunun tüm verilerini döndürmüşse SQL_NO_DATA döndürür.

  2. Veriler NULL olduğunda *StrLen_or_IndPtr SQL_NULL_DATA olarak ayarlar. Veriler NULL ise ve StrLen_or_IndPtr null işaretçiyse, SQLGetData SQLSTATE 22002 döndürür (Gösterge değişkeni gerekli ancak sağlanmaz).

    Sütunun verileri NULL değilse SQLGetData 3. adıma geçer.

  3. SQL_ATTR_MAX_LENGTH deyimi özniteliği sıfır olmayan bir değere ayarlanırsa, sütun karakter veya ikili veri içeriyorsa ve SQLGetData daha önce sütun için çağrılmadıysa, veriler SQL_ATTR_MAX_LENGTH bayt olarak kesilir.

    Not

    SQL_ATTR_MAX_LENGTH deyimi özniteliği, ağ trafiğini azaltmaya yöneliktir. Genellikle verileri ağ üzerinden döndürmeden önce kesen veri kaynağı tarafından uygulanır. Sürücüleri ve veri kaynaklarını desteklemek için gerekli değildir. Bu nedenle, verilerin belirli bir boyuta kesilmesini garanti etmek için uygulamanın bu boyutta bir arabellek ayırması ve BufferLength bağımsız değişkeninde boyutu belirtmesi gerekir.

  4. Verileri TargetTypeiçinde belirtilen türe dönüştürür. Verilere bu veri türü için varsayılan duyarlık ve ölçek verilir. TargetType SQL_ARD_TYPE ise, ARD'nin SQL_DESC_CONCISE_TYPE alanındaki veri türü kullanılır. TargetType SQL_ARD_TYPE, SQL_DESC_CONCISE_TYPE alanındaki veri türüne bağlı olarak verilere ARD'nin SQL_DESC_DATETIME_INTERVAL_PRECISION, SQL_DESC_PRECISION ve SQL_DESC_SCALE alanlarında duyarlık ve ölçek verilir. Herhangi bir varsayılan duyarlık veya ölçek uygun değilse, uygulamanın SQLSetDescField veya SQLSetDescRecçağrısıyla uygun tanımlayıcı alanını açıkça ayarlaması gerekir.

  5. Veriler karakter veya ikili gibi değişken uzunlukta bir veri türüne dönüştürüldüyse, SQLGetData verilerin uzunluğunun bufferlengthaşıp aşmadığını denetler. Karakter verilerinin uzunluğu (null sonlandırma karakteri dahil) BufferLengthaşıyorsa, SQLGetData verileri BufferLength'e null sonlandırma karakteri uzunluğundan daha az kesecek . Ardından verileri null-terminates. İkili verilerin uzunluğu veri arabelleğinin uzunluğunu aşarsa, SQLGetData bufferlength bayt kesilir.

    Sağlanan veri arabelleği null sonlandırma karakterini tutamayacak kadar küçükse SQLGetData SQL_SUCCESS_WITH_INFO ve SQLSTATE 01004 döndürür.

    SQLGetData sabit uzunlukta veri türlerine dönüştürülen verileri hiçbir zaman kesmez; her zaman *TargetValuePtr uzunluğunun veri türünün boyutu olduğunu varsayar.

  6. Dönüştürülen (ve büyük olasılıkla kesilmiş) verileri *TargetValuePtryerleştirir. SQLGetData verileri satır dışında döndüremediğini unutmayın.

  7. Verilerin uzunluğunu *StrLen_or_IndPtryerleştirir. StrLen_or_IndPtr null bir işaretçiyse, SQLGetData uzunluğu döndürmez.

    • Karakter veya ikili veriler için bu, dönüştürmeden sonra ve BufferLengthnedeniyle kesilmeden önce verilerin uzunluğudur. Sürücü, bazen uzun verilerde olduğu gibi dönüştürmeden sonra verilerin uzunluğunu belirleyemezse, SQL_SUCCESS_WITH_INFO döndürür ve uzunluğu SQL_NO_TOTAL olarak ayarlar. (SQLGetData son çağrı her zaman sıfır veya SQL_NO_TOTAL değil verilerin uzunluğunu döndürmelidir.) veriler SQL_ATTR_MAX_LENGTH deyimi özniteliği nedeniyle kesildiyse, bu özniteliğin değeri (gerçek uzunluğun aksine) *StrLen_or_IndPtriçine yerleştirilir. Bunun nedeni, bu özniteliğin dönüştürmeden önce sunucudaki verileri kesecek şekilde tasarlanmış olmasıdır, bu nedenle sürücünün gerçek uzunluğun ne olduğunu anlamasına imkan yoktur. SQLGetData aynı sütun için ardı ardına birden çok kez çağrıldığında, geçerli çağrının başlangıcında sağlanan verilerin uzunluğu budur; yani, sonraki her çağrıda uzunluk azalır.

    • Diğer tüm veri türleri için bu, dönüştürmeden sonra verilerin uzunluğudur; yani, verilerin dönüştürüldüğü türün boyutudur.

  8. Veriler dönüştürme sırasında anlam kaybı olmadan kesilirse (örneğin, 1.234 gerçek sayısı, 1 tamsayısına dönüştürülürken kesilir veya BufferLength çok küçük olduğundan (örneğin, "abcdef" dizesi 4 baytlık arabelleğe yerleştirilir), SQLGetData SQLSTATE 01004 (Veriler kesilmiş) ve SQL_SUCCESS_WITH_INFO döndürür. veriler SQL_ATTR_MAX_LENGTH deyimi özniteliğinden dolayı önem kaybı olmadan kesilirse, SQLGetData SQL_SUCCESS döndürür ve SQLSTATE 01004 (Veriler kesilmiş) döndürmez.

SQLGetData SQLGetData SQL_SUCCESS veya SQL_SUCCESS_WITH_INFO döndürmezse, ilişkili veri arabelleğinin içeriği (sqlgetdata ilişkili sütunda çağrılırsa) ve uzunluk/gösterge arabelleği tanımlanmamış olur.

sqlgetdata ardışık çağrılar istenen son sütundan veri alır; önceki uzaklıklar geçersiz hale gelir. Örneğin, aşağıdaki sıra gerçekleştirildiğinde:

SQLGetData(icol=n), SQLGetData(icol=m), SQLGetData(icol=n)  

SQLGetData(icol=n) öğesine yapılan ikinci çağrı, n sütununun başından veri alır. Sütun için SQLGetData önceki çağrıları nedeniyle verilerdeki herhangi bir uzaklık artık geçerli değildir.

Tanımlayıcılar ve SQLGetData

SQLGetData hiçbir tanımlayıcı alanıyla doğrudan etkileşim kurmaz.

TargetType SQL_ARD_TYPE ise, ARD'nin SQL_DESC_CONCISE_TYPE alanındaki veri türü kullanılır. TargetType SQL_ARD_TYPE veya SQL_C_DEFAULT ise, SQL_DESC_CONCISE_TYPE alanındaki veri türüne bağlı olarak verilere ARD'nin SQL_DESC_DATETIME_INTERVAL_PRECISION, SQL_DESC_PRECISION ve SQL_DESC_SCALE alanlarında duyarlık ve ölçek verilir.

Kod Örneği

Aşağıdaki örnekte, bir uygulama ad, kimlik ve telefon numarasına göre sıralanmış müşteri kimlikleri, adlar ve telefon numaralarının bir sonuç kümesini döndürmek için bir SELECT deyimi yürütür. Her veri satırı için, imleci sonraki satıra konumlandırmak için SQLFetch çağırır. Getirilen verileri almak için SQLGetData çağırır; SQLGetDataçağrısında verilerin arabellekleri ve döndürülen bayt sayısı belirtilir. Son olarak, her çalışanın adını, kimliğini ve telefon numarasını yazdırır.

#define NAME_LEN 50  
#define PHONE_LEN 50  
  
SQLCHAR      szName[NAME_LEN], szPhone[PHONE_LEN];  
SQLINTEGER   sCustID, cbName, cbAge, cbBirthday;  
SQLRETURN    retcode;  
SQLHSTMT     hstmt;  
  
retcode = SQLExecDirect(hstmt,  
   "SELECT CUSTID, NAME, PHONE FROM CUSTOMERS ORDER BY 2, 1, 3",  
   SQL_NTS);  
  
if (retcode == SQL_SUCCESS) {  
   while (TRUE) {  
      retcode = SQLFetch(hstmt);  
      if (retcode == SQL_ERROR || retcode == SQL_SUCCESS_WITH_INFO) {  
         show_error();  
      }  
      if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO){  
  
         /* Get data for columns 1, 2, and 3 */  
  
         SQLGetData(hstmt, 1, SQL_C_ULONG, &sCustID, 0, &cbCustID);  
         SQLGetData(hstmt, 2, SQL_C_CHAR, szName, NAME_LEN, &cbName);  
         SQLGetData(hstmt, 3, SQL_C_CHAR, szPhone, PHONE_LEN,  
            &cbPhone);  
  
         /* Print the row of data */  
  
         fprintf(out, "%-5d %-*s %*s", sCustID, NAME_LEN-1, szName,   
            PHONE_LEN-1, szPhone);  
      } else {  
         break;  
      }  
   }  
}  
Hakkında bilgi için Görmek
Sonuç kümesindeki bir sütun için depolama alanı atama SQLBindCol
Blok imleci konumuyla ilgili olmayan toplu işlemler gerçekleştirme SQLBulkOperations
Deyim işlemeyi iptal etme SQLCancel
SQL deyimi yürütme SQLExecDirect
Hazırlanmış bir SQL deyimini yürütme SQLExecute
Veri bloğunu getirme veya sonuç kümesinde kaydırma SQLFetchScroll
Tek bir veri satırı veya yalnızca ileri yönde veri bloğu getirme SQLFetch
Yürütme zamanında parametre verileri gönderme SQLPutData
İmleci konumlandırma, satır kümesindeki verileri yenileme veya satır kümesindeki verileri güncelleştirme veya silme SQLSetPos

Ayrıca Bkz.

ODBC API Başvurusu
ODBC Üst Bilgi Dosyaları

SQLGetData
Kullanarak Çıktı Parametrelerini Alma