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.
SQLSetPos'un güncelleştirme işlemi, veri kaynağının her ilişkili sütun için uygulama arabelleklerindeki verileri kullanarak (uzunluk/gösterge arabelleğindeki değer SQL_COLUMN_IGNORE değilse) bir tablonun seçili bir veya daha fazla satırını güncelleştirmesini sağlar. İlişkili olmayan sütunlar güncelleştirilmez.
SQLSetPos ile satırları güncelleştirmek için uygulama aşağıdakileri yapar:
Yeni veri değerlerini satır kümesi arabelleklerine yerleştirir. SQLSetPos ile uzun veri gönderme hakkında bilgi için bkz. Long Data ve SQLSetPos ve SQLBulkOperations.
Her sütunun uzunluk/gösterge arabelleğindeki değeri gerektiği gibi ayarlar. Bu, dize arabelleklerine bağlı sütunlar için verilerin bayt uzunluğu veya SQL_NTS, ikili arabelleklere bağlı sütunlar için verilerin bayt uzunluğu ve NULL olarak ayarlanacak tüm sütunlar için SQL_NULL_DATA.
Bu sütunların uzunluk/gösterge arabelleğindeki değeri SQL_COLUMN_IGNORE güncelleştirilmeyecek şekilde ayarlar. Uygulama bu adımı atlayıp mevcut verileri yeniden gönderebilirse de, bu verimsizdir ve okunduklarında kesilen değerlerin veri kaynağına gönderilmesi riskini taşır.
SQLSetPos'ı, İşlem SQL_UPDATE ve RowNumber değeri güncelleştirilecek satırın numarasına ayarlanmış biçimde çağırır. RowNumber 0 ise, satır kümesindeki tüm satırlar güncelleştirilir.
SQLSetPos döndürdüğünde, geçerli satır güncelleştirilmiş satıra ayarlanır.
Satır kümesinin tüm satırlarını güncelleştirirken (RowNumber 0'a eşittir), uygulama satır işlem dizisinin karşılık gelen öğelerini (SQL_ATTR_ROW_OPERATION_PTR deyimi özniteliği tarafından işaret edilen) SQL_ROW_IGNORE olarak ayarlayarak belirli satırların güncelleştirilmesini devre dışı bırakabilir. Satır işlemi dizisi, satır durumu dizisine (SQL_ATTR_ROW_STATUS_PTR deyimi özniteliği tarafından işaret edilen) öğe boyutuna ve sayısına karşılık gelir. Yalnızca sonuç kümesinde başarıyla getirilen ve satır kümesinden silinmemiş satırları güncelleştirmek için uygulama, satır kümesini SQLSetPos'a satır işlemi dizisi olarak getiren işlevden satır durumu dizisini kullanır.
Veri kaynağına güncelleştirme olarak gönderilen her satır için uygulama arabelleklerinde geçerli satır verileri olmalıdır. Uygulama arabellekleri alınarak doldurulduysa ve bir satır durumu dizisi tutulmuşsa, bu satır konumlarının her birinde bulunan değerler SQL_ROW_DELETED, SQL_ROW_ERROR veya SQL_ROW_NOROW olmamalıdır.
Örneğin, aşağıdaki kod bir kullanıcının Müşteriler tablosunda gezinmesine ve yeni satırları güncelleştirmesine, silmesine veya eklemesine olanak tanır. Yeni satırları güncelleştirmek veya eklemek için SQLSetPos çağrısından önce yeni verileri satır kümesi arabelleklerine yerleştirir. Yeni satırları tutmak için satır kümesi arabelleklerinin sonuna fazladan bir satır ayrılır; bu, arabelleklere yeni bir satıra ait veriler yerleştirildiğinde mevcut verilerin üzerine yazılmasını engeller.
#define UPDATE_ROW 100
#define DELETE_ROW 101
#define ADD_ROW 102
SQLUINTEGER CustIDArray[11];
SQLCHAR NameArray[11][51], AddressArray[11][51],
PhoneArray[11][11];
SQLINTEGER CustIDIndArray[11], NameLenOrIndArray[11],
AddressLenOrIndArray[11],
PhoneLenOrIndArray[11];
SQLUSMALLINT RowStatusArray[10], Action, RowNum;
SQLRETURN rc;
SQLHSTMT hstmt;
// Set the SQL_ATTR_ROW_BIND_TYPE statement attribute to use column-wise
// binding. Declare the rowset size with the SQL_ATTR_ROW_ARRAY_SIZE
// statement attribute. Set the SQL_ATTR_ROW_STATUS_PTR statement
// attribute to point to the row status array.
SQLSetStmtAttr(hstmt, SQL_ATTR_CURSOR_TYPE, SQL_CURSOR_KEYSET_DRIVEN, 0);
SQLSetStmtAttr(hstmt, SQL_ATTR_ROW_BIND_TYPE, SQL_BIND_BY_COLUMN, 0);
SQLSetStmtAttr(hstmt, SQL_ATTR_ROW_ARRAY_SIZE, 10, 0);
SQLSetStmtAttr(hstmt, SQL_ATTR_ROW_STATUS_PTR, RowStatusArray, 0);
// Bind arrays to the CustID, Name, Address, and Phone columns.
SQLBindCol(hstmt, 1, SQL_C_ULONG, CustIDArray, 0, CustIDIndArray);
SQLBindCol(hstmt, 2, SQL_C_CHAR, NameArray, sizeof(NameArray[0]), NameLenOrIndArray);
SQLBindCol(hstmt, 3, SQL_C_CHAR, AddressArray, sizeof(AddressArray[0]),
AddressLenOrIndArray);
SQLBindCol(hstmt, 4, SQL_C_CHAR, PhoneArray, sizeof(PhoneArray[0]),
PhoneLenOrIndArray);
// Execute a statement to retrieve rows from the Customers table.
SQLExecDirect(hstmt, "SELECT CustID, Name, Address, Phone FROM Customers", SQL_NTS);
// Fetch and display the first 10 rows.
rc = SQLFetchScroll(hstmt, SQL_FETCH_NEXT, 0);
DisplayData(CustIDArray, CustIDIndArray, NameArray, NameLenOrIndArray, AddressArray,
AddressLenOrIndArray, PhoneArray, PhoneLenOrIndArray, RowStatusArray);
// Call GetAction to get an action and a row number from the user.
while (GetAction(&Action, &RowNum)) {
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);
DisplayData(CustIDArray, CustIDIndArray,
NameArray, NameLenOrIndArray,
AddressArray, AddressLenOrIndArray,
PhoneArray, PhoneLenOrIndArray, RowStatusArray);
break;
case UPDATE_ROW:
// Place the new data in the rowset buffers and update the
// specified row.
GetNewData(&CustIDArray[RowNum - 1], &CustIDIndArray[RowNum - 1],
NameArray[RowNum - 1], &NameLenOrIndArray[RowNum - 1],
AddressArray[RowNum - 1], &AddressLenOrIndArray[RowNum - 1],
PhoneArray[RowNum - 1], &PhoneLenOrIndArray[RowNum - 1]);
SQLSetPos(hstmt, RowNum, SQL_UPDATE, SQL_LOCK_NO_CHANGE);
break;
case DELETE_ROW:
// Delete the specified row.
SQLSetPos(hstmt, RowNum, SQL_DELETE, SQL_LOCK_NO_CHANGE);
break;
case ADD_ROW:
// Place the new data in the rowset buffers at index 10.
// This is an extra element for new rows so rowset data is
// not overwritten. Insert the new row. Row 11 corresponds
// to index 10.
GetNewData(&CustIDArray[10], &CustIDIndArray[10],
NameArray[10], &NameLenOrIndArray[10],
AddressArray[10], &AddressLenOrIndArray[10],
PhoneArray[10], &PhoneLenOrIndArray[10]);
SQLSetPos(hstmt, 11, SQL_ADD, SQL_LOCK_NO_CHANGE);
break;
}
}
// Close the cursor.
SQLCloseCursor(hstmt);