Sdílet prostřednictvím


Dlouhá data, SQLSetPos a SQLBulkOperations

Stejně jako u parametrů v příkazech SQL je možné odesílat dlouhá data při aktualizaci řádků pomocí sqlBulkOperations nebo SQLSetPos nebo při vkládání řádků pomocí SQLBulkOperations. Data se odesílají v částech s více voláními SQLPutData. Sloupce, pro které se data odesílají v době provádění, se označují jako sloupce data při spuštění.

Poznámka:

Aplikace ve skutečnosti může odesílat jakýkoli typ dat v době provádění pomocí SQLPutData, i když lze posílat pouze znaky a binární data v částech. Pokud jsou však data dostatečně malá, aby se vešla do jedné vyrovnávací paměti, není obecně důvod použít SQLPutData. Mnohem jednodušší je připojit vyrovnávací paměť a nechat ovladač načíst data z vyrovnávací paměti.

Vzhledem k tomu, že dlouhé datové sloupce obvykle nejsou vázány, musí aplikace vytvořit vazbu sloupce před voláním SQLBulkOperations nebo SQLSetPos a zrušit vazbu po volání SQLBulkOperations nebo SQLSetPos. Sloupec musí být vázán, protože SQLBulkOperations nebo SQLSetPos funguje pouze u vázaných sloupců a musí být nevázaný, aby sqlGetData bylo možné použít k načtení dat ze sloupce.

Pokud chcete odesílat data v době provádění, aplikace provede následující akce:

  1. Umístí 32bitovou hodnotu do vyrovnávací paměti sady řádků místo datové hodnoty. Tato hodnota se vrátí do aplikace později, takže by ji měla nastavit na smysluplnou hodnotu, například na počet sloupců nebo popisovač souboru obsahujícího data.

  2. Nastaví hodnotu v vyrovnávací paměti délky/ukazatele na výsledek makra SQL_LEN_DATA_AT_EXEC(délka). Tato hodnota označuje ovladač, že data pro parametr budou odeslána pomocí SQLPutData. Hodnota délky se používá při odesílání dlouhých dat do zdroje dat, který potřebuje vědět, kolik bajtů dlouhých dat se odešle, aby bylo možné předem přidělit místo. Chcete-li zjistit, zda zdroj dat vyžaduje tuto hodnotu, aplikace volá SQLGetInfo s možností SQL_NEED_LONG_DATA_LEN. Toto makro musí podporovat všechny ovladače; pokud zdroj dat nevyžaduje délku bajtu, může ho ovladač ignorovat.

  3. Volá SQLBulkOperations nebo SQLSetPos. Ovladač zjistí, že vyrovnávací paměť délky a ukazatele obsahuje výsledek makra SQL_LEN_DATA_AT_EXEC(délka) a vrátí SQL_NEED_DATA jako návratovou hodnotu funkce.

  4. Volá SQLParamData v reakci na SQL_NEED_DATA návratovou hodnotu. Pokud je potřeba odeslat dlouhá data, vrátí SQLParamData SQL_NEED_DATA. Ve vyrovnávací paměti odkazované argumentem ValuePtrPtr ovladač vrátí jedinečnou hodnotu, kterou aplikace umístila do vyrovnávací paměti sady řádků. Pokud existuje více než jeden sloupec data-při-výkonu, aplikace použije tuto hodnotu k určení, pro který sloupec se mají odesílat data; ovladač není povinen vyžádat data pro sloupce data-při-výkonu v žádném konkrétním pořadí.

  5. Volá SQLPutData k odeslání dat sloupce do ovladače. Pokud se data sloupce nevejdou do jedné vyrovnávací paměti, což je často případ dlouhých dat, aplikace volá SQLPutData opakovaně k odesílání dat v částech; na ovladači a zdroji dat je, aby data znovu sesestavili. Pokud aplikace předává řetězcová data ukončená hodnotou null, ovladač nebo zdroj dat musí v rámci procesu opětovného sestavení odebrat znak ukončení s hodnotou null.

  6. Znovu volá SQLParamData , aby indikoval, že odeslala všechna data pro sloupec. Pokud existují nějaké sloupce s daty při spuštění, pro které se data neodeslala, vrátí ovladač SQL_NEED_DATA a jedinečnou hodnotu pro následující sloupec s daty při spuštění; aplikace se vrátí ke kroku 5. Pokud byla data odeslána pro všechny sloupce při spuštění dat, data pro řádek se odešlou do zdroje dat. SQLParamData pak vrátí SQL_SUCCESS nebo SQL_SUCCESS_WITH_INFO a může vrátit libovolný SQLSTATE, který sqlBulkOperations nebo SQLSetPos může vrátit.

Poté, co SQLBulkOperations nebo SQLSetPos vrátí SQL_NEED_DATA a předtím, než jsou data úplně odeslána pro poslední sloupec dat při spuštění, je příkaz ve stavu Potřeba dat. V tomto stavu může aplikace volat pouze SQLPutData, SQLParamData, SQLCancel, SQLGetDiagField nebo SQLGetDiagRec; všechny ostatní funkce vrací SQLSTATE HY010 (chyba sekvence funkcí). Volání sqlCancel zruší provádění příkazu a vrátí ho do předchozího stavu. Další informace naleznete v dodatku B: Tabulky přechodu stavu ODBC.