SQLBulkOperations İşlevi

Uygunluk
Tanıtılan Sürüm: ODBC 3.0 Standartlara Uyum: ODBC

Summary
SQLBulkOperations , güncelleme, silme ve yer imiyle getirme gibi toplu eklemeler ve toplu yer imi işlemleri gerçekleştirir.

Syntax

  
SQLRETURN SQLBulkOperations(  
     SQLHSTMT       StatementHandle,  
     SQLUSMALLINT   Operation);  

Arguments

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

Operation
[Giriş] Gerçekleştirilecek işlem:

SQL_ADD SQL_UPDATE_BY_BOOKMARK SQL_DELETE_BY_BOOKMARK SQL_FETCH_BY_BOOKMARK

Daha fazla bilgi için "Yorumlar" bölümüne bakınız.

İadeler

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

Diagnostics

SQLBulkOperations SQL_ERROR veya SQL_SUCCESS_WITH_INFO döndürdüğünde, ilişkili bir SQLSTATE değeri alınabilir; bu değer SQLGetDiagRec ile SQL_HANDLE_STMT HandleType ve StatementHandle ile çağrılır. Aşağıdaki tablo, genellikle SQLBulkOperations tarafından duygulanan SQLSTATE değerlerini listeler ve her birini bu fonksiyonun bağlamında açıklar; "(DM)" gösterimi, Sürücü Yöneticisi tarafından döndürülen SQLSTATE açıklamalarından önce gelir. Aksi belirtilmediği sürece, her SQLSTATE değeriyle ilişkili dönüş kodu SQL_ERROR.

SQL_SUCCESS_WITH_INFO veya SQL_ERROR döndürebilen tüm SQLSTATE'ler için (01xxx SQLSTATE hariç), SQL_SUCCESS_WITH_INFO bir veya daha fazla, ancak tüm satırlarda değil satırlarda hata oluşursa döner; tek satırlı bir işlemde hata oluşursa SQL_ERROR döner.

SQLSTATE Error Description
01000 Genel uyarı Sürücüye özgü bilgilendirici ileti. (İşlev SQL_SUCCESS_WITH_INFO döndürür.)
01004 String veri sağ kesintisi Operasyon argümanı SQL_FETCH_BY_BOOKMARK ve bir sütun veya sütunlar için dize veya ikili veri, SQL_C_CHAR veya SQL_C_BINARY veri veri dönerken, boş olmayan karakter veya NULL olmayan ikili verilerin kısaltılmasına yol açardı.
01S01 Sırada hata Operasyon argümanı SQL_ADD ve işlem yapılırken bir veya daha fazla satırda hata oluştu ancak en az bir satır başarıyla eklendi. (İşlev SQL_SUCCESS_WITH_INFO döndürür.)

(Bu hata yalnızca bir uygulama ODBC 2 ile çalışıyorsa ortaya çıkar. x sürücü.)
01S07 Kesirli kesme Operasyon argümanı SQL_FETCH_BY_BOOKMARK, uygulama tamponunun veri tipi SQL_C_CHAR veya SQL_C_BINARY değildi ve bir veya daha fazla sütun için uygulama tamponlarına geri dönen veri kısaltılmıştı. (Sayısal C veri tipleri için, sayının kesirli kısmı kısaltılmıştı. Zaman bileşeni içeren zaman, zaman damgası ve C aralığı veri türleri için, zamanın kesirli kısmı kısaltıldı.)

(İşlev SQL_SUCCESS_WITH_INFO döndürür.)
07006 Kısıtlanmış veri türü özniteliği ihlali Operation argümanı SQL_FETCH_BY_BOOKMARK ve sonuç kümesindeki bir sütunun veri değeri, SQLBindCol çağrısında TargetType argümanı tarafından belirtilen veri türüne dönüştüremiyordu.

Operation argümanı SQL_UPDATE_BY_BOOKMARK veya SQL_ADD idi ve uygulama tamponlarındaki veri değeri, sonuç kümesindeki bir sütunun veri tipine dönüştürülemezdi.
07009 Geçersiz tanımlayıcı indeksi Argüman Operasyonu SQL_ADD ve bir sütun, sonuç kümesindeki sütun sayısından daha büyük bir sütun numarasıyla sınırlanmıştır.
21S02 Türetilmiş tablonun derecesi sütun listesiyle eşleşmiyor Operasyon argümanı SQL_UPDATE_BY_BOOKMARK; ve hiçbir sütun güncellenemiyordu çünkü tüm sütunlar ya bağlanmamış ya da sadece okunabilir ya da sınırlı uzunluk/gösterge tamponundaki değer SQL_COLUMN_IGNORE.
22001 String veri sağ kesintisi Sonuç kümesindeki bir sütuna bir karakter veya ikili değer atanması, boş olmayan (karakterler için) veya null olmayan (ikili için) karakterler veya baytların kısaltılmasına yol açar.
22003 Sayısal değer aralık dışında Operasyon argümanı SQL_ADD veya SQL_UPDATE_BY_BOOKMARK idi ve sonuç kümesindeki bir sütuna sayısal değer atanması, sayının (kesirli değil) tüm kısmının kesilmesine neden olurdu.

Operasyon argümanı SQL_FETCH_BY_BOOKMARK ve bir veya daha fazla bağlı sütun için sayısal değeri döndürmek, önemli rakamların kaybına yol açırdı.
22007 Geçersiz tarih saat biçimi Operasyon argümanı SQL_ADD veya SQL_UPDATE_BY_BOOKMARK idi ve sonuç kümesindeki bir sütuna tarih veya zaman damgası değeri atanması, yıl, ay veya gün alanının aralık dışı olmasına neden olurdu.

Operasyon argümanı SQL_FETCH_BY_BOOKMARK ve bir veya daha fazla bağlı sütun için tarih veya zaman damgası değerini döndürmek, yıl, ay veya gün alanının aralık dışı olmasına neden olurdu.
22008 Tarih/zaman alanı taşması Operasyon argümanı SQL_ADD veya SQL_UPDATE_BY_BOOKMARK idi ve sonuç kümesindeki bir sütuna gönderilen verilerde tarih zamanı aritmetiği performansı, sonucun bir tarih alanı (yıl, ay, gün, saat, dakika veya ikinci alan) alanın izin verilen değer aralığının dışında kalmasına veya Gregoryen takviminin doğal tarih kurallarına göre geçersiz olmasına yol açardı.

Operasyon argümanı SQL_FETCH_BY_BOOKMARK ve sonuç kümesinden alınan verilerde tarih saati aritmetiği performansı, sonucun bir tarih ve zaman alanının (yıl, ay, gün, saat, dakika veya ikinci alan) alanın izin verilen değer aralığının dışına çıkmasına veya Gregoryen takvimin doğal tarih kurallarına göre geçersiz olmasına yol açtı.
22015 Aralık alanı taşması Operasyon argümanı SQL_ADD veya SQL_UPDATE_BY_BOOKMARK idi ve bir aralıklı SQL veri tipine tam bir sayısal veya aralıklı C tipinin atanması, önemli rakamların kaybına yol açardı.

Operasyon argümanı SQL_ADD ya da SQL_UPDATE_BY_BOOKMARK idi; bir aralıklı SQL türüne atamalarken, aralıklı SQL tipinde C tipinin değeri temsil edilmezdi.

Operasyon argümanı SQL_FETCH_BY_BOOKMARK ve tam bir sayısal veya aralıklı SQL tipinden C aralığına atamak, öndeki alanda önemli rakamların kaybına yol açardı.

Operasyon argümanı SQL_FETCH_BY_BOOKMARK; bir aralık C tipine atadığında, SQL tipinin değeri aralık C tipinde temsil edilmezdi.
22018 Atama belirtimi için geçersiz karakter değeri Operasyon argümanı SQL_FETCH_BY_BOOKMARK; C tipi tam veya yaklaşık bir sayısal, tarih saati veya aralık veri tipiydi; sütunun SQL tipi bir karakter veri tipiydi; ve sütundaki değer, bağlı C tipinin geçerli bir literali değildi.

Operasyon argümanı SQL_ADD ya da SQL_UPDATE_BY_BOOKMARK idi; SQL türü tam veya yaklaşık bir sayısal, tarih saati veya aralık veri tipiydi; C tipi SQL_C_CHAR; ve sütundaki değer, bağlı SQL türünün geçerli bir literali değildi.
23000 Bütünlük kısıtlaması ihlali Operasyon argümanı SQL_ADD, SQL_DELETE_BY_BOOKMARK veya SQL_UPDATE_BY_BOOKMARK idi ve bir bütünlük kısıtlaması ihlal edildi.

Operation argümanı SQL_ADD ve bağlanmamış bir sütun NULL NOT olarak tanımlanır ve varsayılan yoktur.

Operasyon argümanı SQL_ADD, sınırlı StrLen_or_IndPtr tamponunda belirtilen uzunluk SQL_COLUMN_IGNORE ve sütunun varsayılan değeri yoktu.
24000 Geçersiz imleç durumu StatementHandle yürütülmüş durumdaydı, ancak StatementHandle ile ilişkilendirilmiş bir sonuç kümesi yoktu.
40001 Serileştirme hatası Başka bir işlemle kaynak kilitlenmesi nedeniyle işlem geri alındı.
40003 Deyim tamamlama bilinmiyor İlişkili bağlantı bu işlevin yürütülmesi sırasında başarısız oldu ve işlemin durumu belirlenemiyor.
42000 Söz dizimi hatası veya erişim ihlali Sürücü, Operation argümanında istenen işlemi gerçekleştirmek için gereken sırayı kilitleyemedi.
44000 CHECK OPTION ihlali ILE Operasyon argümanı SQL_ADD veya SQL_UPDATE_BY_BOOKMARK idi ve ekleme veya güncelleme, WITH CHECK OPTION'u belirterek oluşturulan görüntülenen bir tabloda (veya görüntülenen tablodan türetilen bir tabloda) gerçekleştirilirdi; böylece ekleme veya güncellemeden etkilenen bir veya daha fazla satır artık görüntülenen tabloda bulunmazdı.
HY000 Genel hata Belirli bir SQLSTATE olmayan ve uygulamaya özgü SQLSTATE tanımlanmayan bir hata oluştu. *MessageText arabelleğinde 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ı.
HY008 İşlem iptal edildi StatementHandle için zaman uyumsuz işleme etkinleştirildi. İşlev çağrıldı ve yürütme tamamlanmadan önce StatementHandle üzerinde SQLCancel veya SQLCancelHandle çağrıldı. Ardından işlev StatementHandle üzerinde yeniden çağrıldı.

İşlev çağrıldı ve yürütme tamamlanmadan önce, çok iş parçacıklı bir uygulamadaki farklı bir iş parçacığından StatementHandle üzerinde SQLCancel veya SQLCancelHandle çağrıldı.
HY010 İşlev dizisi hatası (DM) StatementHandle ile ilişkili bağlantı tanıtıcısı için zaman uyumsuz olarak yürütülen bir işlev çağrıldı. Bu asenkron fonksiyon SQLBulkOperations fonksiyonu çağrıldığında hâlâ çalışıyordu.

(DM) SQLExecute, SQLExecDirect veya SQLMoreResults, StatementHandle için çağrıldı ve SQL_PARAM_DATA_AVAILABLE döndürdü. Bu işlev, tüm akış parametreleri için veri alınmadan önce çağrıldı.

(DM) Belirtilen StatementHandle yürütülmüş durumda değildi. Fonksiyon, önce SQLExecDirect, SQLExecute veya bir katalog fonksiyonu çağrılmadan çağrılmıştır.

(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) StatementHandle için SQLExecute, SQLExecDirect veya SQLSetPos çağrıldı ve SQL_NEED_DATA geri döndü. 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) Şoför ODBC 2'ydi. x sürücüsü ve SQLBulkOperations, SQLFetchScroll veya SQLFetch çağrılmadan önce bir StatementHandle için çağrıldı.

(DM) SQLBulkOperations, StatementHandle üzerinde SQLExtendedFetch çağrıldıktan sonra çağrılmıştır.
HY011 Öznitelik şu anda ayarlanamaz (DM) Şoför ODBC 2'ydi. x sürücüsü ve SQL_ATTR_ROW_STATUS_PTR statement özniteliği SQLFetch veya SQLFetchScroll ile SQLBulkOperations çağrıları arasında ayarlandı.
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 Operasyon argümanı SQL_ADD ya da SQL_UPDATE_BY_BOOKMARK idi; bir veri değeri null işaretçi değildi; C veri tipi SQL_C_BINARY veya SQL_C_CHAR idi; ve sütun uzunluğu değeri 0'dan küçüktü, ancak SQL_DATA_AT_EXEC, SQL_COLUMN_IGNORE, SQL_NTS veya SQL_NULL_DATA'ye, ya da SQL_LEN_DATA_AT_EXEC_OFFSET'den az veya eşit değildi.

Uzunluk/gösterge tamponundaki değer SQL_DATA_AT_EXEC; SQL türü ya SQL_LONGVARCHAR, SQL_LONGVARBINARY ya da uzun veri kaynağına özgü bir veri tipiydi; ve SQLGetInfo'daki SQL_NEED_LONG_DATA_LEN bilgi tipi "Y" idi.

Operation argümanı SQL_ADD idi, SQL_ATTR_USE_BOOKMARK ifadesi özniteliği SQL_UB_VARIABLE olarak ayarlandı ve sütun 0, bu sonuç kümesi için yer iminin maksimum uzunluğuna eşit olmayan bir tampon ile bağlıydı. (Bu uzunluk IRD'nin SQL_DESC_OCTET_LENGTH alanında mevcuttur ve SQLDescribeCol, SQLColAttribute veya SQLGetDescField çağrılarak elde edilebilir.)
HY092 Geçersiz öznitelik tanımlayıcısı (DM) Operasyon argümanı için belirtilen değer geçersizdi.

Operasyon argümanı SQL_ADD, SQL_UPDATE_BY_BOOKMARK veya SQL_DELETE_BY_BOOKMARK idi ve SQL_ATTR_CONCURRENCY ifadesi özniteliği SQL_CONCUR_READ_ONLY olarak ayarlandı.

Operasyon argümanı SQL_DELETE_BY_BOOKMARK, SQL_FETCH_BY_BOOKMARK veya SQL_UPDATE_BY_BOOKMARK idi ve yer imimi sütunu bağlı değildi veya SQL_ATTR_USE_BOOKMARKS ifadesi atrikiti SQL_UB_OFF olarak ayarlanmıştı.
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 alınma durumu hakkında daha fazla bilgi için bkz. SQLEndTran İşlevi.
HYC00 İsteğe bağlı özellik uygulanmadı Sürücü veya veri kaynağı, Operation argümanında istenen işlemi desteklemez.
HYT00 Zaman aşımı süresi doldu Veri kaynağı sonuç kümesini döndürmeden önce sorgu zaman aşımı süresi doldu. Zaman aşımına sahip dönem, SQLSetStmtAttr ile SQL_ATTR_QUERY_TIMEOUT Öznitelik argümanı ile belirlenir.
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 SQLSetConnectAttr, SQL_ATTR_CONNECTION_TIMEOUT aracılığıyla ayarlanır.
IM001 Sürücü bu işlevi desteklemiyor (DM) StatementHandle ile ilişkili sürücü işlevi desteklemiyor.
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 etkinleştirildiyse, son işlemeyi yapmak ve işlemi tamamlamak için tanıtıcıda SQLCompleteAsync çağrılmalıdır.

Comments

Caution

SQLBulkOperations'ın hangi ifadelerin çağrılabileceği ve ODBC 2 ile uyumluluk için neler yapması gerektiği hakkında bilgi için. x uygulamaları, Ek G: Geri Uyumluluk İçin Sürücü Kılavuzları içindeki Blok İmleçleri, Kaydırılabilir İmlekatler ve Geri Uyumluluk bölümüne bakınız.

Bir uygulama, mevcut sorguya karşılık gelen temel tablo veya görünüm üzerinde aşağıdaki işlemleri gerçekleştirmek için SQLBulkOperations kullanır:

  • Yeni satırlar ekle.

  • Her satırın bir yer ayımı ile tanımlandığı bir satır setini güncelleyin.

  • Her satırın bir yer imiyle tanımlandığı bir satır setini silin.

  • Her satırın bir yer imiyle tanımlandığı bir satır seti getirin.

SQLBulkOperations çağrısından sonra blok imleci konumu tanımlanmamıştır. Uygulama, imlecin konumunu ayarlamak için SQLFetchScroll'u çağırmalıdır. Bir uygulama, yalnızca SQL_FETCH_FIRST, SQL_FETCH_LAST, SQL_FETCH_ABSOLUTE veya SQL_FETCH_BOOKMARK FetchOrientation argümanı ile SQLFetchScroll'u çağırmalıdır. Uygulama SQLFetch veya SQLFetchScroll'u çağırıyorsa ve FetchOrientation argümanı SQL_FETCH_PRIOR, SQL_FETCH_NEXT veya SQL_FETCH_RELATIVE olarak çağrılıyorsa, imleç konumu tanımlanmamıştır.

Bir sütun, SQLBulkOperations çağrısıyla yapılan toplu işlemlerde, SQLBindCol çağrısında belirtilen sütun uzunluğu/gösterge tamponu SQL_COLUMN_IGNORE olarak ayarlanarak göz ardı edilebilir.

Uygulamanın SQLBulkOperations çağrılırken SQL_ATTR_ROW_OPERATION_PTR ifadesi özelliğini ayarlaması gerekmez çünkü bu fonksiyonla toplu işlemler yapılırken satırlar göz ardı edilemez.

SQL_ATTR_ROWS_FETCHED_PTR ifadesi özniteliğinin işaret ettiği tampon, SQLBulkOperations çağrısından etkilenen satır sayısını içerir.

Operation argümanı SQL_ADD veya SQL_UPDATE_BY_BOOKMARK olduğunda ve imleciyle ilişkili sorgu spesifikasyonunun seçim listesi aynı sütuna birden fazla referans içerdiğinde, hata oluşturulup oluşturulmadığı ya da sürücünün çoğaltılan referansları görmezden gelip istenen işlemleri gerçekleştirdiği sürücü tarafından tanımlanır.

SQLBulkOperations kullanımı hakkında daha fazla bilgi için Verileri SQLBulkOperations ile güncelleme bölümünü inceleyebilirsiniz.

Toplu Eklemeleri Gerçekleştirmek

SQLBulkOperations ile veri eklemek için bir uygulama aşağıdaki adımlar dizisini gerçekleştirir:

  1. Sonuç kümesini döndüren bir sorgu çalıştırır.

  2. SQL_ATTR_ROW_ARRAY_SIZE ifadesi niteliğini, eklemek istediği satır sayısına ayarlar.

  3. Eklemek istediği veriyi bağlamak için SQLBindCol'u çağırır. Veri, SQL_ATTR_ROW_ARRAY_SIZE değerine eşit büyüklükte bir diziye bağlıdır.

    Note

    SQL_ATTR_ROW_STATUS_PTR ifadesi özniteliğinin işaret ettiği dizinin boyutu ya SQL_ATTR_ROW_ARRAY_SIZE'ye eşit olmalı ya da SQL_ATTR_ROW_STATUS_PTR bir null işaretçi olmalıdır.

  4. Eklemeyi gerçekleştirmek için SQLBulkOperations(StatementHandle, SQL_ADD) çağırır.

  5. Uygulama SQL_ATTR_ROW_STATUS_PTR ifadesi özniteliğini belirlemişse, bu diziyi inceleyerek işlemin sonucunu görebilir.

Bir uygulama, SQLBulkOperations'ı çağırmadan önce sütun 0'ı SQL_ADD Operation argümanı ile bağlarsa, sürücü bağlanan sütun 0 buffer'larını yeni eklenen satırın yer imi değerleriyle günceller. Bunun gerçekleşmesi için, uygulamanın ifadeyi çalıştırmadan önce SQL_ATTR_USE_BOOKMARKS ifadesi niteliğini SQL_UB_VARIABLE olarak ayarlaması gerekir. (Bu ODBC 2 ile çalışmaz. x sürücü.)

Uzun veri, SQLBulkOperations tarafından, SQLParamData ve SQLPutData çağrıları kullanılarak parçalar halinde eklenebilir. Daha fazla bilgi için, bu fonksiyon referansının ilerleyen kısmında "Toplu Eklemeler ve Güncellemeler için Uzun Veri Sağlama" bölümüne bakınız.

Uygulamanın SQLBulkOperations çağırmadan önce SQLFetch veya SQLFetchScroll çağırması gerekmez (hariç, ODBC 2 ile karşı çıktığında).x sürücü; bkz. Geriye Doğru Uyumluluk ve Standartlara Uyum).

Davranış, SQL_ADD Operasyon argümanı olan SQLBulkOperations, tekrarlanan sütunlar içeren bir imleçte çağrıldığında sürücü tarafından tanımlanır. Sürücü, sürücü tanımlı bir SQLSTATE döndürebilir, veri sonucu kümesinde görünen ilk sütuna ekleyebilir veya başka sürücü tanımlı davranışlar gerçekleştirebilir.

Yer imlerini kullanarak toplu güncellemeler yapmak

SQLBulkOperations ile yer imi kullanarak toplu güncellemeler yapmak için bir uygulama sırayla aşağıdaki adımları gerçekleştirir:

  1. SQL_ATTR_USE_BOOKMARKS ifadesi niteliğini SQL_UB_VARIABLE olarak ayarlar.

  2. Sonuç kümesini döndüren bir sorgu çalıştırır.

  3. SQL_ATTR_ROW_ARRAY_SIZE ifadesi niteliğini, güncellemek istediği satır sayısına ayarlar.

  4. Güncellemek istediği verileri bağlamak için SQLBindCol'u çağırıyor. Veri, SQL_ATTR_ROW_ARRAY_SIZE değerine eşit büyüklükte bir diziye bağlıdır. Ayrıca SQLBindCol'u çağırarak 0 sütununu (yer imimi sütunu) bağlar.

  5. Güncellemek istediği satırlar için yer imlerini 0. sütununa bağlı diziye kopyalar.

  6. Bağlı tamponlardaki verileri güncelliyor.

    Note

    SQL_ATTR_ROW_STATUS_PTR ifadesi özniteliğinin işaret ettiği dizinin boyutu SQL_ATTR_ROW_ARRAY_SIZE'ye eşit olmalı veya SQL_ATTR_ROW_STATUS_PTR bir null işaretçi olmalıdır.

  7. SQLBulkOperations(StatementHandle, SQL_UPDATE_BY_BOOKMARK) çağırır.

    Note

    Uygulama SQL_ATTR_ROW_STATUS_PTR ifadesi özniteliğini belirlemişse, bu diziyi inceleyerek işlemin sonucunu görebilir.

  8. Isteğe bağlı olarak, güncellemenin gerçekleşip gerçekleşmediğini doğrulamak için SQLBulkOperations(StatementHandle, SQL_FETCH_BY_BOOKMARK) çağrılır ve bağlı uygulama tamponlara veri getirir.

  9. Veri güncellendiyse, sürücü uygun satırlar için satır durum dizisinde değeri SQL_ROW_UPDATED olarak değiştirir.

SQLBulkOperations tarafından yapılan toplu güncellemeler, SQLParamData ve SQLPutData çağrıları kullanılarak uzun veri içerebilir. Daha fazla bilgi için, bu fonksiyon referansının ilerleyen kısmında "Toplu Eklemeler ve Güncellemeler için Uzun Veri Sağlama" bölümüne bakınız.

Eğer yer imi işaretleri imlecimler arasında devam ederse, uygulama yer imimleriyle güncellemeden önce SQLFetch veya SQLFetchScroll'u çağırmasına gerek kalmaz. Önceki bir imlecten kaydettiği yer imimlerini kullanabilir. Eğer yer imleçleri arasında yer imleçleri arasında kalmıyorsa, uygulama yer imimlerini almak için SQLFetch veya SQLFetchScroll çağırmak zorundadır.

Davranış, SQL_UPDATE_BY_BOOKMARK Operation argümanına sahip SQLBulkOperations bir imleç üzerinde çağrıldığında sürücü tarafından tanımlanır. Sürücü, sürücü tanımlı bir SQLSTATE döndürebilir, sonuç kümesinde görünen ilk sütunu güncelleyebilir veya başka sürücü tanımlı davranışlar gerçekleştirebilir.

Yer imlerini kullanarak toplu getirme işlemleri yapmak

SQLBulkOperations ile yer imleri kullanarak toplu getirme yapmak için bir uygulama aşağıdaki adımları sırayla gerçekleştirir:

  1. SQL_ATTR_USE_BOOKMARKS ifadesi niteliğini SQL_UB_VARIABLE olarak ayarlar.

  2. Sonuç kümesini döndüren bir sorgu çalıştırır.

  3. SQL_ATTR_ROW_ARRAY_SIZE ifadesi özniteliğini, almak istediği satır sayısına ayarlar.

  4. Almak istediği veriyi bağlamak için SQLBindCol'u çağırıyor. Veri, SQL_ATTR_ROW_ARRAY_SIZE değerine eşit büyüklükte bir diziye bağlıdır. Ayrıca SQLBindCol'u çağırarak 0 sütununu (yer imimi sütunu) bağlar.

  5. İlgilendiği satır için yer imlerini 0 sütununa bağlı diziye kopyalar. (Bu, uygulamanın zaten yer imlerini ayrı ayrı aldığını varsayır.)

    Note

    SQL_ATTR_ROW_STATUS_PTR ifadesi özniteliğinin işaret ettiği dizinin boyutu SQL_ATTR_ROW_ARRAY_SIZE'ye eşit olmalı veya SQL_ATTR_ROW_STATUS_PTR bir null işaretçi olmalıdır.

  6. SQLBulkOperations(StatementHandle, SQL_FETCH_BY_BOOKMARK) çağırır.

  7. Uygulama SQL_ATTR_ROW_STATUS_PTR ifadesi özniteliğini belirlemişse, bu diziyi inceleyerek işlemin sonucunu görebilir.

Eğer imleçler arasında yer imi işaretleri devam ederse, uygulamanın yer imleçleriyle getirmeden önce SQLFetch veya SQLFetchScroll çağırmasına gerek kalmaz. Önceki bir imlecten kaydettiği yer imimlerini kullanabilir. Eğer yer imleçleri arasında yer imlecimleri arasında kalmıyorsa, uygulama yer imimlerini almak için SQLFetch veya SQLFetchScroll'u bir kez çağırmak zorundadır.

Yer imlerini kullanarak toplu silme yapmak

SQLBulkOperations ile yer imleri kullanarak toplu silme yapmak için bir uygulama aşağıdaki adımları sırayla gerçekleştirir:

  1. SQL_ATTR_USE_BOOKMARKS ifadesi niteliğini SQL_UB_VARIABLE olarak ayarlar.

  2. Sonuç kümesini döndüren bir sorgu çalıştırır.

  3. SQL_ATTR_ROW_ARRAY_SIZE ifadesi niteliğini, silmek istediği satır sayısına ayarlar.

  4. SQLBindCol'u çağırıyor ve 0 sütununu (yer imimi sütunu) bağlamak için çağırıyor.

  5. Silmek istediği satırlar için yer imlerini 0 sütununa bağlı diziye kopyalar.

    Note

    SQL_ATTR_ROW_STATUS_PTR ifadesi özniteliğinin işaret ettiği dizinin boyutu SQL_ATTR_ROW_ARRAY_SIZE'ye eşit olmalı veya SQL_ATTR_ROW_STATUS_PTR bir null işaretçi olmalıdır.

  6. SQLBulkOperations(StatementHandle, SQL_DELETE_BY_BOOKMARK) çağırır.

  7. Uygulama SQL_ATTR_ROW_STATUS_PTR ifadesi özniteliğini belirlemişse, bu diziyi inceleyerek işlemin sonucunu görebilir.

Eğer yer imleçleri arasında yer imleci kalırsa, uygulama yer imleleriyle silmeden önce SQLFetch veya SQLFetchScroll çağırmak zorunda kalmaz. Önceki bir imlecten kaydettiği yer imimlerini kullanabilir. Eğer yer imleçleri arasında yer imlecimleri arasında kalmıyorsa, uygulama yer imimlerini almak için SQLFetch veya SQLFetchScroll'u bir kez çağırmak zorundadır.

Toplu eklemeler ve güncellemeler için uzun veri sağlamak

Toplu eklemeler ve SQLBulkOperations çağrılarıyla yapılan güncellemeler için uzun veriler sağlanabilir. Uzun veri eklemek veya güncellemek için, bir uygulama bu konunun önceki bölümlerinde "Toplu Ekleme Yapma" ve "Yer Imleri Kullanarak Toplu Güncellemeler Yapma" bölümlerinde açıklanan adımların yanı sıra aşağıdaki adımları gerçekleştirir.

  1. Veriyi SQLBindCool kullanarak bağladığında, uygulama gönderme sırasında veri-çalıştırma sütunları için *TargetValuePtr tamponuna sütun numarası gibi uygulama tanımlı bir değer yerleştirir. Bu değer daha sonra sütunu tanımlamak için kullanılabilir.

    Uygulama, SQL_LEN_DATA_AT_EXEC(uzunluk) makrosunun sonucunu *StrLen_or_IndPtr tamponuna yerleştirir. Sütunun SQL veri tipi SQL_LONGVARBINARY, SQL_LONGVARCHAR veya uzun veri kaynağına özgü bir veri tipi ise ve sürücü SQLGetInfo'daki SQL_NEED_LONG_DATA_LEN bilgi tipi için "Y" döndürüyorsa, uzunluk parametre için gönderilecek bayt veri sayısıdır; aksi takdirde, negatif olmayan bir değer olmalı ve göz ardı edilir.

  2. SQLBulkOperations çağrıldığında, eğer veri sırasında çalıştırma sütunları varsa, fonksiyon SQL_NEED_DATA döndürer ve aşağıdaki 3. adıma geçer. (Eğer yürütme sırasında veri sütunları yoksa, süreç tamamlanmıştır.)

  3. Uygulama, işlenen ilk veri göndermesinde işlenen sütun için *TargetValuePtr buffer adresini almak üzere SQLParamData çağırır. SQLParamData SQL_NEED_DATA döndürür. Uygulama, * TargetValuePtr tamponundan uygulama tanımlı değeri alır.

    Note

    Data-an-execut parametreleri data-an-execution sütunlarına benzese de, SQLParamData tarafından verilen değer her biri için farklıdır.

    Data-at-execut sütunları, bir satır güncellendiğinde veya SQLBulkOperations ile eklendiğinde SQLPutData ile verilerin gönderileceği bir satır kümesindeki sütunlardır. Bunlar SQLBindCol ile bağlıdır. SQLParamData tarafından döndürülen değer, *TargetValuePtr tamponundaki satırın adresidir ve bu adres işlenir.

  4. Uygulama, sütun için veri göndermek üzere SQLPutData'yı bir veya daha fazla kez çağırır. SQLPutData'dabelirtilen *TargetValuePtr tamponunda tüm veri değeri geri döndürülemezse, birden fazla çağrı gereklidir; Aynı sütun için SQLPutData'ya birden fazla çağrı yapılması yalnızca karakter, ikili veya veri kaynağına özgü bir veri tipine sahip bir sütuna karakter C verisi gönderildiğinde veya ikili C verisi karakter, ikili veya veri kaynağına özgü veri tipine gönderildiğinde izin verilir.

  5. Uygulama, tüm verilerin sütun için gönderildiğini belirtmek için tekrar SQLParamData çağırır.

    • Daha fazla veri çalıştırma sütunu varsa, SQLParamData SQL_NEED_DATA ve bir sonraki işleme sırasında veri sütunu için TargetValuePtr tampon adresini döndürür. Başvuru 4. ve 5. adımları tekrarlar.

    • Eğer başka veri gönderme sütunu kalmazsa, süreç tamamlanmış sayılır. Eğer ifade başarılı şekilde çalıştırıldıysa, SQLParamData SQL_SUCCESS veya SQL_SUCCESS_WITH_INFO döndürür; Eğer uygulama başarısız olursa, SQL_ERROR döner. Bu noktada, SQLBulkDataSQLBulkOperations tarafından iade edilebilecek herhangi bir SQLSTATE'i döndürebilir.

Eğer işlem iptal edilirse veya SQLBulkOperations SQL_NEED_DATA döndürdükten sonra ve tüm veri gönderildikten sonra SQL DataData veya SQLPutData'da hata oluşursa, uygulama ifade veya ifadeyle ilişkili bağlantı için yalnızca SQLCancel, SQLGetDiagField, SQLGetDiagRec, SQLGetFunctions, SQLParamData veya SQLPutData çağrısı yapabilir. Eğer ifade veya ifadeye bağlı bağlantı için başka bir fonksiyon çağırırsa, fonksiyon SQL_ERROR ve SQLSTATE HY010 (Fonksiyon dizisi hatası) döndürür.

Eğer uygulama sürücünün hâlâ veri çalıştırma sütunları için veriye ihtiyacı varken SQLCancel çağrısı yaparsa, sürücü işlemi iptal eder. Uygulama daha sonra SQLBulkOperations'ı tekrar çağırabilir; İptal etmek imleç durumunu veya mevcut imleç pozisyonunu etkilemez.

Satır Durumu Dizisi

Satır durum dizisi, SQLBulkOperations çağrısından sonra sıralar kümesindeki her veri satırı için durum değerlerini içerir. Sürücü, SQLFetch, SQLFetchScroll, SQLSetPos veya SQLBulkOperations çağrısından sonra bu dizideki durum değerlerini ayarlar. Bu dizi, SQLBulkOperations öncesinde SQLFetch veya SQLFetchScroll çağrılmamışsa başlangıçta SQLBulkOperations çağrısıyla doldurulur. Bu dizi, SQL_ATTR_ROW_STATUS_PTR ifadesi özniteliğiyle işaret edilir. Satır durum dizilerindeki eleman sayısı, SQL_ATTR_ROW_ARRAY_SIZE ifadesi özniteliğiyle tanımlandığı şekilde, satır kümesindeki satır sayısına eşit olmalıdır. Bu satır durum dizisi hakkında bilgi için SQLFetch'e bakınız.

Kod Örneği

Aşağıdaki örnek, Müşteriler tablosundan aynı anda 10 satır veri alır. Sonra kullanıcıya bir eylem sorar. Ağ trafiğini azaltmak için örnek tampon sınırlı dizilerde yerel olarak güncellenir, silinir ve ekler, ancak satır kümesi verilerinin ötesindeki offsetlerde bulunur. Kullanıcı veri kaynağına güncellemeler, silme ve eklemeler göndermeyi seçtiğinde, kod bağlama ofsetini uygun şekilde ayarlar ve SQLBulkOperations çağırır. Basitlik için, kullanıcı 10'dan fazla güncelleme, silme veya eklemeyi tamponlayamaz.

// SQLBulkOperations_Function.cpp  
// compile with: ODBC32.lib  
#include <windows.h>  
#include <sqlext.h>  
#include "stdio.h"  
  
#define UPDATE_ROW 100  
#define DELETE_ROW 101  
#define ADD_ROW 102  
#define SEND_TO_DATA_SOURCE 103  
#define UPDATE_OFFSET 10  
#define INSERT_OFFSET 20  
#define DELETE_OFFSET 30  
  
// Define structure for customer data (assume 10 byte maximum bookmark size).  
typedef struct tagCustStruct {  
   SQLCHAR Bookmark[10];  
   SQLINTEGER BookmarkLen;  
   SQLUINTEGER CustomerID;  
   SQLINTEGER CustIDInd;  
   SQLCHAR CompanyName[51];  
   SQLINTEGER NameLenOrInd;  
   SQLCHAR Address[51];  
   SQLINTEGER AddressLenOrInd;  
   SQLCHAR Phone[11];  
   SQLINTEGER PhoneLenOrInd;  
} CustStruct;  
  
// Allocate 40 of these structures. Elements 0-9 are for the current rowset,  
// elements 10-19 are for the buffered updates, elements 20-29 are for  
// the buffered inserts, and elements 30-39 are for the buffered deletes.  
CustStruct CustArray[40];  
SQLUSMALLINT RowStatusArray[10], Action, RowNum, NumUpdates = 0, NumInserts = 0,  
NumDeletes = 0;  
SQLLEN BindOffset = 0;  
SQLRETURN retcode;  
SQLHENV henv = NULL;  
SQLHDBC hdbc = NULL;  
SQLHSTMT hstmt = NULL;  
  
int main() {  
   retcode = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &henv);  
   retcode = SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, (SQLPOINTER*)SQL_OV_ODBC3, 0);   
  
   retcode = SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc);   
   retcode = SQLSetConnectAttr(hdbc, SQL_LOGIN_TIMEOUT, (SQLPOINTER)5, 0);  
  
   retcode = SQLConnect(hdbc, (SQLCHAR*) "Northwind", SQL_NTS, (SQLCHAR*) NULL, 0, NULL, 0);  
   retcode = SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt);  
  
   // Set the following statement attributes:  
   // SQL_ATTR_CURSOR_TYPE:           Keyset-driven  
   // SQL_ATTR_ROW_BIND_TYPE:         Row-wise  
   // SQL_ATTR_ROW_ARRAY_SIZE:        10  
   // SQL_ATTR_USE_BOOKMARKS:         Use variable-length bookmarks  
   // SQL_ATTR_ROW_STATUS_PTR:        Points to RowStatusArray  
   // SQL_ATTR_ROW_BIND_OFFSET_PTR:   Points to BindOffset  
   retcode = SQLSetStmtAttr(hstmt, SQL_ATTR_CURSOR_TYPE, (SQLPOINTER)SQL_CURSOR_KEYSET_DRIVEN, 0);  
   retcode = SQLSetStmtAttr(hstmt, SQL_ATTR_ROW_BIND_TYPE, (SQLPOINTER)sizeof(CustStruct), 0);  
   retcode = SQLSetStmtAttr(hstmt, SQL_ATTR_ROW_ARRAY_SIZE, (SQLPOINTER)10, 0);  
   retcode = SQLSetStmtAttr(hstmt, SQL_ATTR_USE_BOOKMARKS, (SQLPOINTER)SQL_UB_VARIABLE, 0);  
   retcode = SQLSetStmtAttr(hstmt, SQL_ATTR_ROW_STATUS_PTR, RowStatusArray, 0);  
   retcode = SQLSetStmtAttr(hstmt, SQL_ATTR_ROW_BIND_OFFSET_PTR, &BindOffset, 0);  
  
   // Bind arrays to the bookmark, CustomerID, CompanyName, Address, and Phone columns.  
   retcode = SQLBindCol(hstmt, 0, SQL_C_VARBOOKMARK, CustArray[0].Bookmark, sizeof(CustArray[0].Bookmark), &CustArray[0].BookmarkLen);  
   retcode = SQLBindCol(hstmt, 1, SQL_C_ULONG, &CustArray[0].CustomerID, 0, &CustArray[0].CustIDInd);  
   retcode = SQLBindCol(hstmt, 2, SQL_C_CHAR, CustArray[0].CompanyName, sizeof(CustArray[0].CompanyName), &CustArray[0].NameLenOrInd);  
   retcode = SQLBindCol(hstmt, 3, SQL_C_CHAR, CustArray[0].Address, sizeof(CustArray[0].Address), &CustArray[0].AddressLenOrInd);  
   retcode = SQLBindCol(hstmt, 4, SQL_C_CHAR, CustArray[0].Phone, sizeof(CustArray[0].Phone), &CustArray[0].PhoneLenOrInd);  
  
   // Execute a statement to retrieve rows from the Customers table.  
   retcode = SQLExecDirect(hstmt, (SQLCHAR*)"SELECT CustomerID, CompanyName, Address, Phone FROM Customers", SQL_NTS);  
  
   // Fetch and display the first 10 rows.  
   retcode = SQLFetchScroll(hstmt, SQL_FETCH_NEXT, 0);  
   // DisplayCustData(CustArray, 10);  
  
   // Call GetAction to get an action and a row number from the user.  
   // while (GetAction(&Action, &RowNum)) {  
   Action = SQL_FETCH_NEXT;  
   RowNum = 2;  
   switch (Action) {  
      case SQL_FETCH_NEXT:  
      case SQL_FETCH_PRIOR:  
      case SQL_FETCH_FIRST:  
      case SQL_FETCH_LAST:  
      case SQL_FETCH_ABSOLUTE:  
      case SQL_FETCH_RELATIVE:  
         // Fetch and display the requested data.  
         SQLFetchScroll(hstmt, Action, RowNum);  
         // DisplayCustData(CustArray, 10);  
         break;  
  
      case UPDATE_ROW:  
         // Check if we have reached the maximum number of buffered updates.  
         if (NumUpdates < 10) {  
            // Get the new customer data and place it in the next available element of  
            // the buffered updates section of CustArray, copy the bookmark of the row  
            // being updated to the same element, and increment the update counter.  
            // Checking to see we have not already buffered an update for this  
            // row not shown.  
            // GetNewCustData(CustArray, UPDATE_OFFSET + NumUpdates);  
            memcpy(CustArray[UPDATE_OFFSET + NumUpdates].Bookmark,  
               CustArray[RowNum - 1].Bookmark,  
               CustArray[RowNum - 1].BookmarkLen);  
            CustArray[UPDATE_OFFSET + NumUpdates].BookmarkLen =  
               CustArray[RowNum - 1].BookmarkLen;  
            NumUpdates++;  
         } else {  
            printf("Buffers full. Send buffered changes to the data source.");  
         }  
         break;  
      case DELETE_ROW:  
         // Check if we have reached the maximum number of buffered deletes.  
         if (NumDeletes < 10) {  
            // Copy the bookmark of the row being deleted to the next available element  
            // of the buffered deletes section of CustArray and increment the delete  
            // counter. Checking to see we have not already buffered an update for  
            // this row not shown.  
            memcpy(CustArray[DELETE_OFFSET + NumDeletes].Bookmark,  
               CustArray[RowNum - 1].Bookmark,  
               CustArray[RowNum - 1].BookmarkLen);  
  
            CustArray[DELETE_OFFSET + NumDeletes].BookmarkLen =  
               CustArray[RowNum - 1].BookmarkLen;  
  
            NumDeletes++;  
         } else  
            printf("Buffers full. Send buffered changes to the data source.");  
         break;  
  
      case ADD_ROW:  
         // reached maximum number of buffered inserts?  
         if (NumInserts < 10) {  
            // Get the new customer data and place it in the next available element of  
            // the buffered inserts section of CustArray and increment insert counter.  
            // GetNewCustData(CustArray, INSERT_OFFSET + NumInserts);  
            NumInserts++;  
         } else  
            printf("Buffers full. Send buffered changes to the data source.");  
         break;  
  
      case SEND_TO_DATA_SOURCE:  
         // If there are any buffered updates, inserts, or deletes, set the array size  
         // to that number, set the binding offset to use the data in the buffered  
         // update, insert, or delete part of CustArray, and call SQLBulkOperations to  
         // do the updates, inserts, or deletes. Because we will never have more than  
         // 10 updates, inserts, or deletes, we can use the same row status array.  
         if (NumUpdates) {  
            SQLSetStmtAttr(hstmt, SQL_ATTR_ROW_ARRAY_SIZE, (SQLPOINTER)NumUpdates, 0);  
            BindOffset = UPDATE_OFFSET * sizeof(CustStruct);  
            SQLBulkOperations(hstmt, SQL_UPDATE_BY_BOOKMARK);  
            NumUpdates = 0;  
         }  
  
         if (NumInserts) {  
            SQLSetStmtAttr(hstmt, SQL_ATTR_ROW_ARRAY_SIZE, (SQLPOINTER)NumInserts, 0);  
            BindOffset = INSERT_OFFSET * sizeof(CustStruct);  
            SQLBulkOperations(hstmt, SQL_ADD);  
            NumInserts = 0;  
         }  
  
         if (NumDeletes) {  
            SQLSetStmtAttr(hstmt, SQL_ATTR_ROW_ARRAY_SIZE, (SQLPOINTER)NumDeletes, 0);  
            BindOffset = DELETE_OFFSET * sizeof(CustStruct);  
            SQLBulkOperations(hstmt, SQL_DELETE_BY_BOOKMARK);  
            NumDeletes = 0;  
         }  
  
         // If there were any updates, inserts, or deletes, reset the binding offset  
         // and array size to their original values.  
         if (NumUpdates || NumInserts || NumDeletes) {  
            SQLSetStmtAttr(hstmt, SQL_ATTR_ROW_ARRAY_SIZE, (SQLPOINTER)10, 0);  
            BindOffset = 0;  
         }  
         break;  
   }  
   // }  
  
   // Close the cursor.  
   SQLFreeStmt(hstmt, SQL_CLOSE);  
}  
Hakkında bilgi için Bkz:
Sonuç kümesindeki bir sütuna arabellek bağlama SQLBindCol İşlevi
Deyim işlemeyi iptal etme SQLCancel İşlevi
Veri bloğunu getirme veya sonuç kümesinde kaydırma SQLFetchScroll İşlevi
Bir tanımlayıcının tek bir alanını elde etmek SQLGetDescField Fonksiyonu
Bir tanımlayıcının birden fazla alanını elde etmek SQLGetDescRec Function
Bir tanımlayıcının tek bir alanını ayarlama SQLSetDescField Fonksiyonu
Bir tanımlayıcının birden fazla alanını ayarlamak SQLSetDescRec Function
İmleci konumlandırmak, satır kümesinde veriyi yenilemek veya satır kümesinde veriyi güncellemek veya silmek SQLSetPos Fonksiyonu
Deyim özniteliğini ayarlama SQLSetStmtAttr İşlevi