Vytváření hledaných výroků

Important

Tato funkce se odebere v budoucí verzi Windows. Nepoužívejte tuto funkci v nové vývojové práci a naplánujte úpravu aplikací, které tuto funkci aktuálně používají. Microsoft doporučuje používat funkci kurzoru ovladače.

Pro podporu příkazů pro aktualizaci a mazání s pozicemi knihovna kurzorů vytváří vyhledávaný UPDATE nebo DELETE příkaz z daného příkazu. Pro podporu volání SQLGetData v datovém bloku knihovna kurzoru vytváří vyhledávaný příkaz SELECT pro vytvoření výsledné sady obsahující aktuální řádek dat. V každém z těchto příkazů klauzule WHERE vyjmenovává hodnoty uložené v cache pro každý bound sloupec, který vrací SQL_PRED_SEARCHABLE nebo SQL_PRED_BASIC pro identifikátor pole SQL_DESC_SEARCHABLE v SQLColAttribute.

Caution

Klauzule WHERE vytvořená kurzorovou knihovnou pro identifikaci aktuálního řádku může selhat v identifikaci žádných řádků, jiného řádku nebo více než jednoho řádku.

Pokud příkaz "positioned update" nebo delete ovlivní více než jeden řádek, knihovna kurzoru aktualizuje pole stavů řádku pouze pro řádek, na kterém je kurzor umístěn, a vrátí SQL_SUCCESS_WITH_INFO a SQLSTATE 01001 (konflikt operací kurzoru). Pokud příkaz neidentifikuje žádné řádky, knihovna kurzoru neaktualizuje pole stavů řádku a vrací SQL_SUCCESS_WITH_INFO a SQLSTATE 01001 (konflikt operací kurzoru). Aplikace může volat SQLRowCount a určit počet řádků, které byly aktualizovány nebo smazány.

Pokud klauzule SELECT použitá k umístění kurzoru pro volání SQLGetData identifikuje více než jeden řádek, není zaručeno, že SQLGetData vrátí správná data. Pokud neidentifikuje žádné řádky, SQLGetData SQL_NO_DATA.

Pokud aplikace dodržuje následující pokyny, klauzule WHERE vytvořená knihovnou kurzoru by měla jednoznačně identifikovat aktuální řádek, kromě případů, kdy to není možné, například když datový zdroj obsahuje duplicitní řádky.

  • Připojte sloupce, které jednoznačně identifikují daný řádek. Pokud vázané sloupce jednoznačně neidentifikují řádek, může klauzule WHERE vytvořená kurzorovou knihovnou identifikovat více než jeden řádek. V příkazu aktualizace nebo delete s pozicemi může taková klauzule způsobit aktualizaci nebo smazání více řádků. Při volání SQLGetData může taková klauzule způsobit, že ovladač vrátí data pro nesprávný řádek. Přiřazení všech sloupců do jedinečného klíče zaručuje, že každý řádek je jednoznačně identifikován.

  • Alokujte datové buffery dostatečně velké, aby nedošlo k ořezání. Cache knihovny kurzorů je kopií hodnot v bufferech řádků vázaných na výslednou sadu pomocí SQLBindCol. Pokud jsou data při umístění do těchto bufferů zkrácena, budou také zkrácena v cache. Klauzule WHERE vytvořená z ořezaných hodnot nemusí správně identifikovat základní řádek ve zdroji dat.

  • Specifikujte buffery délky bez nuly pro binární C data. Knihovna kurzorů přiděluje buffery délky do své cache pouze tehdy, pokud je argument StrLen_or_IndPtr v SQLBindCol nenull. Když je argument TargetType SQL_C_BINARY, knihovna kurzorů vyžaduje délku binárních dat k vytvoření klauzule WHERE z dat. Pokud neexistuje buffer délky pro SQL_C_BINARY sloupec a aplikace volá SQLGetData nebo se pokusí spustit příkaz pro aktualizaci nebo odstranění umístěného, knihovna kurzoru vrátí SQL_ERROR a SQLSTATE SL014 (byl vydán požadavek na pozici a ne všechna pole počtu sloupců byla uložena do bufferu).

  • Specifikujte buffery délky bez nuly pro sloupce, které lze vyhodnotit. Knihovna kurzorů přiděluje buffery délky do své cache pouze tehdy, pokud je argument StrLen_or_IndPtr v SQLBindCol nenull. Protože SQL_NULL_DATA je uložen v dlouhověkém bufferu, knihovna kurzoru předpokládá, že každý sloupec, pro který není specifikován délkový buffer, je nenulovatelný. Pokud pro nulovatelný sloupec není specifikován sloupec délky, knihovna kurzoru vytvoří klauzuli WHERE , která využívá datovou hodnotu pro daný sloupec. Tato klauzule správně neidentifikuje řádek.