Megosztás:


Pozícionált frissítési és törlési utasítások

Az alkalmazások frissíthetik vagy törölhetik az eredményhalmaz aktuális sorát egy pozícióban lévő frissítési vagy törlési utasítással. Helyzethez kötött frissítési és törlési utasításokat néhány adatforrás támogat, de nem mindegyik. Annak megállapításához, hogy egy adatforrás támogatja-e a helyhez tartozó frissítési és törlési utasításokat, egy alkalmazás meghívja az SQLGetInfo-t a SQL_DYNAMIC_CURSOR_ATTRIBUTES1, SQL_FORWARD_ONLY_CURSOR_ATTRIBUTES1, SQL_KEYSET_CURSOR_ATTRIBUTES1 vagy SQL_STATIC_CURSOR_ATTRIBUTES1 InfoType használatával (a kurzor típusától függően). Vegye figyelembe, hogy az ODBC-kurzortár a pozícióban lévő frissítési és törlési utasításokat szimulálja.

A helyhez igazított frissítési vagy törlési utasítás használatához az alkalmazásnak létre kell hoznia egy eredménykészletet a SELECT FOR UPDATE utasítással. Az utasítás szintaxisa a következő:

SELECT [ALL | DISTINCT] select-list

FROMtable-reference-list

[WHEREkeresési feltétel]

FRISSÍTÉSÉHEZ [oszlopnév [,oszlopnév]...]

Az alkalmazás ezután a kurzort a frissíteni vagy törölni kívánt sorra pozilogja. Ezt úgy teheti meg, hogy meghívja az SQLFetchScrollt , hogy lekérjen egy sorhalmazt, amely tartalmazza a szükséges sort, és meghívja az SQLSetPos parancsot , hogy a sorhalmaz kurzorát az adott sorra helyezze. Az alkalmazás ezután az eredményhalmaz által használt utasítástól eltérő utasításon hajtja végre a pozícióban lévő frissítési vagy törlési utasítást. Ezeknek az utasításoknak a szintaxisa a következő:

UPDATEtáblanév

SEToszlopazonosító= {expression | NULL}

[,oszlopazonosító= {kifejezés | NULL}]...

WHERE CURRENT OFcursor-name

DELETE FROMtable-nameWHERE CURRENT OFcursor-name

Figyelje meg, hogy ezek az utasítások kurzornevet igényelnek. Az alkalmazás vagy megadhatja az SQLSetCursorName kurzornevét az eredményhalmazt létrehozó utasítás végrehajtása előtt, vagy engedélyezheti, hogy az adatforrás automatikusan létrehozza a kurzor nevét a kurzor létrehozásakor. Az utóbbi esetben az alkalmazás az SQLGetCursorName meghívásával lekéri ezt a kurzornevet a pozicionált frissítési és törlési utasításokhoz.

Az alábbi kód például lehetővé teszi, hogy a felhasználó végiggörgetjen az Ügyfelek táblán, és törölje az ügyfélrekordokat, vagy frissítse a címét és telefonszámait. Meghívja az SQLSetCursorName-t , hogy adjon meg egy kurzornevet, mielőtt létrehozza az ügyfelek eredményhalmazát, és három utasításkezelőt használ: hstmtCust az eredményhalmazhoz, hstmtUpdate egy pozíciós frissítési utasításhoz, a hstmtDelete pedig egy pozíciós törlési utasításhoz. Bár a kód külön változókat köthet a helyhez kötött frissítési utasítás paramétereihez, frissíti a sorhalmaz puffereit, és összekapcsolja ezeknek a puffereknek az elemeit. Így a sorkészlet pufferei szinkronizálva maradnak a frissített adatokkal.

#define POSITIONED_UPDATE 100  
#define POSITIONED_DELETE 101  
  
SQLUINTEGER    CustIDArray[10];  
SQLCHAR        NameArray[10][51], AddressArray[10][51],   
               PhoneArray[10][11];  
SQLINTEGER     CustIDIndArray[10], NameLenOrIndArray[10],   
               AddressLenOrIndArray[10],  
               PhoneLenOrIndArray[10];  
SQLUSMALLINT   RowStatusArray[10], Action, RowNum;  
SQLHSTMT       hstmtCust, hstmtUpdate, hstmtDelete;  
  
// Set the SQL_ATTR_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(hstmtCust, SQL_ATTR_ROW_BIND_TYPE, SQL_BIND_BY_COLUMN, 0);  
SQLSetStmtAttr(hstmtCust, SQL_ATTR_ROW_ARRAY_SIZE, 10, 0);  
SQLSetStmtAttr(hstmtCust, SQL_ATTR_ROW_STATUS_PTR, RowStatusArray, 0);  
  
// Bind arrays to the CustID, Name, Address, and Phone columns.  
SQLBindCol(hstmtCust, 1, SQL_C_ULONG, CustIDArray, 0, CustIDIndArray);  
SQLBindCol(hstmtCust, 2, SQL_C_CHAR, NameArray, sizeof(NameArray[0]),  
            NameLenOrIndArray);  
SQLBindCol(hstmtCust, 3, SQL_C_CHAR, AddressArray, sizeof(AddressArray[0]),  
         AddressLenOrIndArray);  
SQLBindCol(hstmtCust, 4, SQL_C_CHAR, PhoneArray, sizeof(PhoneArray[0]),  
            PhoneLenOrIndArray);  
  
// Set the cursor name to Cust.  
SQLSetCursorName(hstmtCust, "Cust", SQL_NTS);  
  
// Prepare positioned update and delete statements.  
SQLPrepare(hstmtUpdate,  
   "UPDATE Customers SET Address = ?, Phone = ? WHERE CURRENT OF Cust",  
   SQL_NTS);  
SQLPrepare(hstmtDelete, "DELETE FROM Customers WHERE CURRENT OF Cust", SQL_NTS);  
  
// Execute a statement to retrieve rows from the Customers table.  
SQLExecDirect(hstmtCust,  
   "SELECT CustID, Name, Address, Phone FROM Customers FOR UPDATE OF Address, Phone",  
   SQL_NTS);  
  
// Fetch and display the first 10 rows.  
SQLFetchScroll(hstmtCust, 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(hstmtCust, Action, RowNum);  
         DisplayData(CustIDArray, CustIDIndArray, NameArray, NameLenOrIndArray,  
                     AddressArray, AddressLenOrIndArray, PhoneArray,  
                     PhoneLenOrIndArray, RowStatusArray);  
         break;  
  
      case POSITIONED_UPDATE:  
         // Get the new data and place it in the rowset buffers.  
         GetNewData(AddressArray[RowNum - 1], &AddressLenOrIndArray[RowNum - 1],  
                     PhoneArray[RowNum - 1], &PhoneLenOrIndArray[RowNum - 1]);  
  
         // Bind the elements of the arrays at position RowNum-1 to the   
         // parameters of the positioned update statement.  
         SQLBindParameter(hstmtUpdate, 1, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_CHAR,  
                           50, 0, AddressArray[RowNum - 1], sizeof(AddressArray[0]),  
                           &AddressLenOrIndArray[RowNum - 1]);  
         SQLBindParameter(hstmtUpdate, 2, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_CHAR,  
                           10, 0, PhoneArray[RowNum - 1], sizeof(PhoneArray[0]),  
                           &PhoneLenOrIndArray[RowNum - 1]);  
  
         // Position the rowset cursor. The rowset is 1-based.  
         SQLSetPos(hstmtCust, RowNum, SQL_POSITION, SQL_LOCK_NO_CHANGE);  
  
         // Execute the positioned update statement to update the row.  
         SQLExecute(hstmtUpdate);  
         break;  
  
      case POSITIONED_DELETE:  
         // Position the rowset cursor. The rowset is 1-based.  
         SQLSetPos(hstmtCust, RowNum, SQL_POSITION, SQL_LOCK_NO_CHANGE);  
  
         // Execute the positioned delete statement to delete the row.  
         SQLExecute(hstmtDelete);  
         break;  
   }  
}  
  
// Close the cursor.  
SQLCloseCursor(hstmtCust);