Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
In diesem Beispiel wird die eigenschaft Mode verwendet, um eine exklusive Verbindung zu öffnen, und die IsolationLevel Eigenschaft, um eine Transaktion zu öffnen, die isoliert von anderen Transaktionen ausgeführt wird.
Beispiel
// BeginIsolationLevelCpp.cpp
// compile with: /EHsc
#import "msado15.dll" no_namespace rename("EOF","EndOfFile")
#include <ole2.h>
#include <stdio.h>
#include <conio.h>
#include "icrsint.h"
// This class extracts titles and type from Title table
class CTitleRs : public CADORecordBinding {
BEGIN_ADO_BINDING(CTitleRs)
// Column title is the 2nd field in the table
ADO_VARIABLE_LENGTH_ENTRY2(2, adVarChar, m_szau_Title, sizeof(m_szau_Title), lau_TitleStatus, FALSE)
// Column type is the 3rd field in the table
ADO_VARIABLE_LENGTH_ENTRY2(3, adVarChar, m_szau_Type, sizeof(m_szau_Type), lau_TypeStatus, TRUE)
END_ADO_BINDING()
public:
CHAR m_szau_Title[81];
ULONG lau_TitleStatus;
CHAR m_szau_Type[13];
ULONG lau_TypeStatus;
};
// Function Declarations
inline void TESTHR(HRESULT x) { if FAILED(x) _com_issue_error(x); };
void IsolationLevelX();
void PrintProviderError(_ConnectionPtr pConnection);
void PrintComError(_com_error &e);
int main() {
if (FAILED(::CoInitialize(NULL)))
return -1;
IsolationLevelX();
::CoUninitialize();
}
void IsolationLevelX() {
// Define ADO ObjectPointers. Initialize Pointers on define. These are in the ADODB :: namespace.
_RecordsetPtr pRstTitles = NULL;
_ConnectionPtr pConnection = NULL;
// Define other Variables
HRESULT hr = S_OK;
IADORecordBinding *picRs = NULL; // Interface Pointer Declared
CTitleRs titlers; // C++ Class Object
LPSTR p_TempStr = NULL;
char * token1;
// Assign Connection String to Variable
_bstr_t strCnn("Provider='sqloledb'; Data Source='My_Data_Source'; Initial Catalog='pubs'; Integrated Security='SSPI';");
try {
// Open Connection and Titles Table
TESTHR(pConnection.CreateInstance(__uuidof(Connection)));
pConnection->Mode = adModeShareExclusive;
pConnection->IsolationLevel = adXactIsolated;
pConnection->Open(strCnn,"", "", adConnectUnspecified);
TESTHR(pRstTitles.CreateInstance(__uuidof(Recordset)));
pRstTitles->CursorType = adOpenDynamic;
pRstTitles->LockType = adLockPessimistic;
pRstTitles->Open("titles", _variant_t((IDispatch*) pConnection, true),
adOpenDynamic, adLockPessimistic, adCmdTable);
pConnection->BeginTrans();
// Display Connection Mode
if (pConnection->Mode == adModeShareExclusive)
printf("Connection Mode Is Exclusive");
else
printf("Connection Mode Is Not Exclusive");
// Display Isolation Level
if (pConnection->IsolationLevel == adXactIsolated)
printf("\nTransaction is Isolated\n");
else
printf("\nTransaction is not Isolated\n");
// Open an IADORecordBinding interface pointer which we will use for binding Recordset to a class.
TESTHR(pRstTitles->QueryInterface( __uuidof(IADORecordBinding), (LPVOID*)&picRs));
// Bind the Recordset to a C++ class here
TESTHR(picRs->BindToRecordset(&titlers));
// Change the type of psychology titles.
p_TempStr = (LPSTR) malloc(sizeof(titlers.m_szau_Type));
while (!(pRstTitles->EndOfFile)) {
// Set the final character of the destination string to NULL.
p_TempStr[sizeof(titlers.m_szau_Type) - 1] = '\0';
// The source string will get truncated if its length is
// longer than the length of the destination string minus one.
strncpy_s(p_TempStr, sizeof(titlers.m_szau_Type), strtok_s(titlers.m_szau_Type, " ", &token1), sizeof(titlers.m_szau_Type) - 1);
// Compare type with psychology
if (!strcmp(p_TempStr,"psychology")) {
// Set the final character of the destination string to NULL.
titlers.m_szau_Type[sizeof(titlers.m_szau_Type) - 1] = '\0';
// Copy "self_help" title field. The source string will get truncated if its length is
// longer than the length of the destination string minus one.
strncpy_s(titlers.m_szau_Type, sizeof(titlers.m_szau_Type), "self_help", sizeof(titlers.m_szau_Type) - 1);
picRs->Update(&titlers);
}
pRstTitles->MoveNext();
}
// Print current data in recordset.
pRstTitles->Requery(adOptionUnspecified);
// Open again IADORecordBinding interface pointer for Binding
// Recordset to a class.
TESTHR(pRstTitles->QueryInterface(__uuidof(IADORecordBinding), (LPVOID*)&picRs));
// ReBinding the Recordset to a C++ Class
TESTHR(picRs->BindToRecordset(&titlers));
// Move to the first record of the title table
pRstTitles->MoveFirst();
// Clear the screen for the next display
// system("cls");
while (!pRstTitles->EndOfFile) {
printf("%s - %s\n",titlers.lau_TitleStatus == adFldOK ?
titlers.m_szau_Title :"<NULL>",
titlers.lau_TypeStatus == adFldOK ?
titlers.m_szau_Type :"<NULL>");
pRstTitles->MoveNext();
}
}
catch(_com_error &e) {
// Notify the user of errors if any.
PrintProviderError(pConnection);
PrintComError(e);
}
// Clean up objects before exit. Release the IADORecordset Interface here.
if (picRs)
picRs->Release();
if (pRstTitles)
if (pRstTitles->State == adStateOpen)
pRstTitles->Close();
if (pConnection)
if (pConnection->State == adStateOpen) {
// Restore Original Data
pConnection->RollbackTrans();
pConnection->Close();
}
// Deallocate the memory
if (p_TempStr)
free(p_TempStr);
}
void PrintProviderError(_ConnectionPtr pConnection) {
// Print Provider Errors from Connection object
// pErr is a record object in the Connection's Error collection
ErrorPtr pErr = NULL;
if ((pConnection->Errors->Count)>0) {
long nCount = pConnection->Errors->Count;
// Collection ranges from 0 to nCount-1
for (long i = 0 ; i < nCount ; i++) {
pErr = pConnection->Errors->GetItem(i);
printf("\t Error Number :%x \t %s",pErr->Number, (LPCSTR) pErr->Description);
}
}
}
void PrintComError(_com_error &e) {
_bstr_t bstrSource(e.Source());
_bstr_t bstrDescription(e.Description());
// Print Com errors.
printf("Error\n");
printf("\tCode = %08lx\n", e.Error());
printf("\tCode meaning = %s\n", e.ErrorMessage());
printf("\tSource = %s\n", (LPCSTR) bstrSource);
printf("\tDescription = %s\n", (LPCSTR) bstrDescription);
}
Verbindungsmodus ist exklusiv
Transaktion ist isoliert
Der Datenbankleitfaden des Beschäftigt-Executive - Geschäfts-
Kochen mit Computern: Surreptitious Balance Sheets - Business
Sie können Computerstress bekämpfen! -Geschäft
gerade über Computer sprechen - Geschäfts-
Silicon Valley Gastronomische Leckereien - mod_cook
Die Gourmet-Mikrowelle - mod_cook
Die Psychologie des Computerkochens - UNDECIDED
Aber ist es benutzerfreundlich? - popular_comp
Geheimnisse des Silicon Valley - popular_comp
Net-Etikette - popular_comp
Computer phobische UND nicht phobische Individuen: Verhaltensvariationen - self_help
Ist Ärger der Feind? - self_help
Leben ohne Angst - self_help
verlängerte Datenbenachteiligung: Vier Fallstudien - self_help
emotionale Sicherheit: Ein neuer Algorithmus - self_help
Zwiebeln, Leeks und Knoblauch: Kochgeheimnisse des Mittelmeers - trad_cook
Fünfzig Jahre in Buckingham Palace Kitchens - trad_cook
Sushi, jeder? - trad_cook