Tworzenie aplikacji sterownikowej – tryb asynchroniczny i SQLCancel

Dotyczy:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)

Important

Klient natywny SQL Servera (SNAC) nie jest dostarczany z:

  • SQL Server 2022 (16.x) i nowsze wersje
  • SQL Server Management Studio 19 i nowsze wersje

Program SQL Server Native Client (SQLNCLI lub SQLNCLI11) oraz starszy dostawca microsoft OLE DB dla programu SQL Server (SQLOLEDB) nie są zalecane w przypadku tworzenia nowych aplikacji.

W przypadku nowych projektów użyj jednego z następujących sterowników:

W przypadku programu SQLNCLI dostarczanego jako składnik aparatu bazy danych programu SQL Server (wersje 2012–2019), proszę sprawdzić wyjątek cyklu wsparcia .

Niektóre funkcje ODBC mogą działać synchronicznie lub asynchronicznie. Aplikacja może umożliwić operacje asynchroniczne zarówno dla uchwytu instrukcji, jak i uchwytu połączenia. Jeśli opcja jest ustawiona dla uchwytu połączenia, wpływa na wszystkie uchwyty instrukcji na uchwytie połączenia. Aplikacja używa następujących instrukcji do włączania lub wyłączania operacji asynchronicznych:

SQLSetConnectAttr(hdbc, SQL_ATTR_ASYNC_ENABLE,  
                        SQL_ASYNC_ENABLE_ON, SQL_IS_INTEGER);  
SQLSetConnectAttr(hdbc, SQL_ATTR_ASYNC_ENABLE,  
                        SQL_ASYNC_ENABLE_OFF, SQL_IS_INTEGER);  
SQLSetStmtAttr(hstmt, SQL_ATTR_ASYNC_ENABLE,  
                        SQL_ASYNC_ENABLE_ON, SQL_IS_INTEGER);  
SQLSetStmtAttr(hstmt, SQL_ATTR_ASYNC_ENABLE,  
                        SQL_ASYNC_ENABLE_OFF, SQL_IS_INTEGER);  

Gdy aplikacja wywołuje funkcję ODBC w trybie synchronicznym, sterownik nie zwraca kontroli aplikacji, dopóki nie zostanie powiadomiona, że serwer ukończył polecenie.

Podczas działania asynchronicznego sterownik natychmiast zwraca kontrolę aplikacji, nawet zanim wyśle polecenie do serwera. Kierowca ustawia kod zwrotny na SQL_STILL_EXECUTING. Aplikacja może następnie wykonywać inne zadania.

Gdy aplikacja sprawdza zakończenie polecenia, wykonuje to samo wywołanie funkcji z tymi samymi parametrami do sterownika. Jeśli kierowca nie otrzymał jeszcze odpowiedzi od serwera, ponownie wróci SQL_STILL_EXECUTING. Aplikacja musi okresowo testować polecenie, aż kod zwrotny będzie czymś innym niż SQL_STILL_EXECUTING. Gdy aplikacja otrzyma inny kod zwrotny, nawet SQL_ERROR, może ustalić, że polecenie zostało zakończone.

Czasem komenda jest nieustanna przez długi czas. Jeśli aplikacja musi anulować polecenie bez oczekiwania na odpowiedź, może to zrobić, wywołując SQLCancel z tym samym uchwytem instrukcji co polecenie oczekujące. To jedyny moment, kiedy powinno się używać SQLCancel . Niektórzy programiści używają SQLCancel , gdy przetworzyli zestaw wyników w połowie i chcą anulować resztę zbioru wyników. SQLMoreResults lub SQLCloseCursor powinny być używane do anulowania pozostałej części nieoczekiwanego zbioru wyników, a nie SQLCancel.