Udostępnij za pośrednictwem


Za pomocą wielu wyników Active ustawia (MARS)

SQL Server 2005 wprowadzone pomocy technicznej dla wielu aktywnych wynik ustawia (MARS) w aplikacji, dostęp do Database Engine. We wcześniejszych wersjach SQL Server, aplikacje baz danych nie może zachować wielokrotne instrukcje aktywne na połączeniu. 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.

Usługa MARS upraszcza projektowanie aplikacji z następujące nowe funkcje:

  • Aplikacje mogą mieć wiele domyślnych wynik ustawia otwarty i może przeplot odczytu z nich.

  • Aplikacje mogą wykonać inne instrukcje (na przykład, INSERT, UPDATE, DELETE, a procedura przechowywana wywołań) w czasie, gdy domyślne zestawy wyników są otwarte.

Aplikacji za pomocą serwera MARS znajdują się następujące wytyczne odsetek:

  • Domyślne zestawy wyniki należy używać zestawów wyniki krótko lived lub krótkie generowane przez pojedyncze instrukcje SQL (SELECT, DML OUTPUT, przyjęcie, odczytu tekst i tak dalej).

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

  • Zawsze odczytać koniec wyniki procedurach żądania niezależnie od tego, czy zwracały wyników lub nie i instancji, które zwracają wiele wyników.

  • Tam, gdzie jest to możliwe, użyj wywołania interfejsu API, aby zmienić właściwości połączenia i zarządzania transakcjami modeli do Transact-SQL instrukcje.

  • MARS o zakresie sesja personifikacji jest zabronione uruchomionych jednocześnie instancje.

Uwaga

Domyślnie funkcja MARS nie jest włączona.Aby podczas łączenia się za pomocą serwera MARS SQL Server z SQL Server Macierzysty klient, należy w szczególności go włączyć w ciąg połączenia. Aby uzyskać więcej informacji, zobacz temat SQL Server Macierzystego dostawca klient OLE DB i SQL Server Macierzysta klient ODBC sterownika sekcje, w dalszej części tego tematu.

SQL Server Klient macierzystego nie ogranicza liczbę aktywnych instrukcje dla połączenia.

Typowe aplikacje, które nie muszą mieć więcej niż jednej partia z wieloma instrukcjami lub wykonywanie procedura przechowywana w tym samym czasie będą korzystać z serwera MARS bez konieczności zrozumieć sposób implementacji MARS.Aplikacje z wymaganiami bardziej złożone są jednak trzeba wziąć to pod uwagę.

Usługa MARS umożliwia przełożone wykonanie wielu żądań w ramach jednego połączenia.Oznacza to pozwala uruchomić zadanie partia, a w jego realizacji pozwala innych żądań do wykonać.Należy jednak zauważyć, że Usługa MARS jest zdefiniowana z przeplotem nie chodzi o wykonywanie równoległe.

Infrastruktura MARS umożliwia instancje wielokrotne wykonać w sposób przełożone, chociaż wykonywania mogą być przełączane tylko w dobrze zdefiniowanych miejscach.Ponadto większość instrukcji należy uruchomić atomically w obrębie serii.Instrukcje, które zwraca do klient, które są czasami określane jako wiersze rentowność punktów, mogą się przeplot wykonanie przed zakończeniem, podczas gdy wiersze są wysyłane do klient, na przykład:

  • WYBIERZ OPCJĘ

  • instance_name

  • ODBIERANIE

Inne instrukcje, które są wykonywane jako część procedura przechowywana lub partia muszą być uruchamiane wykonania przed wykonaniem mogą być przełączane do innych żądań MARS.

Dokładne sposób, w których instancje przeplot wykonania wpływają szeregu czynników i trudno przewidzieć dokładna kolejność, w którym będzie wykonywany poleceń z instancje wielokrotne, zawierające punkty produktywności.Należy uważać, aby uniknąć niepożądanych efektów ubocznych ze względu na wykonanie przełożone takie złożone partii.

Unikanie problemów za pomocą wywołania interfejsu API zamiast Transact-SQL instrukcje do zarządzania transakcje (BEGIN TRAN zatwierdzanie, ROLLBACK) i stan połączenia (zestaw, USE), z wyłączeniem tych instrukcja multi-instrukcja instancje, które zawierają też punkty wydajności i szeregowania wykonywanie takich partii używające lub anulowanie wszystkich wyniki.

Uwaga

Wsadowego lub procedura przechowywana, które transakcji ręcznej lub niejawne jest uruchamiany po włączeniu MARS musi wykonać transakcji przed zamyka partia.Jeśli nie, SQL Server wszystkie zmiany wprowadzone przez transakcję toczy się ponownie po partia zakończenie. Zarządza takich transakcji SQL Server jak transakcja o zakresie partia. Jest to nowy typ transakcji wprowadzonych w SQL Server 2005 Aby włączyć istniejące procedury przechowywane well-behaved ma być używany, gdy jest włączona usługa MARS. Aby uzyskać więcej informacji na temat transakcji wsadowych o zakresie zobacz Transactions (Transact-SQL) i Kontrola transakcji (aparat bazy danych).

Przykład za pomocą serwera MARS z obiektów ADO można znaleźć w temacie Używanie obiektów ADO z SQL Server Native klient.

Dostawca OLE DB programu SQL Server Native Client

The SQL Server Native klient OLE DB dostawca supports MARS through the addition of the SSPROP_INIT_MARSCONNECTION data urządzenie źródłowe initialization właściwość, which is implemented in the DBPROPSET_SQLSERVERDBINIT właściwość zestaw. Ponadto, w nowym kluczowym ciąg połączenia, MarsConn, jak zostały dodane. Akceptuje true lub false wartości; false jest to wartość domyślna.

Domyślnie właściwość DBPROP_MULTIPLECONNECTIONS VARIANT_TRUE urządzenie źródłowe danych.Oznacza to, że dostawca będzie uruchomić wiele połączeń w celu obsługi wielu jednoczesnych polecenia i obiekty zestawu zestaw wierszy.Po włączeniu MARS SQL Server Macierzysta klient może obsługiwać wiele zestaw wierszy i polecenia zestaw obiektów na jedno połączenie, dzięki czemu jest MULTIPLE_CONNECTIONS zestaw do VARIANT_FALSE domyślnie.

Aby uzyskać więcej informacji na temat rozszerzeń do DBPROPSET_SQLSERVERDBINIT zestaw właściwość Zobacz Inicjowanie i właściwości autoryzacja.

Przykład dostawca OLE DB programu SQL Server Native klient

W tym przykładzie obiekt urządzenie źródłowe danych jest tworzone przy użyciu SQL Server Macierzystego dostawca OLE DB i MARS jest włączona, przy użyciu właściwość DBPROPSET_SQLSERVERDBINIT ustawić 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);

Program SQL Server macierzysty sterownik ODBC klient

The SQL Server Native klient ODBC driver supports MARS through additions to the SQLSetConnectAttr and SQLGetConnectAttr functions.SQL_COPT_SS_MARS_ENABLED został dodany do akceptowania SQL_MARS_ENABLED_YES lub SQL_MARS_ENABLED_NO z SQL_MARS_ENABLED_NO jest wartością domyślną.Ponadto, w nowym kluczowym ciąg połączenia, Mars_Connection, jak zostały dodane. Przyjmuje "tak" lub "nie", "no" jest wartością domyślną.

SQL Server Native klient ODBC sterownika przykład

W tym przykładzie SQLSetConnectAttr Umożliwia programowi MARS przed wywołaniem funkcjaSQLDriverConnect funkcja do łączenia się z bazą danych.Po ustanowieniu połączenia, dwa SQLExecDirect funkcje są wywoływane do utworzenia dwóch oddzielnych 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);