Udostępnij za pośrednictwem


Za pomocą wielu aktywnych wynik ustawia (MARS)

SQL Server 2005wprowadzić obsługi zestawy wielu wyników active (MARS) w aplikacji dostęp do Aparat baz danych.W starszych wersjach SQL Server, baza danych aplikacji nie może zachować wielokrotne instrukcje aktywnego połączenia.When using SQL Server default result sets, the application had to process or cancel all result sets from one batch before it could execute any other batch on that connection.SQL Server 2005 introduced a new connection attribute that allows applications to have more than one pending request per connection, and in particular, to have more than one active default result set per connection.

MARS upraszcza projektowanie aplikacji następujące nowe możliwości:

  • Aplikacje mogą mieć wiele domyślnych wynik ustawia otwartej i można je odczytać interleave.

  • Aplikacje można wykonać inne instrukcje (na przykład, INSERT, UPDATE, DELETE i procedura składowana wywołuje) podczas domyślne zestawy wyników są otwarte.

Aplikacje używające MARS znajdzie korzystne następujących wytycznych:

  • Domyślne zestawy wyniki należy używać zestawów wyniki krótki lived lub krótkie generowane przez pojedyncze instrukcje SQL (Wybierz, DML z WYJŚCIOWEGO, ODBIERANIE, CZYTANIE tekstu itd.).

  • Kursory serwera należy używać dla już lived lub dużych zestawów wyników generowanych przez pojedyncze instrukcje SQL.

  • Zawsze odczytać końcowych wyników dla żądań proceduralne, niezależnie od tego, czy wyniki ich zwrotu lub nie i instancje zwracać wiele wyników.

  • W miarę możliwości używać wywołania interfejsu API do zmiany właściwości połączenia i zarządzanie transakcjami w Transact-SQL instrukcji.

  • W MARS o zakresie sesja personifikacji jest zabronione podczas wykonywania jednoczesnych instancje.

Ostrzeżenie

Domyślnie funkcja MARS nie jest włączona.Aby użyć MARS podczas łączenia się z SQL Server z SQL Server Native Client, możesz go specjalnie włączyć w parametry połączenia ciąg.Aby uzyskać więcej informacji, zobacz SQL Server macierzystego klienta dostawca OLE DB i SQL Server sekcje sterownika ODBC macierzystym klienta, w dalszej części tego tematu.

SQL Server Native Client nie ogranicza liczbę instrukcji aktywnego połączenia z.

Typowe aplikacje, których nie trzeba mieć więcej niż jednej partia z wieloma instrukcjami lub wykonywanie procedura składowana w tym samym czas korzyści z MARS bez konieczności zrozumienie sposobu implementacji MARS.Jednak aplikacje z bardziej złożone wymagania muszą uwzględnić ten.

MARS umożliwia przeplotem wykonanie wielu żądań w ramach jednego połączenia.Oznacza to, że pozwala uruchomić zadanie partia i w jego realizacji pozwala wykonać inne żądania.Należy jednak zauważyć, że MARS jest zdefiniowana z przeplotem w warunkach wykonywanie równoległe.

Infrastruktura MARS umożliwia instancje wielokrotne wykonywanie w sposób z przeplotem, chociaż wykonać mogły być włączane tylko w miejscach dobrze zdefiniowany.Ponadto większość instrukcji należy uruchomić atomically w partia.Sprawozdania, które zwraca wierszy do klient są czasami nazywane plon punktów, mogą interleave wykonanie przed zakończeniem, gdy wiersze są wysyłane do klient, na przykład:

  • WYBIERZ

  • FETCH

  • ODBIERANIE

Mogą być przełączane innych sprawozdań, które są wykonywane jako część procedura składowana lub partia musi być uruchomiony zakończenia przed wykonaniem innych żądań MARS.

Dokładny sposób, w którym instancje interleave wykonanie ma wpływ wiele czynników i trudno przewidzieć dokładna kolejność, w której zostanie wykonana poleceń z wielu partii zawierających plon punktów.Należy zachować ostrożność uniknąć niepożądanych efektów ubocznych z przeplotem wykonanie takich złożonych instancje.

Uniknąć problemów za pomocą wywołania interfejsu API zamiast Transact-SQL instrukcja, aby zarządzać transakcje (rozpocząć transakcji, COMMIT, ROLLBACK) i stan połączenia (zestaw użycia) z wyłączeniem tych oświadczeń w złożonych z wielu instrukcja partie zawierające punkty rentowność i szeregowania wykonanie takiej partii przy wykorzystaniu lub anulowanie wszystkich wyniki.

Ostrzeżenie

Wsadowego lub procedura składowana, która rozpoczyna się ręcznie lub transakcja niejawna po włączeniu MARS musi sfinalizować transakcję, zanim partia opuszcza.Jeśli nie, SQL Server wycofuje wszystkie zmiany dokonane przez transakcji po zakończeniu partia.Taka transakcja jest zarządzany przez SQL Server jako transakcja zakresu partia.Jest to nowy typ transakcji wprowadzonych w SQL Server 2005 włączyć dobrze działające istniejących procedur przechowywanych używanych podczas MARS jest włączona.Aby uzyskać więcej informacji o zakresie partia transakcji, zobacz Transakcja instrukcji (Transact-SQL) i Kontrolowanie transakcji (aparat bazy danych).

Na przykład za pomocą serwera MARS z obiektów ADO, zobacz Przy użyciu programu SQL Server Native Client ADO.

Dostawca OLE DB programu SQL Server Native Client

SQL Server Macierzystego klienta dostawca OLE DB MARS obsługuje przez dodanie danych SSPROP_INIT_MARSCONNECTION źródło właściwość inicjujące, który zaimplementowano w zestaw właściwość DBPROPSET_SQLSERVERDBINIT.Ponadto nowe połączenie ciąg słowa kluczowego, MarsConn, jak został dodany.Przyjmuje true lub false wartości; falsejest wartością domyślną.

Dane źródło domyślne właściwość DBPROP_MULTIPLECONNECTIONS wartość inna niż VARIANT_TRUE.Oznacza to, że dostawca będzie zduplikować wiele połączeń w celu zapewnienia obsługi wielu jednoczesnych polecenia i obiektów zestawu zestaw wierszy.Po włączeniu MARS SQL Server Native Client może obsługiwać wiele obiektów polecenia i zestaw wierszy na jedno połączenie, więc MULTIPLE_CONNECTIONS jest ustawiona na VARIANT_FALSE domyślnie

Aby uzyskać więcej informacji dotyczących ulepszeń wprowadzonych do zestaw właściwość DBPROPSET_SQLSERVERDBINIT, zobacz Inicjowanie i właściwości autoryzacji.

Przykład dostawcy OLE DB programu SQL Server Native Client

W tym przykładzie dane obiekt źródłowy jest tworzona za pomocą SQL Server macierzystego dostawca OLE DB i MARS jest włączone za pomocą właściwość DBPROPSET_SQLSERVERDBINIT ustawiona przed utworzeniem obiektu sesja.

#include <sqlncli.h>

IDBInitialize *pIDBInitialize = NULL;
IDBCreateSession *pIDBCreateSession = NULL;
IDBProperties *pIDBProperties = NULL;

// Create the data source object.
hr = CoCreateInstance(CLSID_SQLNCLI10, NULL,
   CLSCTX_INPROC_SERVER,
   IID_IDBInitialize, 
    (void**)&pIDBInitialize);

hr = pIDBInitialize->QueryInterface(IID_IDBProperties, (void**)&pIDBProperties);

// Set the MARS property.
DBPROP rgPropMARS;

// The following is necessary since MARS is off by default.
rgPropMARS.dwPropertyID = SSPROP_INIT_MARSCONNECTION;
rgPropMARS.dwOptions = DBPROPOPTIONS_REQUIRED;
rgPropMARS.dwStatus = DBPROPSTATUS_OK;
rgPropMARS.colid = DB_NULLID;
V_VT(&(rgPropMARS.vValue)) = VT_BOOL;
V_BOOL(&(rgPropMARS.vValue)) = VARIANT_TRUE;

// Create the structure containing the properties.
DBPROPSET PropSet;
PropSet.rgProperties = &rgPropMARS;
PropSet.cProperties = 1;
PropSet.guidPropertySet = DBPROPSET_SQLSERVERDBINIT;

// Get an IDBProperties pointer and set the initialization properties.
pIDBProperties->SetProperties(1, &PropSet);
pIDBProperties->Release();

// Initialize the data source object.
hr = pIDBInitialize->Initialize();

//Create a session object from a data source object.
IOpenRowset * pIOpenRowset = NULL;
hr = IDBInitialize->QueryInterface(IID_IDBCreateSession, (void**)&pIDBCreateSession));
hr = pIDBCreateSession->CreateSession(
   NULL,             // pUnkOuter
   IID_IOpenRowset,  // riid
  &pIOpenRowset ));  // ppSession

// Create a rowset with a firehose mode cursor.
IRowset *pIRowset = NULL;
DBPROP rgRowsetProperties[2];

// To get a firehose mode cursor request a 
// forward only read only rowset.
rgRowsetProperties[0].dwPropertyID = DBPROP_IRowsetLocate;
rgRowsetProperties[0].dwOptions = DBPROPOPTIONS_REQUIRED;
rgRowsetProperties[0].dwStatus = DBPROPSTATUS_OK;
rgRowsetProperties[0].colid = DB_NULLID;
VariantInit(&(rgRowsetProperties[0].vValue));
rgRowsetProperties[0].vValue.vt = VARIANT_BOOL;
rgRowsetProperties[0].vValue.boolVal = VARIANT_FALSE;

rgRowsetProperties[1].dwPropertyID = DBPROP_IRowsetChange;
rgRowsetProperties[1].dwOptions = DBPROPOPTIONS_REQUIRED;
rgRowsetProperties[1].dwStatus = DBPROPSTATUS_OK;
rgRowsetProperties[1].colid = DB_NULLID;
VariantInit(&(rgRowsetProperties[1].vValue));
rgRowsetProperties[1].vValue.vt = VARIANT_BOOL;
rgRowsetProperties[1].vValue.boolVal = VARIANT_FALSE;

DBPROPSET rgRowsetPropSet[1];
rgRowsetPropSet[0].rgProperties = rgRowsetProperties
rgRowsetPropSet[0].cProperties = 2
rgRowsetPropSet[0].guidPropertySet = DBPROPSET_ROWSET;

hr = pIOpenRowset->OpenRowset (NULL,
   &TableID,
   NULL,
   IID_IRowset,
   1,
   rgRowsetPropSet
   (IUnknown**)&pIRowset);

Sterownik ODBC macierzystym klienta SQL Server

SQL Server Sterownik ODBC Klient macierzysty obsługuje MARS przez dodatki do Procedura SQLSetConnectAttr i SQLGetConnectAttr funkcji.SQL_COPT_SS_MARS_ENABLED został dodany do akceptowania SQL_MARS_ENABLED_YES lub SQL_MARS_ENABLED_NO z SQL_MARS_ENABLED_NO są domyślnie.Ponadto nowe połączenie ciąg słowa kluczowego, Mars_Connection, jak został dodany.Akceptuje, "tak" lub "no" wartości; "nie" jest wartością domyślną.

SQL Server macierzystym klienta ODBC sterownika przykład

W tym przykładzie Procedura SQLSetConnectAttr funkcja jest używana do włączania MARS przed wywoływaniem SQLDriverConnect funkcji do łączenia się z bazą danych.Po ustanowieniu połączenia, dwa SQLExecDirect funkcje są wywoływane utworzyć dwa osobne zbiory dla połączenia.

#include <sqlncli.h>

SQLSetConnectAttr(hdbc, SQL_COPT_SS_MARS_ENABLED, SQL_MARS_ENABLED_YES, SQL_IS_UINTEGER);
SQLDriverConnect(hdbc, hwnd, 
   "DRIVER=SQL Server Native Client 10.0;
   SERVER=(local);trusted_connection=yes;", SQL_NTS, szOutConn, 
   MAX_CONN_OUT, &cbOutConn, SQL_DRIVER_COMPLETE);

SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt1);
SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt2);

// The 2nd execute would have failed with connection busy error if
// MARS were not enabled.
SQLExecDirect(hstmt1, L”SELECT * FROM Authors”, SQL_NTS);
SQLExecDirect(hstmt2, L”SELECT * FROM Titles”, SQL_NTS);

// Result set processing can interleave.
SQLFetch(hstmt1);
SQLFetch(hstmt2);