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.
Uygunluk
Tanıtılan Sürüm: ODBC 1.0 Standartlar Uyumu: ODBC
Summary
SQLSetPos, bir satır kümesinde imleç konumunu belirler ve bir uygulamanın satır kümesindeki verileri yenilemesine veya sonuç kümesindeki verileri güncellemesine veya silmesine olanak tanır.
Syntax
SQLRETURN SQLSetPos(
SQLHSTMT StatementHandle,
SQLSETPOSIROW RowNumber,
SQLUSMALLINT Operation,
SQLUSMALLINT LockType);
Arguments
StatementHandle
[Giriş] Deyim tanıtıcısı.
SatırSayısı
[Giriş] Operation argümanı ile belirtilen işlemin gerçekleştirileceği satırın sıralar kümesindeki konumu.
RowNumber 0 ise, işlem satır kümesindeki her satıra uygulanır.
Ek bilgi için "Yorumlar" bölümüne bakınız.
Operation
[Giriş] Gerçekleştirilecek işlem:
SQL_POSITION SQL_REFRESH SQL_UPDATE SQL_DELETE
Note
Operasyon argümanı için SQL_ADD değeri ODBC 3.x için kullanımdan kaldırılmıştır. ODBC 3.x sürücülerinin geriye dönük uyumluluk için SQL_ADD desteklemesi gerekecek. Bu işlevsellik, SQL_ADD Operasyonuolan SQLBulkOperations çağrısıyla değiştirilmiştir. Bir ODBC 3.x uygulaması ODBC 2.x sürücüsüyle çalıştığında, Sürücü Yöneticisi SQLBulkOperations ile SQL_ADD Operasyonu olan bir çağrıyı SQLSetPos'a SQL_ADD Operasyonu ile eşler.
Daha fazla bilgi için "Yorumlar" bölümüne bakınız.
Kilit Tipi
[Giriş] Operation argümanında belirtilen işlemi yaptıktan sonra satırın nasıl kilitleneceğini belirtir.
SQL_LOCK_NO_CHANGE SQL_LOCK_EXCLUSIVE SQL_LOCK_UNLOCK
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
SQLSetPos SQL_ERROR veya SQL_SUCCESS_WITH_INFO döndürdüğünde, ilişkili bir SQLSTATE değeri, SQL_HANDLE_STMT HandleType ve StatementHandleile SQLGetDiagRec çağrılarak elde edilebilir. Aşağıdaki tablo, SQLSetPos tarafından sıkça 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.) |
| 01001 | İmleç işlemi çakışması |
Operasyon argümanı SQL_DELETE veya SQL_UPDATE idi ve hiçbir satır ya da birden fazla satır silinmez veya güncellenmezdi. (Birden fazla satıra yapılan güncellemeler hakkında daha fazla bilgi için SQLSetStmtAttr'deki SQL_ATTR_SIMULATE_CURSOR Özniteliğinin açıklamasına bakınız.) (Fonksiyon SQL_SUCCESS_WITH_INFO.) Operasyon argümanı SQL_DELETE ya da SQL_UPDATE oldu ve operasyon, iyimser eşzamanlılık nedeniyle başarısız oldu. (İşlev SQL_SUCCESS_WITH_INFO döndürür.) |
| 01004 | String veri sağ kesintisi | Operation argümanı SQL_REFRESH ve SQL_C_CHAR veya SQL_C_BINARY veri tipine sahip bir sütun veya sütunlar için döner, boş karakter olmayan veya NULL olmayan ikili verilerin kısaltılmasına yol açardı. |
| 01S01 | Sırada hata |
RowNumber argümanı 0 idi ve Operation argümanı ile belirtilen işlemi gerçekleştirirken bir veya daha fazla satırda hata meydana geldi. (SQL_SUCCESS_WITH_INFO, çok satırlı bir işlemin bir veya daha fazla satırında hata oluşursa döner, tek satırlı bir operasyonda hata oluşursa SQL_ERROR döner.) (Bu SQLSTATE yalnızca sürücü bir ODBC 2.x sürücüsü ise ve imleç kütüphanesi kullanılmıyorsa SQLExtendedFetch'ten sonra SQLSetPos çağrıldığında geri döner.) |
| 01S07 | Kesirli kesme |
Operasyon argümanı SQL_REFRESH idi, 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 kesildi. Sayısal veri tipleri için, sayının kesirlik kısmı kısaltılmıştır. Zaman bileşeni içeren zaman, zaman damgası ve aralık veri türleri için, zamanın kesirlik kısmı kısaltılmıştır. (İş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, SQLBindCol çağrısında TargetType tarafından belirtilen veri türüne dönüştürülemezdi. |
| 07009 | Geçersiz tanımlayıcı indeksi | Argüman Operasyonu SQL_REFRESH veya SQL_UPDATE idi ve bir sütun, sonuç kümesindeki sütun sayısından daha büyük bir sütun numarasıyla sınırlandırılırdı. |
| 21S02 | Türetilmiş tablonun derecesi sütun listesiyle eşleşmiyor | Argüman Operasyonu SQL_UPDATE ve tüm sütunlar ya bağlanmamış, sadece okunabilir olduğu ya da sınır uzunluğu/gösterge tamponundaki değer SQL_COLUMN_IGNORE olduğu için hiçbir sütun güncellenemiyordu. |
| 22001 | Dize verileri, sağa kesme | Operasyon argümanı SQL_UPDATE ve bir karakter veya ikili değerin bir sütuna atanması, karakterler için boş olmayan veya ikili için boş olmayan karakterler veya baytların kısaltılmasına yol açardı. |
| 22003 | Sayısal değer aralık dışında |
Argüman İşlemi SQL_UPDATE 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. Argüman Operasyonu SQL_REFRESH 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çardı. |
| 22007 | Geçersiz tarih saat biçimi |
Argüman Operasyonu SQL_UPDATE 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. Argüman Operasyonu SQL_REFRESH 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_UPDATE ve sonuç kümesindeki bir sütuna gönderilen verilerde tarih zamanı aritmetiğinin performansı, sonucun alınan değer aralığının dışında olduğu veya Gregoryen takvimin doğal tarih kurallarına göre geçersiz olduğu anlamına gelirdi. Operasyon argümanı SQL_REFRESH ve sonuç kümesinden alınan verilerde tarih zaman aritmetiklerinin performansı, sonucun tarih zaman alanı (yıl, ay, gün, saat, dakika veya ikinci alan) alanın izin verilen değer aralığının dışında olmasına veya Gregoryen takviminin doğal tarih kurallarına göre geçersiz olmasına yol açtı. |
| 22015 | Aralık alanı taşması |
Operasyon argümanı SQL_UPDATE ve bir aralıklı SQL veri tipine tam bir sayısal veya aralıklı C tipinin atanması, önemli rakamların kaybına yol açtı. Operasyon argümanı SQL_UPDATE; bir aralıklı SQL türüne atamalarken, aralıklı SQL tipinde C tipinin değeri temsil edilmezdi. Operasyon argümanı SQL_REFRESH 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_ REFRESH idi; 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_REFRESH; 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_UPDATE; 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 SQL_DELETE ya da SQL_UPDATE argümanı ve bir bütünlük kısıtlaması ihlal edildi. |
| 24000 | Geçersiz imleç durumu |
StatementHandle yürütülmüş durumdaydı, ancak StatementHandle ile ilişkilendirilmiş bir sonuç kümesi yoktu. (DM) StatementHandle'da bir imleç açıktı, ancak SQLFetch veya SQLFetchScroll çağrılmamıştı. StatementHandle üzerinde bir imleç açıktı ve SQLFetch veya SQLFetchScroll çağrılmıştı, ancak imleç sonuç setinin başlangıcından önce veya sonuç setinin bitişinden sonra konumlanmıştı. Argüman Operasyonu SQL_DELETE, SQL_REFRESH veya SQL_UPDATE idi ve imleç sonuç kümesinin başlangıcından önce veya sonuç kümesinin bitişinden sonra konumlandırıldı. |
| 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. Sürücü, LockType argümanında istendiği gibi satırı kilitleyemedi. |
| 44000 | CHECK OPTION ihlali ILE | Operation argümanı SQL_UPDATE ve güncelleme, görüntülenen bir tabloda veya WITH CHECK OPTION'u belirterek oluşturulan bir tabloda veya görüntülenen tablodan türetilen bir tabloda gerçekleştirilir; böylece güncellemeden etkilenen bir veya daha fazla satır artık görüntülenen tabloda bulunmaz. |
| 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. Fonksiyon çağrıldı ve çalıştırma tamamlanmadan önce StatementHandleüzerinde SQLCancel veya SQLCancelHandle çağrıldı ve ardından StatementHandle üzerinde fonksiyon tekrar ç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 SQLSetPos fonksiyonu çağrıldığında hâlâ çalışıyordu. (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) SQLExecute, SQLExecDirect, SQLBulkOperations veya 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) Sürücü bir ODBC 2.x sürücüydü ve SQLFetch çağrıldıktan sonra SQLSetPosStatementHandle için çağrıldı. |
| HY011 | Öznitelik şu anda ayarlanamaz | (DM) Sürücü ODBC 2.x sürücüsüdür; SQL_ATTR_ROW_STATUS_PTR ifadesi özniteliği ayarlandı; sonra SQLFetch, SQLFetchScroll veya SQLExtendedFetch çağrılmadan önce SQLSetPos ç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 |
Operasyon argümanı SQL_UPDATE idi, bir veri değeri bir null işaretçiydi ve sütun uzunluğu değeri 0, SQL_DATA_AT_EXEC, SQL_COLUMN_IGNORE, SQL_NULL_DATA veya SQL_LEN_DATA_AT_EXEC_OFFSET'den az veya eşit değildi. Operasyon argümanı SQL_UPDATE; 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'a eşit değildi 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. |
| HY092 | Geçersiz öznitelik tanımlayıcısı | (DM) Operasyon argümanı için belirtilen değer geçersizdi. (DM) LockType argümanı için belirtilen değer geçersizdi. Operasyon argümanı SQL_UPDATE ya da SQL_DELETE idi ve SQL_ATTR_CONCURRENCY ifade özelliği SQL_ATTR_CONCUR_READ_ONLY. |
| HY107 | Satır değeri aralık dışı | RowNumber argümanı için belirtilen değer, satır kümesindeki satır sayısından büyüktü. |
| HY109 | Geçersiz imleç konumu |
StatementHandle ile ilişkili imleç yalnızca ileri yönlendirme olarak tanımlanmıştı, bu yüzden imleç satır kümesi içinde konumlandırılamazdı.
SQLSetStmtAttr içindeki SQL_ATTR_CURSOR_TYPE özniteliğinin açıklamasına bakınız. Operasyon argümanı SQL_UPDATE, SQL_DELETE veya SQL_REFRESH idi ve RowNumber argümanıyla tanımlanan satır silinmiş veya alınmamıştı. (DM) RowNumber argümanı 0, Operasyon argümanı ise SQL_POSITION. SQLSetPos , SQLBulkOperations çağrıldıktan sonra ve SQLFetchScroll veya SQLFetch çağrılmadan önce çağrılmıştır. |
| 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 veya LockType 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, SQL_ATTR_QUERY_TIMEOUT ÖznitelikleSQLSetStmtAttr üzerinden ayarlanır. |
| 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
SQLSetPos'un çağrılabileceği ve ODBC 2.x uygulamalarıyla uyumluluk için neler yapması gerektiği belirtildiği ifadeyle ilgili bilgi için Block Cursors, Scrollable Cursors ve Backward Compatibility bölümlerine bakınız.
RowNumber Argümanı
RowNumber argümanı, Operation argümanı tarafından belirtilen işlemin gerçekleştirileceği sıra kümesindeki satırın sayısını belirler. RowNumber 0 ise, işlem satır kümesindeki her satıra uygulanır. RowNumber , 0'dan satır sayısına kadar bir değer olmalıdır.
Note
C dilinde, diziler 0 tabanlıdır ve RowNumber argümanı 1 tabanlıdır. Örneğin, satır kümesinin beşinci satırını güncellemek için, bir uygulama dizi indeksi 4'teki satır kümesi tamponlarını değiştirir ancak Sıra Sayısı 5 olarak belirtir.
Tüm işlemler, imcörü RowNumber tarafından belirtilen satıra konumlandırır. Aşağıdaki işlemler için bir imleç pozisyonu gereklidir:
Konumlandır, güncelleme ve silme ifadeleri.
SQLGetData çağrıları.
SQLSetPos'a SQL_DELETE, SQL_REFRESH ve SQL_UPDATE seçenekleriyle çağrılar.
Örneğin, SQLSetPos'a yapılan bir çağrı için RowNumber 2 ise, SQL_DELETE işlemiyle imleç ikinci satırda konumlandırılır ve o satır silinir. İkinci satır için uygulama satırı durum dizisinde (SQL_ATTR_ROW_STATUS_PTR ifadesi özniteliğiyle işaret edilen) giriş SQL_ROW_DELETED olarak değiştirilir.
Bir uygulama, SQLSetPos'u çağırdığında bir imleç pozisyonu belirtebilir. Genellikle, konumlanmış güncelleme veya silme bildirimi veya SQLGetData çağrısından önce imleci konumlandırmak için SQL_POSITION veya SQL_REFRESH işlemiyle SQLSetPos'u çağırır.
Operasyon Argümanı
Operasyon argümanı aşağıdaki işlemleri destekler. Bir veri kaynağı tarafından hangi seçeneklerin desteklendiğini belirlemek için, bir uygulama imlecin türüne bağlı olarak SQL_DYNAMIC_CURSOR_ATTRIBUTES1, SQL_FORWARD_ONLY_CURSOR_ATTRIBUTES1, SQL_KEYSET_CURSOR_ATTRIBUTES1 veya SQL_STATIC_CURSOR_ATTRIBUTES1 bilgi tipiyle SQLGetInfo'yu çağırır.
|
Operation tartışma |
Operation |
|---|---|
| SQL_POSITION | Sürücü, imleci RowNumber ile belirtilen satıra konumlandırır. SQL_ATTR_ROW_OPERATION_PTR ifadesi özniteliğiyle işaretlenen satır durum dizisi içeriği SQL_POSITION İşlemi için göz ardı edilir. |
| SQL_REFRESH | Sürücü, imleci RowNumber tarafından belirtilen satıra konumlandırır ve o satırın satır kümesi buffer'larında veriyi yeniler. Sürücünün satır kümesi tamponlarında veriyi nasıl döndürdüğüne dair daha fazla bilgi için SQLBindCol'daki satır bazında ve sütunlu bağlama açıklamalarına bakınız. SQL_REFRESH Operasyonuolan SQLSetPos, mevcut getirilen satır kümesi içindeki satırların durumunu ve içeriğini günceller. Bu, yer imlerinin yenilenmesini de içerir. Tamponlardaki veriler yenilendiği ancak yeniden etchedilmediği için, satır kümesindeki üyelik sabittir. Bu, SQLFetchScroll'a yapılan bir çağrının FetchOrientation SQL_FETCH_RELATIVE ve 0'a eşit RowNumber ile yapılan yenilemeden farklıdır; bu güncelleme, satır kümesini sonuç kümesinden yeniden ayırır; böylece sürücü ve imleç tarafından desteklenen işlemler eklenen verileri gösterebilir ve silinmiş verileri kaldırabilir. SQLSetPos ile başarılı bir yenileme, SQL_ROW_DELETED satır durumunu değiştirmez. Satır seti içindeki silinmiş satırlar, bir sonraki getirmeye kadar silinmiş olarak işaretlenmeye devam eder. Eğer imleç paketlemeyi destekliyorsa (sonraki SQLFetch veya SQLFetchScroll silinen satırları geri getirmezse) sıralar bir sonraki getirmede kaybolur. SQLSetPos ile yenileme yapıldığında eklenen satırlar görünmez. Bu davranış, FetchType SQL_FETCH_RELATIVE ve 0'a eşit RowNumber olan SQLFetchScroll'dan farklıdır; bu da mevcut satır kümesini yeniler, ancak bu işlemler imleç tarafından destekleniyorsa eklenen kayıtları gösterir veya silinmiş kayıtları paketler. SQLSetPos ile başarılı bir yenileme, SQL_ROW_ADDED satır durumunu SQL_ROW_SUCCESS'ye değiştirir (eğer satır durum dizisi varsa). SQLSetPos ile başarılı bir yenileme, SQL_ROW_UPDATED satır durumunu satırın yeni durumuna (eğer satır durum dizisi varsa) dönüştürür. Bir satırda bir SQLSetPos işleminde hata oluşursa, satır durumu SQL_ROW_ERROR olarak ayarlanır (eğer satır durum dizisi varsa). SQL_CONCUR_ROWVER veya SQL_CONCUR_VALUES SQL_ATTR_CONCURRENCY özniteliğiyle açılan bir imleç için, SQLSetPos ile yenileme veri kaynağının kullandığı iyimser eşdeğerlik değerlerini güncelleyer ve satırın değiştiğini tespit edebilir. Eğer bu olursa, satır kümesi tamponları sunucudan yenilendiğinde imlecin eşzamanlılığını sağlamak için kullanılan satır sürümleri veya değerler güncellenir. Bu, yenilenen her satır için gerçekleşir. SQL_ATTR_ROW_OPERATION_PTR ifadesi özniteliğiyle işaret edilen satır durum dizisinin içeriği SQL_REFRESH İşlemi için göz ardı edilir. |
| SQL_UPDATE | Sürücü, imleci RowNumber tarafından belirtilen satıra yerleştirir ve alttaki veri satırını satır kümesi tamponlarındaki değerlerle günceller (SQLBindCol'dakiTargetValuePtr argümanı). Uzunluk/gösterge tamponlarından (SQLBindCol'dakiStrLen_or_IndPtr argümanı) veri uzunluklarını alır. Herhangi bir sütunun uzunluğu SQL_COLUMN_IGNORE ise, sütun güncellenmez. Satır güncellendikten sonra, sürücü satır durum dizisinin ilgili elemanını SQL_ROW_UPDATED veya SQL_ROW_SUCCESS_WITH_INFO olarak değiştirir (eğer satır durum dizisi varsa). Eğer SQL_UPDATE Operasyon argümanına sahip SQLSetPos, tekrarlanan sütunlar içeren bir imleç üzerinde çağrıldığında, davranışın ne olduğu 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. SQL_ATTR_ROW_OPERATION_PTR ifadesi özniteliğiyle işaretlenen satır işlem dizisi, mevcut satır kümesinde bir satırın toplu güncelleme sırasında göz ardı edilmesi gerektiğini belirtmek için kullanılabilir. Daha fazla bilgi için, bu fonksiyon referansında "Durum ve Operasyon Dizileri"ne bakınız. |
| SQL_DELETE | Sürücü, imleci RowNumber tarafından belirtilen satıra yerleştirir ve alttaki veri satırını siler. Satır durum dizisinin ilgili elemanını SQL_ROW_DELETED olarak değiştirir. Satır silindikten sonra, şu sıralar satır için geçerli değildir: konumlanmış güncelleme ve silme ifadeleri, SQLGetData çağrıları ve Operasyon SQL_POSITION dışında herhangi bir şeye ayarlanmış SQLSetPos çağrıları. Paketlemeyi destekleyen sürücüler için, veri kaynağından yeni veri alındığında satır imleçten silinir. Satırın görünür kalması imleç türüne bağlıdır. Örneğin, silinmiş satırlar statik ve tuş setiyle yönlendirilen imleçlerle görünür ancak dinamik imleçler tarafından görünmezdir. SQL_ATTR_ROW_OPERATION_PTR ifadesi özniteliğiyle işaretlenen satır işlem dizisi, mevcut satır kümesindeki bir satırın toplu silme sırasında göz ardı edilmesi gerektiğini belirtmek için kullanılabilir. Daha fazla bilgi için, bu fonksiyon referansında "Durum ve Operasyon Dizileri"ne bakınız. |
LockType Argümanı
LockType argümanı, uygulamaların eşzamanlılığı kontrol etmesi için bir yol sağlar. Çoğu durumda, eşzamanlılık seviyelerini ve işlemleri destekleyen veri kaynakları yalnızca LockType argümanının SQL_LOCK_NO_CHANGE değerini destekler. LockType argümanı genellikle yalnızca dosya tabanlı destek için kullanılır.
LockType argümanı, SQLSetPos çalıştırıldıktan sonra satırın kilitleme durumunu belirtir. Sürücü, istenen işlemi gerçekleştirmek veya LockType argümanını karşılamak için satırı kilitleyemezse, SQL_ERROR ve SQLSTATE 42000 (Sözdizimi hatası veya erişim ihlali) döner.
LockType argümanı tek bir ifade için belirtilse de, kilit bağlantıdaki tüm ifadelere aynı ayrıcalıkları verir. Özellikle, bir bağlantıdaki bir ifade tarafından alınan bir kilit, aynı bağlantıdaki farklı bir ifade ile açılabilir.
SQLSetPos üzerinden kilitlenen bir satır, uygulama LockType SQL_LOCK_UNLOCK olarak ayarlanmış satır için SQLSetPos'u çağırana veya uygulama ifadesi için SQLFreeHandle veya SQL_CLOSE seçeneğiyle SQLFreeStmt çağırana kadar kilitli kalır. İşlemleri destekleyen bir sürücü için, uygulama SQLEndTran'ı çağrıp, bağlantıdaki bir işlemi onaylamak veya geri almak için SQLSetPos üzerinden kilitlenmiş bir satır açılır (eğer bir işlem bağlandığında veya geri alındığında bir imleç kapanırsa, SQLGetInfo tarafından döndürülen SQL_CURSOR_COMMIT_BEHAVIOR ve SQL_CURSOR_ROLLBACK_BEHAVIOR bilgi tipleriyle belirtildiği gibi).
LockType argümanı aşağıdaki kilit türlerini destekler. Bir veri kaynağı tarafından hangi kilitlerin desteklendiğini belirlemek için, bir uygulama SQLGetInfo'yu SQL_DYNAMIC_CURSOR_ATTRIBUTES1, SQL_FORWARD_ONLY_CURSOR_ATTRIBUTES1, SQL_KEYSET_CURSOR_ATTRIBUTES1 veya SQL_STATIC_CURSOR_ATTRIBUTES1 bilgi tipiyle (imlecin türüne bağlı olarak) çağırır.
| LockType argümanı | Kilit türü |
|---|---|
| SQL_LOCK_NO_CHANGE | Sürücü veya veri kaynağı, satırın SQLSetPos çağrılmadan önceki kilitli veya kilitsiz durumda olmasını sağlar. LockType değeri, açık satır seviyesinde kilitlemeyi desteklemeyen veri kaynaklarının mevcut eşzamanlılık ve işlem izolasyon seviyelerinin gerektirdiği kilitlemeleri kullanmasına olanak tanır. |
| SQL_LOCK_EXCLUSIVE | Sürücü veya veri kaynağı satırı özel olarak kilitler. Farklı bir bağlantıda veya farklı bir uygulamada bulunan bir beyan, satırda herhangi bir kilit elde etmek için kullanılamaz. |
| SQL_LOCK_UNLOCK | Sürücü veya veri kaynağı satırın kilidini açar. |
Bir sürücü SQL_LOCK_EXCLUSIVE destekliyorsa ancak SQL_LOCK_UNLOCK'yi desteklemiyorsa, kilitli bir satır önceki paragrafta tanımlanan fonksiyon çağrılarından biri gerçekleşene kadar kilitli kalır.
Bir sürücü SQL_LOCK_EXCLUSIVE destekliyorsa ancak SQL_LOCK_UNLOCK'yi desteklemiyorsa, kilitli bir satır uygulama açıklama için SQLFreeHandle veya SQL_CLOSE seçeneğiyle SQLFreeStmt çağırana kadar kilitli kalır. Sürücü işlemleri destekler ve işlemi uygularken veya geri alırken imleci kapatırsa, uygulama SQLEndTran'ı çağırır.
SQLSetPos'taki güncelleme ve silme işlemleri için uygulama aşağıdaki gibi LockType argümanını kullanır:
Bir satırın alındıktan sonra değişmemesini garanti etmek için, bir uygulama Operation SQL_REFRESH ve LockType SQL_LOCK_EXCLUSIVE olarak ayarlanmış SQLSetPos'u çağırır.
Uygulama LockType'ı SQL_LOCK_NO_CHANGE olarak ayarlarsa, sürücü güncelleme veya silme işleminin ancak uygulama SQL_ATTR_CONCURRENCY ifadesi için SQL_CONCUR_LOCK belirttiği durumlarda başarılı olacağını garanti eder.
Uygulama SQL_ATTR_CONCURRENCY ifadesi özniteliği için SQL_CONCUR_ROWVER veya SQL_CONCUR_VALUES belirtirse, sürücü satır sürümlerini veya değerlerini karşılaştırır ve satır değiştiyse işlemi reddeder.
Uygulama SQL_ATTR_CONCURRENCY ifadesi özniteliği için SQL_CONCUR_READ_ONLY belirtirse, sürücü herhangi bir güncelleme veya silme işlemini reddeder.
SQL_ATTR_CONCURRENCY ifadesi özniteliği hakkında daha fazla bilgi için SQLSetStmtAttr adresine bakınız.
Durum ve Operasyon Dizileri
SQLSetPos çağrılırken aşağıdaki durum ve işlem dizileri kullanılır:
Satır durum dizisi (IRD'deki SQL_DESC_ARRAY_STATUS_PTR alanı ve SQL_ATTR_ROW_STATUS_ARRAY ifadesi özniteliğiyle işaret edildiği gibi) satır kümesindeki her veri satırı için durum değerlerini içerir. Sürücü, SQLFetch, SQLBetchScroll, SQLBulkOperations veya SQLSetPos çağrısından sonra bu dizide durum değerlerini ayarlar. Bu dizi, SQL_ATTR_ROW_STATUS_PTR ifadesi özniteliğiyle işaret edilir.
Satır işlem dizisi (ARD'deki SQL_DESC_ARRAY_STATUS_PTR alanı ve SQL_ATTR_ROW_OPERATION_ARRAY ifadesi özniteliğiyle işaret edildiği gibi), satır kümesindeki her satır için SQLSetPos çağrısının görmezden gelip edilmediğini veya yapılıp alınmadığını gösteren bir değer içerir. Dizinin her elemanı ya SQL_ROW_PROCEED (varsayılan olarak) ya da SQL_ROW_IGNORE olarak ayarlanır. Bu dizi, SQL_ATTR_ROW_OPERATION_PTR ifadesi özniteliğiyle işaret edilir.
Durum ve işlem 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.
Satır durum dizisi hakkında bilgi için SQLFetch sayfasına bakınız. Sıra işlem dizisi hakkında bilgi için, bu bölümün ilerleyen bölümlerinde "Toplu İşlemde Bir Sırayı Görmezden Gelme" bölümüne bakınız.
SQLSetPos kullanımı
Bir uygulama SQLSetPos'u çağırmadan önce aşağıdaki adımlar dizisini gerçekleştirmelidir:
Uygulama Operation SQL_UPDATE olarak ayarlanmış SQLSetPos çağırırsa, her sütun için SQLBindCol (veya SQLSetDescRec) çağırarak veri tipini belirtir ve sütunun veri ile uzunluğu için buffer bağlayır.
Uygulama SQLSetPos'uOperation SQL_DELETE veya SQL_UPDATE olarak ayarlamış halde çağırırsa, silinecek veya güncellenecek sütunların güncellenebilir olduğundan emin olmak için SQLColAttribute'u çağırın.
Sonuç kümesi oluşturmak için SQLExecDirect, SQLExecute veya bir katalog fonksiyonu çağırın.
Verileri almak için SQLFetch veya SQLFetchScroll arayın.
SQLSetPos kullanımı hakkında daha fazla bilgi için Verileri SQLSetPos ile Güncelleme bölümüne bakınız.
SQLSetPos Kullanılarak Verileri Silme
SQLSetPos ile verileri silmek için, bir uygulama RowNumber silecek satırın numarasına ayarlanmış ve Operation SQL_DELETE olarak ayarlanmış SQLSetPos'u çağırır.
Veri silindikten sonra, sürücü uygun satır için uygulama satırı durum dizisinde değeri SQL_ROW_DELETED (veya SQL_ROW_ERROR) olarak değiştirir.
SQLSetPos kullanarak Veri Güncellemesi
Bir uygulama, bir sütunun değerini bağlı veri tamponunda veya SQLPutData'ya bir veya daha fazla çağrı ile iletebilir. Verileri SQLPutData ile iletilen sütunlar, data-at-executionsütunları olarak bilinir. Bunlar genellikle SQL_LONGVARBINARY ve SQL_LONGVARCHAR sütunları için veri göndermek için kullanılır ve diğer sütunlarla karıştırılabilir.
SQLSetPos ile veri güncellemek için bir uygulama:
Değerleri SQLBindCol ile sınırlanmış veri ve uzunluk/gösterge tamponlarına yerleştirir:
Normal sütunlar için uygulama, yeni sütun değerini *TargetValuePtr tamponuna, bu değerin uzunluğunu ise *StrLen_or_IndPtr tamponuna yerleştirir. Eğer satır güncellenmezse, uygulama SQL_ROW_IGNORE satırın işlem dizisindeki elemanına yerleştirir.
Yürütme sütunları için, uygulama * TargetValuePtr buffer'a 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.
Veri satırını güncellemek için Operation argümanı SQL_UPDATE olarak ayarlanmış SQLSetPos'u çağırır.
Eğer yürütme sırasında veri sütunları yoksa, süreç tamamlanmış sayılır.
Eğer herhangi bir veri komutu sütunu varsa, fonksiyon SQL_NEED_DATA döndürür ve 3. adıma geçer.
SQLParamData'yı çağırarak işlenen ilk veri göndermesinde sütun için *TargetValuePtr tamponu adresini alır. SQLParamData SQL_NEED_DATA döndürür. Uygulama, * TargetValuePtr tamponundan uygulama tanımlı değeri alır.
Note
Data-an-execution parametreleri data-an-execution sütunlarına benzer olsa da, SQLParamData tarafından verilen değer her biri için farklıdır.
Note
Data-at-execution parametreleri, SQL ifadesindeki parametrelerdir; bu parametreler SQL ifadesi SQLExecDirect veya SQLExecute ile yürütüldüğünde SQLPutData ile gönderilir. Bunlar SQLBindParameter ile veya tanımlayıcıları SQLSetDescRec ile ayarlararak bağlanır. SQLParamData tarafından döndürülen değer, ParameterValuePtr argümanında SQLBindParametri'ye iletilen 32 bitlik bir değerdir.
Note
Data-at-execution sütunları, bir satır SQLSetPos ile güncellendiğinde SQLPutData ile veri gönderilecek 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.
Sütun için veri göndermek üzere SQLPutData'yı bir veya daha fazla kez çağırır. Eğer tüm veri değerleri SQLPutData'dabelirtilen *TargetValuePtr tamponunda 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.
Sütun için tüm verinin 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, SQLParamDataSQLSetPos tarafından döndürülebilecek herhangi bir SQLSTATE'i döndürebilir.
Veri güncellendiyse, sürücü uygun satır için uygulama satırı durum dizisinde değeri SQL_ROW_UPDATED olarak değiştirir.
İşlem iptal edilirse veya SQLParamData veya SQLPutData'da hata oluşursa, SQLSetPos SQL_NEED_DATA döndürdükten sonra ve tüm veri çalıştırma sütunları için veri gönderilmeden önce, uygulama yalnızca ifadeyi veya ifadeye bağlı bağlantıyı almak için SQLCancel, SQLGetDiagRec, 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 tekrar SQLSetPos çağırabilir; İptal etmek imleç durumunu veya mevcut imleç pozisyonunu etkilemez.
İmleciyle ilişkili sorgu belirtisinin SELECT-listesi aynı sütuna birden fazla referans içerdiğinde, hata oluşturulup oluşturulmadığı veya sürücünün çoğaltılan referansları görmezden gelip istenen işlemleri gerçekleştirip gerçekleştirmediği sürücü tarafından tanımlanır.
Toptan Operasyonların Gerçekleştirilmesi
Eğer RowNumber argümanı 0 ise, sürücü, Operation argümanında belirtilen işlemi yapar; bu satırda SQL_ROW_PROCEED değeri olan her satır için SQL_ATTR_ROW_OPERATION_PTR özniteliğiyle işaretlenen satır işlem dizisinde değeri vardır. Bu, SQL_DELETE, SQL_REFRESH veya SQL_UPDATE Operasyon argümanı için geçerli bir RowNumber argümanı değeridir, ancak SQL_POSITION değildir. SQL_POSITION İşlemi ve 0'a eşit Sıra Sayısıolan SQLSetPos, SQLSTATE HY109 (Geçersiz imleç pozisyonu) döndürecektir.
Eğer SQLSTATE HYT00 (Zaman aşımının süresi doldu) gibi tüm satır kümesine ait bir hata oluşursa, sürücü SQL_ERROR ve uygun SQLSTATE döndürür. Sıra kümesi tamponlarının içeriği tanımlanmamış ve imlecin konumu değişmemiştir.
Eğer tek bir satırla ilgili bir hata oluşursa, sürücü:
SQL_ATTR_ROW_STATUS_PTR ifadesi özniteliğiyle işaret edilen satır durum dizisinde satır için elemanı SQL_ROW_ERROR olarak ayarlar.
Hata kuyruğundaki hata için bir veya daha fazla SQL durumu belirler ve tanı veri yapısında SQL_DIAG_ROW_NUMBER alanını ayarlar.
Hata veya uyarı işlendikten sonra, sürücü sıradaki kalan satır için işlemi tamamlarsa, SQL_SUCCESS_WITH_INFO döner. Bu nedenle, hata veren her satır için, hata kuyruğu sıfır veya daha fazla ek SQLSTATE içerir. Sürücü hata veya uyarıyı işledikten sonra işlemi durdurursa, SQL_ERROR döndürür.
Sürücü, örneğin SQLSTATE 01004 (Veri kısaltılmış) gibi herhangi bir uyarı dönerse, belirli satırlar için geçerli hata bilgisini vermeden önce tüm satır kümesine veya satırdaki bilinmeyen satırlara uygulanan uyarılar döner. Belirli satırlar için uyarılar ve bu satırlarla ilgili diğer hata bilgilerini döndürür.
Eğer RowNumber 0 ve Operation SQL_UPDATE, SQL_REFRESH veya SQL_DELETE ise, SQLSetPos'un çalıştığı satır sayısı SQL_ATTR_ROWS_FETCHED_PTR ifadesi özniteliğiyle gösterilir.
Eğer Sıra Numarası 0 ve İşlem SQL_DELETE, SQL_REFRESH veya SQL_UPDATE ise, işlemden sonraki mevcut satır işlemden önceki mevcut satır ile aynıdır.
Toplu Operasyonda Bir Sırayı Görmezden Gelmek
Satır işlem dizisi, SQLSetPos kullanılarak toplu işlem sırasında mevcut satır kümesindeki bir satırın göz ardı edilmesi gerektiğini belirtmek için kullanılabilir. Sürücüyü toplu işlem sırasında bir veya daha fazla satırı görmezden gelmesini sağlamak için bir uygulama aşağıdaki adımları gerçekleştirmelidir:
SQLSetStmtAttr çağırarak SQL_ATTR_ROW_OPERATION_PTR ifadesi özniteliğini bir SQLUSMALLINT dizisine işaret edecek şekilde ayarlayın. Bu alan, ARD'nin SQL_DESC_ARRAY_STATUS_PTR başlık alanını ayarlamak için SQLSetDescField çağrılarak da ayarlanabilir; bu da bir uygulamanın tanımlayıcı tutamacını almasını gerektirir.
Satır işlem dizisinin her elemanını iki değerden birine ayarlayın:
SQL_ROW_IGNORE, bu da sıranın toplu işlem için hariç tutulduğunu belirtmek için.
SQL_ROW_PROCEED, satırın toplu işleme dahil olduğunu belirtmek için. (Bu varsayılan değerdir.)
Toplu işlemi gerçekleştirmek için SQLSetPos'u çağırın.
Aşağıdaki kurallar satır işlem dizisi için geçerlidir:
SQL_ROW_IGNORE ve SQL_ROW_PROCEED yalnızca SQLSetPos kullanılarak SQL_DELETE veya SQL_UPDATE operasyonlu toplu işlemleri etkiler. SQL_REFRESH veya SQL_POSITION işlemiyle SQLSetPos çağrılarını etkilemezler.
İşaretçi varsayılan olarak null olarak ayarlanmıştır.
Eğer işaretçi null ise, tüm satırlar tüm öğeler SQL_ROW_PROCEED olarak ayarlanmış gibi güncellenir.
Bir elemanı SQL_ROW_PROCEED olarak ayarlamak, işlemin o satırda gerçekleşeceğini garanti etmez. Örneğin, satır kümesindeki belirli bir satır SQL_ROW_ERROR durumundaysa, sürücü SQL_ROW_PROCEED belirtse de o satırı güncelleyemeyebilir. Bir uygulama, işlemin başarılı olup olmadığını görmek için her zaman satır durum dizisini kontrol etmelidir.
SQL_ROW_PROCEED, başlık dosyasında 0 olarak tanımlanır. Bir uygulama, tüm satırları işlemek için satır işlem dizisini 0'a başlatabilir.
Eğer satır işlem dizisinde "n" öğe numarası SQL_ROW_IGNORE olarak ayarlanmışsa ve SQLSetPos toplu güncelleme veya silme işlemi yapmak için çağrılırsa, sıradaki n. satır SQLSetPos çağrısından sonra değişmeden kalır.
Bir uygulama, otomatik olarak yalnızca okunabilir bir sütununu SQL_ROW_IGNORE olarak ayarlamalıdır.
Toplu Operasyonda Bir Kolonu Görmezden Gelmek
Bir veya daha fazla okunabilir sütunda güncelleme girişimleriyle oluşturulan gereksiz işlem tanılarından kaçınmak için, bir uygulama sınır uzunluğu/gösterge tamponu değerini SQL_COLUMN_IGNORE olarak ayarlayabilir. Daha fazla bilgi için SQLBindCol.
Kod Örneği
Aşağıdaki örnekte, bir uygulama kullanıcının ORDERS tablosunu gezdirmesine ve sipariş durumunu güncellemesine izin verir. İmleç, 20 satır kümesi boyutuna sahip tuş seti ile yönlendirilir ve satır sürümlerini karşılaştırırken iyimser eşlilik kontrolü kullanır. Her satır seti alındıktan sonra, uygulama onu yazdırır ve kullanıcının bir siparişin durumunu seçip güncellemesine olanak tanır. Uygulama, seçilmiş satırda imleci konumlandırmak için SQLSetPos kullanır ve satırın konumlandırılmış güncellemesini gerçekleştirir. (Hata yönetimi netlik için çıkarılmıştır.)
#define ROWS 20
#define STATUS_LEN 6
SQLCHAR szStatus[ROWS][STATUS_LEN], szReply[3];
SQLINTEGER cbStatus[ROWS], cbOrderID;
SQLUSMALLINT rgfRowStatus[ROWS];
SQLUINTEGER sOrderID, crow = ROWS, irow;
SQLHSTMT hstmtS, hstmtU;
SQLSetStmtAttr(hstmtS, SQL_ATTR_CONCURRENCY, (SQLPOINTER) SQL_CONCUR_ROWVER, 0);
SQLSetStmtAttr(hstmtS, SQL_ATTR_CURSOR_TYPE, (SQLPOINTER) SQL_CURSOR_KEYSET_DRIVEN, 0);
SQLSetStmtAttr(hstmtS, SQL_ATTR_ROW_ARRAY_SIZE, (SQLPOINTER) ROWS, 0);
SQLSetStmtAttr(hstmtS, SQL_ATTR_ROW_STATUS_PTR, (SQLPOINTER) rgfRowStatus, 0);
SQLSetCursorName(hstmtS, "C1", SQL_NTS);
SQLExecDirect(hstmtS, "SELECT ORDERID, STATUS FROM ORDERS ", SQL_NTS);
SQLBindCol(hstmtS, 1, SQL_C_ULONG, &sOrderID, 0, &cbOrderID);
SQLBindCol(hstmtS, 2, SQL_C_CHAR, szStatus, STATUS_LEN, &cbStatus);
while ((retcode == SQLFetchScroll(hstmtS, SQL_FETCH_NEXT, 0)) != SQL_ERROR) {
if (retcode == SQL_NO_DATA_FOUND)
break;
for (irow = 0; irow < crow; irow++) {
if (rgfRowStatus[irow] != SQL_ROW_DELETED)
printf("%2d %5d %*s\n", irow+1, sOrderID, NAME_LEN-1, szStatus[irow]);
}
while (TRUE) {
printf("\nRow number to update?");
gets_s(szReply, 3);
irow = atoi(szReply);
if (irow > 0 && irow <= crow) {
printf("\nNew status?");
gets_s(szStatus[irow-1], (ROWS * STATUS_LEN));
SQLSetPos(hstmtS, irow, SQL_POSITION, SQL_LOCK_NO_CHANGE);
SQLPrepare(hstmtU,
"UPDATE ORDERS SET STATUS=? WHERE CURRENT OF C1", SQL_NTS);
SQLBindParameter(hstmtU, 1, SQL_PARAM_INPUT,
SQL_C_CHAR, SQL_CHAR,
STATUS_LEN, 0, szStatus[irow], 0, NULL);
SQLExecute(hstmtU);
} else if (irow == 0) {
break;
}
}
}
Daha fazla örnek için, SQLSetPos ile Sıralar Kümesinde Konumlandırılmış Güncelleme ve Silme Cümleleri ile Satır Güncelleme bölümlerine bakınız.
İlgili Fonksiyonlar
| Hakkında bilgi için | Bkz: |
|---|---|
| Sonuç kümesindeki bir sütuna arabellek bağlama | SQLBindCol İşlevi |
| Blok imleci konumuyla ilişkili olmayan toplu işlemler yapmak | SQLBulkOperations Fonksiyonu |
| 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 |
| Deyim özniteliğini ayarlama | SQLSetStmtAttr İşlevi |