Datenprogrammierung mit Access 2010

Office 2010

Zusammenfassung:  In diesem Artikel wird beschrieben, wie Sie mithilfe von Microsoft Office Access 2007 oder Microsoft Access 2010 systemeigenen (C, C++, Java, VBA) oder verwalteten (C#, Visual Basic.NET) Datenzugriffscode entwickeln. Hier erfahren Sie mehr über die Access-Architektur, das Access-Datenbankmodul und Datenanbieter, 32-Bit- und 64-Bit-Plattformen und zu den Aspekten, die Sie bei der Auswahl einer optimalen Datenzugriffstechnologie für ein neues Datenbankprojekt oder für ein mit einer Vorversion erstelltes Datenbankprojekt beachten sollten.

Gilt für:  Microsoft Access 2010 | Microsoft Office Access 2007
Veröffentlichung:  September 2010
Von:  Aleksandar Jakšic, Microsoft Corporation

Inhalte

Klicken Sie hier, um den Code abzurufen  Code herunterladen

Übersicht

In diesem technischen Artikel werden die zahlreichen Möglichkeiten der Programmierbarkeit des Datenzugriffs von Access 2007 und Access 2010 untersucht. Außerdem wird das Microsoft Access-Datenbankmodul vorgestellt. Dieser Artikel richtet sich an Datenbankentwickler, die mehr über die Optionen wissen möchten, die beim Entwickeln einer Datenzugriffslösung für Access-Datenbanken zur Verfügung stehen. In diesem Artikel wird nicht auf jede nachfolgend erwähnte Datenzugriffsschnittstelle detailliert eingegangen. Stattdessen erhalten Sie einen Architekturüberblick über das Access-Datenbankmodul, damit Sie sich mit dem Programmiermodell vertraut machen können, in dem das Access-Datenbankmodul ausgeführt wird. Der begleitende Beispielcode liegt sowohl in systemeigenen Sprachen (C, C++, Java und VBA) als auch .NET Framework-Sprachen (C# und Visual Basic.NET) vor und soll Sie bei den ersten Schritten unterstützen, auch wenn Sie noch nie zuvor in diesen Sprachen programmiert haben.

Dieser technische Artikel bietet Antworten auf Fragen wie die folgenden:

  • Funktioniert meine 32-Bit-Anwendung aus der Vorversion mit 64-Bit-Access-Software?

  • Welches ist allgemein die schnellste Möglichkeit, mit Access-Datenbanken programmgesteuert zu arbeiten?

  • Gibt es eine Möglichkeit, eine Verbindung mit dem Access-Datenbankmodul mithilfe der Programmiersprache C (ANSI/ISO-C) oder sogar mit Java herzustellen?

  • Funktioniert mein MFC-DAO-Code (Microsoft Foundation Classes, Data Access Object) der Vorversion mit ACCDB-Datenbanken?

Codebeispiele

In diesem technische Artikel werden neun vollständige Programme vorgestellt, die mit Microsoft Visual Studio 2008 erstellt wurden und zum Herunterladen bereitstehen.

In allen Codebeispielen werden dieselben Datenzugriffsalgorithmen mithilfe verschiedener Programmiersprachen und Datenzugriffstechnologien wie DAO, OLE DB, ADO.NET, ADO, ODBC und JDBC ausgeführt. Die Konsolenausgabe jedes Programms ist nahezu identisch. In den Beispielen wird die Hauptprogrammierungsfunktionalität für den Datenzugriff veranschaulicht, z. B. das Erstellen einer Verbindungszeichenfolge mit einem sicheren Kennwort zum Entschlüsseln einer Datenbank, das Verbinden mit einer verschlüsselten Datenbank, das Erstellen und Ausführen einer SQL-Abfrage, das Arbeiten mit einem Schema und Recordset sowie das Abrufen sortierter Daten.

Da das Access-Datenbankmodul nicht zum Windows-Betriebssystem gehört, müssen Sie es samt seinen Datenanbietern lokal auf dem Computer installieren. Weitere Informationen finden Sie unter Wie erhalte ich das Access-Datenbankmodul?.

Dieser technische Artikel enthält auch Leistungsdaten für alle in den Codebeispielen enthaltenen Datenanbieter.

Zielgruppe dieses technischen Artikels

Die Thematik der Datenzugriffstechnologien ist umfassend, und da sich diese Anleitung an eine größere Zielgruppe von Entwicklern richtet, können Entwickler, die auf Geschäftslogik- oder Anwendungsebene mit Access-Daten arbeiten, von diesen Informationen profitieren. Dieser Artikel wendet sich jedoch auch an IT-Fachleute, Studenten oder andere, die sich ggf. in hohem Maß für die allgemeine Datenbankprogrammierung interessieren.

Es wird vorausgesetzt, dass Sie mit der Visual Studio-Umgebung, den Grundlagen der Programmierung (strukturell und .NET Framework) sowie mit relationalen Datenbanken und SQL vertraut sind. Außerdem wird vorausgesetzt, dass Sie sich gut mit dem Erstellen von Tabellen und Abfragen in beliebigen früheren Microsoft Access-Versionen auskennen.

Ff965871.note(de-de,office.14).gifHinweis:

Bei Bezugnahme auf Microsoft Access in diesem Dokument ohne Angabe einer bestimmten Version (z. B. Microsoft Access 2003) gelten die Informationen sowohl für Microsoft Office Access 2007 als auch für Microsoft Access 2010.

Architektur des Microsoft Access-Datenbankmoduls

Abbildung 1 veranschaulicht, wie Access (Benutzeroberfläche) und das Datenbankmodul ein vollständiges Datenbank-Managementsystem (DBMS) bilden.



Abbildung 1. Konzeptuelle Übersicht zu Access 2010

Konzeptionelles Diagramm auf hoher Ebene von Access 2010

Die Access-Benutzeroberfläche einerseits ermöglicht Benutzern das Anzeigen, Bearbeiten und Nutzen von Daten über Formulare, Berichte, Abfragen, Makros, Assistenten usw. Das Microsoft Access-Datenbankmodul andererseits stellt die folgenden wichtigen Datenbank-Managementdienste zur Verfügung:

  • Datenspeicher – Dient Benutzern zum Speichern von Daten im Dateisystem.

  • Datendefinition – Benutzer können Strukturen zum Aufnehmen von Daten, z. B. Tabellen und Felder, erstellen, ändern und löschen.

  • Datenintegrität – Benutzer können relationale Regeln durchsetzen, die Datenbeschädigungen verhindern.

  • Datenbearbeitung – Benutzer können Daten hinzufügen, bearbeiten und löschen.

  • Datenabruf –Benutzer können über SQL-Befehle Daten aus dem System abrufen.

  • Datenverschlüsselung – Benutzer können Daten vor unbefugter Nutzung schützen.

  • Datenfreigabe – Benutzer können Daten in einer Netzwerkumgebung für viele andere Benutzer freigeben.

  • Datenveröffentlichung – Benutzer können in einer webbasierten Client- oder Serverumgebung arbeiten.

  • Datenimport, -export und -verknüpfung – Benutzer können mit Daten aus verschiedenen Quellen arbeiten.

Aus Datenzugriffsperspektive können Sie Access als Medium betrachten, mit dem das Access-Datenbankmodul den Benutzern grafisch dargestellt wird.

Wie erhalte ich das Access-Datenbankmodul?

Zum Ausführen der Codebeispiele in diesem technischen Artikel muss das Access-Datenbankmodul auf Ihrem Computer vorhanden sein, was bedeutet, dass Sie eine der folgenden Access 2010-Versionen (oder Office Access 2007) auf installieren müssen:

Ff965871.note(de-de,office.14).gifHinweis:

Die Treiber für das Datenbankmodul von Microsoft Access 2007 und 2010 werden veröffentlicht, um Lösungsentwicklern das Erstellen von Tools zum Lesen und Schreiben von Office-Dateien in den Formaten ACCDB, XLSX und XLSB zu ermöglichen. Lösungsentwickler können mithilfe des Treibers einen Server (z. B. SQL) zum Lesen und Schreiben von Office-Dateiformaten einrichten, ohne dass Office auf dem Server installiert werden muss. Dieser Treiber wird allerdings nicht für die Verwendung als eigenständiger Datenspeicher lizenziert.

Wie ist der Stand beim Microsoft JET-Modul?

Vor Access 2007 hat Access mit dem Microsoft JET-Modul (Joint Engine Technology) gearbeitet. Auch wenn JET allgemein als Teil von Access gesehen wurde, war das JET-Modul ein eigenes Produkt. Ab der Markteinführung von Microsoft Windows 2000 war JET Teil des Windows-Betriebssystems und wurde mit den Microsoft Data Access Components (MDAC) verteilt bzw. aktualisiert. Doch ab Access 2007 wurde das veraltete JET-Modul nicht mehr mit den MDAC verteilt. Access arbeitet stattdessen nun mit dem integrierten und optimierten Access-Datenbankmodul, dessen Entwicklung mit einer Momentaufnahme des Codes der ursprünglichen JET-Codebasis begann.

Das Access-Datenbankmodul ist voll abwärtskompatibel mit früheren Versionen des JET-Moduls, sodass es MDB-Dateien aus früheren Access-Versionen lesen und schreiben kann. Da das Access-Team nun Besitzer des Moduls ist, können Entwickler sicher sein, dass ihre Access-Lösungen nicht nur auch in Zukunft funktionieren, sondern auch schneller, zuverlässiger und funktionsreicher sein werden. Beispielsweise wurde in Access 2010 (neben anderen Verbesserungen) das Access-Datenbankmodul für die Unterstützung einer 64-Bit-Version weiterentwickelt und die Integration mit SharePoint-bezogenen Technologien und Webdiensten im Allgemeinen optimiert. Microsoft engagiert sich auch künftig für Access als Entwicklerplattform.

Übersicht der Datenzugriffstechnologien

Microsoft bietet mehrere Möglichkeiten zum Arbeiten mit Access-Datenbanken. Für die Access-Programmierung werden die folgenden Datenzugriffs-APIs und -schichten verwendet:

  • DAO (Data Access Objects)

  • OLE DB (Object Linking and Embedding, Database )

  • ADO.NET

  • ADO (ActiveX Data Objects)

  • ODBC (Open Database Connectivity)

Das Access-Datenbankmodul implementiert Anbieter für die drei zuvor genannten Technologien DAO, OLE DB und ODBC. Die DAO-, OLE DB- und ODBC-Anbieter des Access-Datenbankmoduls werden mit dem Access-Produkt verteilt (eine Ausnahme bildet ADO, das noch immer zu Microsoft Windows DAC gehört). Viele andere Schnittstellen für die Programmierung des Datenzugriffs, Anbieter und Frameworks auf Systemebene, die ADO und ADO.NET enthalten, basieren auf diesen drei Access-Datenbankmodulanbietern. Abbildung 2 zeigt ein Diagramm mit einer Übersicht der Access-Komponenten.



Abbildung 2. Architektur des Access-Datenbankmoduls in der Programmierumgebung des Datenzugriffs

ACE-Architekturdiagramm

In diesem technischen Artikel werden die in der folgenden Tabelle angegebenen Datenzugriffsmethoden dokumentiert.

Tabelle 1. Datenzugriffsmethoden

Name des Anbieters Datenzugriffsmethode Verbindungsinformationen Unterstützte Sprache(n)

ACE DAO

Direktes DAO – Beispiel

Acedao.tlh (genenriert aus acedao.dll);

acedao.dll

C++

VBA DAO – Beispiel

Set db = CurrentDb()

Wird in VBE-Umgebung ausgeführt

VBA

OLE DB des Access-Datenbankmoduls

ATL OLE DB – Beispiel

Microsoft.ACE.OLEDB.12.0

<Atldbcli.h> und <Atldbsch.h>; Aceoledb.dll

C++

ADO.NET

C# ADO.NET – Beispiel

Microsoft.ACE.OLEDB.12.0

mithilfe von System.Data.OleDb

C#

Visual Basic.NET ADO.NET – Beispiel

Visual Basic.NET ADO.NET – Beispiel

Microsoft.ACE.OLEDB.12.0

Importiert System.Data.OleDb

Imports System.Console

Visual Basic.NET

ADO

ADO – Beispiel

Msado15.tlh (generiert aus Msado15.dll)

Installiert mit MDAC 2.8 oder Windows DAC 6.0.

C++

ACE ODBC

Direktes ODBC – Beispiel

Driver={Microsoft Access Driver (*.mdb, *.accdb)};DBQ=path to mdb/accdb file

<Sqlext.h>;

Aceodbc.dll;

C/C++

MFC ODBC – Beispiel

Driver={Microsoft Access Driver (*.mdb, *.accdb)};DBQ=path of mdb/accdb file

<Afxdb.h>;

Aceodbc.dll;

C++

JDBC-ODBC – Beispiel

jdbc:odbc:DRIVER=Microsoft Access Driver (*.mdb, *.accdb);DBQ= path of mdb/accdb file

Java

Weitere Informationen und eine Liste der Datenzugriffsmethoden, die mit der Veröffentlichung von Access 2007 als veraltet gelten, finden Sie unterVeraltete Datenzugriffsmethoden.

DAO

Anfänglich war DAO für Access-Entwickler die einzige Datenzugriffsmethode.

Direktes DAO – Beispiel

Diese Zugriffsmethode bietet die beste Unterstützung der neuen mit Access 2007 eingeführten Funktionen, da sie die Funktionalität des Access-Datenbankmoduls größtenteils verfügbar macht. Direktes DAO arbeitet mit Acedao.dll. Verwenden Sie zum Kompilieren dieses Codes das Makro #import zum Generieren des Headers .tlh, indem Sie eine Anweisung wie im folgenden Codebeispiel angeben.

#import <C:\\Program Files (x86)\\Common Files\\Microsoft Shared\\OFFICE14\\ACEDAO.dll>  \
    rename( "EOF", "AdoNSEOF" )

Je nachdem, ob Sie Code für ein 32-Bit- oder 64-Bit-Betriebssystem kompilieren, können Sie diesen Pfad ändern, indem Sie den Teil mit (x86) entfernen. Eine Möglichkeit ist die Überprüfung des Registrierungsschlüssels mit dem Namen Path mit dem Typ REG_SZ unter einem der folgenden Registrierungspfade:

  • HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\14.0\Access Connectivity Engine\InstallRoot

  • HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Office\14.0\Access Connectivity Engine\InstallRoot

Da eine direkte Verbindung mit dem Modul hergestellt wird, ist der Datenbankspeicherort allein für die Verbindungsinformationen ausreichend.

_bstr_t bstrConnect = "C:\\Northwind.accdb";

Im folgenden Codebeispiel werden das Schema und die Daten abgerufen.

Ff965871.note(de-de,office.14).gifHinweis:

Laden Sie für den Zugriff auf die vollständigen Beispielanwendungen den Beispielcode herunter.

// Create an instance of the engine
DAO::_DBEngine* pEngine = NULL;

// The CoCreateInstance helper function provides a convenient shortcut by connecting 
// to the class object associated with the specified CLSID, creating an 
// uninitialized instance, and releasing the class object. 
hr = CoCreateInstance(
    __uuidof(DAO::DBEngine),
    NULL,
    CLSCTX_ALL,
    IID_IDispatch,
    (LPVOID*)&pEngine);
if (SUCCEEDED(hr) && pEngine)
{
    // COM errors are handled by C++ try/catch block
    try
    {
        DAO::DatabasePtr pDbPtr = NULL;
        pDbPtr = pEngine->OpenDatabase(bstrConnect, false, false, ";PWD=1L0v3Acce55;");
        if (pDbPtr)
        {
            cout<<DAM<<": Successfully connected to database. Data source name:\n  "
                <<pDbPtr->GetName()<<endl;

            // Prepare SQL query.
            _bstr_t query = "SELECT Customers.[Company], Customers.[First Name] FROM Customers ORDER BY Customers.[Company] ASC;";
            cout<<DAM<<": SQL query:\n  "<<query<<endl;

            // Run the query and create a record set
            DAO::RecordsetPtr pRS = NULL;
            pRS = pDbPtr->OpenRecordset(query, _variant_t(DAO::dbOpenDynaset));
            if (pRS && 0 < pRS->RecordCount)
            {
                cout<<DAM<<": Retrieve schema info for the given result set: "<<endl;
                DAO::FieldsPtr pFields = NULL;
                pFields = pRS->GetFields();
                if (pFields && pFields->Count > 0)
                {
                    for (short column = 0; column < pFields->Count; column++)
                    {
                        cout<<" | "<<pFields->GetItem(column)->GetName();
                    }
                    cout<<endl;
                }
                else
                {
                    cout<<DAM<<": Error: Number of fields in the result set is 0."<<endl;
                }

                cout<<DAM<<": Fetch the actual data: "<<endl;
                // Loop through the rows in the result set
                while (!pRS->AdoNSEOF)
                {
                    for (short column = 0; column < pFields->Count; column++)
                    {
                        cout<<" | "<<_bstr_t(pFields->GetItem(column)->GetValue());
                    }
                    cout<<endl;
                    pRS->MoveNext();
                }
                cout<<DAM<<": Total Row Count: "<<pRS->RecordCount<<endl;
            }

            // Close record set and database
            pRS->Close();
            pDbPtr->Close();
            pDbPtr = NULL;
        }
        else
        {
            cout<<DAM<<": Unable to connect to data source: "<<bstrConnect<<endl;
        }
    }
    catch(_com_error& e)
    {
        cout<<DAM<<": _com_error: "<<e.ErrorMessage()<<endl;
    }
    
    pEngine->Release();
    pEngine = NULL;
    cout<<DAM<<": Cleanup. Done."<<endl;
}
else
{
    cout<<DAM<<": Cannot instantiate DBEngine object."<<endl;
}

Im folgenden Beispiel wird die Programmausgabe gezeigt.

Direct DAO: Successfully connected to database. Data source name:
  C:\Northwind.accdb
Direct DAO: SQL query:
  SELECT Customers.[Company], Customers.[First Name] FROM Customers ORDER BY Customers.[Company] ASC;
Direct DAO: Retrieve schema info for the given result set:
 | Company | First Name
Direct DAO: Fetch the actual data:
 | Company A | Anna
 | Company AA | Karen
 | Company B | Antonio
 | Company BB | Amritansh
 | Company C | Thomas
 | Company CC | Soo Jung
 | Company D | Christina
 | Company E | Martin
 | Company F | Francisco
 | Company G | Ming-Yang
 | Company H | Elizabeth
 | Company I | Sven
 | Company J | Roland
 | Company K | Peter
 | Company L | John
 | Company M | Andre
 | Company N | Carlos
 | Company O | Helena
 | Company P | Daniel
 | Company Q | Jean Philippe
 | Company R | Catherine
 | Company S | Alexander
 | Company T | George
 | Company U | Bernard
 | Company V | Luciana
 | Company W | Michael
 | Company X | Jonas
 | Company Y | John
 | Company Z | Run
Direct DAO: Total Row Count: 29
Direct DAO: Cleanup. Done.

VBA DAO – Beispiel

Der folgende Beispielcode wird in einer Access VBA/VBE-Umgebung auf die aktuelle Datenbank angewendet.

Public Sub VBADAO()
    Dim DAM As String
    Dim db As DAO.Database
    Dim rst As DAO.Recordset
    Dim query As String
        
    DAM = "VBA DAO"

    ' Open pointer to current database
    Set db = CurrentDb()
   
    Debug.Print DAM & ": Successfully connected to database. Data source name: " & _
        vbNewLine & "  " & db.Name
    
    ' Prepare SQL query
    query = "SELECT Customers.[Company], Customers.[First Name] " & _
        "FROM Customers " & _
        "ORDER BY Customers.[Company] ASC"
        
    Debug.Print DAM & ": SQL Query: " & _
        vbNewLine & "  " & query

    ' Run the query and create a record set
    Set rst = db.OpenRecordset(query)
    
    Debug.Print DAM & ": Retrieve schema info for the given result set: "
    For i = 0 To rst.Fields.Count - 1
        Debug.Print " | " & rst.Fields(i).Name
    Next i
        
    Debug.Print DAM & ": Fetch the actual data: "
    Do While Not rst.EOF
        Debug.Print " | " & rst![Company] & " | " & rst![First Name]
        rst.MoveNext
    Loop
    
    Debug.Print DAM & ": Total Row Count: " & rst.RecordCount
    Debug.Print DAM & ": Cleanup. Done. "

    rst.Close
    db.Close
End Sub

OLE DB

OLE DB ist die Microsoft-Programmierschnittstelle auf Systemebene für den Zugriff auf Daten. Es handelt sich eher um eine Spezifikation als eine Gruppe von Komponenten oder Dateien. OLE DB ist die ADO zugrunde liegende Technologie und eine Datenquelle für ADO.NET. OLE DB gibt eine Gruppe von COM-Schnittstellen an, die verschiedene DBMS-Dienste (Datenbank-Managementsystem) für Consumer kapseln. OLE DB ist ein offener Standard für den Zugriff auf alle Arten von Daten, einschließlich Access-Datenbanken. Die Technologie unterstützt Entwicklungsanforderungen, zu denen das Erstellen von Front-End-Datenbankclients und Geschäftsobjekten auf mittlerer Ebene zählen, mithilfe aktiver Verbindungen zu Daten in relationalen Datenbanken und anderen Speichern.

ATL OLE DB – Beispiel

In diesem Beispiel wird ATL (Active Template Library) durch Einbeziehen von <Atldbcli.h> und <Atldbsch.h> verwendet. Die Verbindungsinformationen arbeiten mit dem Microsoft.ACE.OLEDB.12.0-Datenanbieter, der in Aceoledb.dll implementiert ist.

LPCOLESTR lpcOleConnect = 
    L"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\\Northwind.accdb;Jet OLEDB:Database Password=1L0v3Acce55;";

Im folgenden Codebeispiel werden das Schema und die Daten abgerufen.

// To initialize the connection to a database using an OLE DB provider, 
// two ATL classes are needed: CDataSource and CSession;
CDataSource dbDataSource;
CSession dbSession;

// Uses the ATL string conversion macros to convert between character encodings
USES_CONVERSION;

// Open the connection and initialize the data source specified by the passed 
// initialization string.
hr = dbDataSource.OpenFromInitializationString(lpcOleConnect);
if (FAILED(hr))
{
    cout<<DAM<<": Unable to connect to data source "<<OLE2T(lpcOleConnect)<<endl;
}
else
{
    hr = dbSession.Open(dbDataSource);
    if (FAILED(hr))
    {
        cout<<DAM<<": Couldn't create session on data source "<<OLE2T(lpcOleConnect)<<endl;
    }
    else
    {
        CComVariant var;
        hr = dbDataSource.GetProperty(DBPROPSET_DATASOURCEINFO, DBPROP_DATASOURCENAME, &var);
        if (FAILED(hr) || (var.vt == VT_EMPTY))
        {
            cout<<DAM<<": No Data Source Name Specified."<<endl;
        }
        else
        {
            cout<<DAM<<": Successfully connected to database. Data source name:\n  "
                <<COLE2T(var.bstrVal)<<endl;
            
            // Prepare SQL query.
            LPCOLESTR query = L"SELECT Customers.[Company], Customers.[First Name] FROM Customers ORDER BY Customers.[Company] ASC;";
            cout<<DAM<<": SQL query:\n  "<<OLE2T(query)<<endl;

            // Run the query and create a record set
            CCommand<CDynamicStringAccessor> cmd;
            hr = cmd.Open(dbSession, query);
            DBORDINAL colCount = cmd.GetColumnCount();
            if (SUCCEEDED(hr) && 0 < colCount)
            {
                cout<<DAM<<": Retrieve schema info for the given result set: "<<endl;
                DBORDINAL cColumns;
                DBCOLUMNINFO* rgInfo = NULL;
                OLECHAR* pStringsBuffer = NULL;
                cmd.GetColumnInfo(&cColumns, &rgInfo, &pStringsBuffer);
                for (int col=0; col < (int)colCount; col++)
                {
                    cout<<" | "<<OLE2T(rgInfo[col].pwszName);
                }
                cout<<endl;

                cout<<DAM<<": Fetch the actual data: "<<endl;
                int rowCount = 0;
                CRowset<CDynamicStringAccessor>* pRS = (CRowset<CDynamicStringAccessor>*)&cmd;
                // Loop through the rows in the result set
                while (pRS->MoveNext() == S_OK)
                {
                    for (int col=1; col <= (int)colCount; col++)
                    {
                        CHAR* szValue = cmd.GetString(col);
                        cout<<" | "<<szValue;
                    }
                    cout<<endl;
                    rowCount++;
                }
                cout<<DAM<<": Total Row Count: "<<rowCount<<endl;
            }                   
            else
            {
                cout<<DAM<<": Error: Number of fields in the result set is 0."<<endl;
            }
        }  
    }
}

dbDataSource.Close();
dbSession.Close();

cout<<DAM<<": Cleanup. Done."<<endl;

ADO.NET

ADO.NET ermöglicht in einer von .NET verwalteten Umgebung einen einheitlichen und umfassenden Datenzugriff auf verschiedene Datenquellen. ADO.NET verwendet von .NET verwaltete Anbieter, die wiederum zugrunde liegende APIs wie OLE DB und ODBC nutzen. In diesem technischen Artikel werden zwei ADO.NET-Beispiele (C# und Visual Basic.NET) vorgestellt, die beide als Datenzugriffsschicht die zugrunde liegende OLE DB-Technologie verwenden.

C# ADO.NET – Beispiel

Es folgt ein C# ADO.NET-Codebeispiel.

// Connection string for ADO.NET via OleDB
OleDbConnection cn = 
    new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\\Northwind.accdb;Jet OLEDB:Database Password=1L0v3Acce55;");

// Prepare SQL query
string query = "SELECT Customers.[Company], Customers.[First Name] FROM Customers ORDER BY Customers.[Company] ASC;";
OleDbCommand cmd = new OleDbCommand(query, cn);

try
{
    cn.Open();
    Console.WriteLine("{0}: Successfully connected to database. Data source name:\n {1}", 
        DAM, cn.DataSource);
    Console.WriteLine("{0}: SQL query:\n {1}", DAM, query);

    // Run the query and create a record set
    OleDbDataReader dr = cmd.ExecuteReader();
    Console.WriteLine("{0}: Retrieve schema info for the given result set:", DAM);
    for (int column = 0; column < dr.FieldCount; column++)
    {
        Console.Write(" | {0}", dr.GetName(column));
    }
    Console.WriteLine("\n{0}: Fetch the actual data: ", DAM);
    int row = 0;
    while (dr.Read())
    {
        Console.WriteLine(" | {0} | {1} ", dr.GetValue(0), dr.GetValue(1));
        row++;
    }
    Console.WriteLine("{0}: Total Row Count: {1}", DAM, row);
    dr.Close();
}
catch (OleDbException ex)
{
    Console.WriteLine("{0}: OleDbException: Unable to connect or retrieve data from data source: {1}.",
        DAM, ex.ToString());
}
catch (Exception ex)
{
    Console.WriteLine("{0}: Exception: Unable to connect or retrieve data from data source: {1}.",
        DAM, ex.ToString());
}
finally
{
    cn.Close();
    Console.WriteLine("{0}: Cleanup. Done.", DAM);
}

Visual Basic.NET ADO.NET – Beispiel

Es folgt ein Visual Basic.NET-Codebeispiel.

' Connection string for ADO.NET via OleDB
Dim cn As OleDbConnection = 
    New OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\\Northwind.accdb;Jet OLEDB:Database Password=1L0v3Acce55;")
Dim cmd As OleDbCommand
Dim dr As OleDbDataReader

Try
    cn.Open()
    WriteLine(DAM + ": : Successfully connected to database. Data source name:" + ControlChars.Lf + "  " + cn.DataSource)
    ' Prepare SQL query.
    Dim query As String = "SELECT Customers.[Company], Customers.[First Name] FROM Customers ORDER BY Customers.[Company] ASC;"
    WriteLine(DAM + ": SQL Query:" + ControlChars.Lf + "  " + query)

    ' Run the query and create a record set
    cmd = New OleDbCommand(query, cn)
    dr = cmd.ExecuteReader
    WriteLine(DAM + ": Retrieve schema info for the given result set:  ")
    Dim column, row As Integer
    For column = 0 To dr.FieldCount - 1
        Write(" | " + dr.GetName(column))
    Next column
    WriteLine(ControlChars.Lf + DAM + ": Fetch the actual data:  ")
    row = 0
    While dr.Read()
        WriteLine(" | " + dr(0) + " | " + dr(1))
        row += 1
    End While
    WriteLine(DAM + ": Total Row Count: " + row.ToString())
    dr.Close()
Catch ex As OleDbException
    WriteLine(ControlChars.Lf + DAM + ": OleDbException: Unable to connect or retrieve data from data source: " + ex.Message())
Catch ex As Exception
    WriteLine(ControlChars.Lf + DAM + ": Exception: Unable to connect or retrieve data from data source: " + ex.Message())
Finally
    cn.Close()
    WriteLine(DAM + ": Cleanup. Done.")
End Try

ADO

ADO (ActiveX Data Objects) stellt OLE DB-Datenanbietern eine COM-basierte Schnittstelle auf Anwendungsebene zur Verfügung. Wenngleich ADO im Vergleich zur direkten Codierung für OLE DB Leistungsnachteile aufweist, ist die Technologie recht einfach zu erlernen und zu nutzen. ADO bietet C++-Programmierern einen Zugriff auf die zugrunde liegenden OLE DB-Schnittstellen. Die meisten Entwickler sind normalerweise nicht interessiert an einem solch niedrigen Grad der Steuerung, z. B. der Verwaltung von Arbeitsspeicherressourcen und manuellen Aggregierung von Komponenten, den OLE DB für den Datenzugriffsprozess zur Verfügung stellt.

Im Gegensatz zu DAO, das die Funktionalität eines einzelnen Datenbankmoduls zur Verfügung stellt, verwendet ADO ein allgemeines Programmiermodell für den universellen Datenzugriff.

ADO – Beispiel

ADO arbeitet mit der Bibliothek Msado15.dll, die in MDAC 2.8 oder höher enthalten ist. Verwenden Sie zum Kompilieren dieses Codes das Makro #import zum Generieren des Headers .tlh, indem Sie eine Anweisung wie im folgenden Codebeispiel angeben.

#import <C:\\Program Files\\Common Files\\System\\ado\\msado15.dll>  \
    rename( "EOF", "AdoNSEOF" )

Verwenden Sie für die Verbindungsinformationen den Microsoft.ACE.OLEDB.12.0-Datenanbieter, der in Aceoledb.dll implementiert ist.

_bstr_t bstrConnect = 
    "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\\Northwind.accdb;Jet OLEDB:Database Password=1L0v3Acce55;";

Im folgenden Codebeispiel werden das Schema und die Daten abgerufen.

// COM errors are handled by C++ try/catch block
try
{
    ADODB::_ConnectionPtr pConn("ADODB.Connection");
    hr = pConn->Open(bstrConnect, "admin", "", ADODB::adConnectUnspecified);
    if (SUCCEEDED(hr))
    {
        cout<<DAM<<": Successfully connected to database. Data source name:\n  "
           <<pConn->GetConnectionString()<<endl;

        // Prepare SQL query.
        _bstr_t query = "SELECT Customers.[Company], Customers.[First Name] FROM Customers ORDER BY Customers.[Company] ASC;";
        cout<<DAM<<": SQL query:\n  "<<query<<endl;

        // Run the query and create a record set
        ADODB::_RecordsetPtr pRS("ADODB.Recordset");
        hr = pRS->Open(query, 
                _variant_t((IDispatch *) pConn, true), 
                ADODB::adOpenUnspecified,
                ADODB::adLockUnspecified, 
                ADODB::adCmdText);
        if (SUCCEEDED(hr))
        {
            cout<<DAM<<": Retrieve schema info for the given result set: "<<endl;
            ADODB::Fields* pFields = NULL;
            hr = pRS->get_Fields(&pFields);
            if (SUCCEEDED(hr) && pFields && pFields->GetCount() > 0)
            {
                for (long nIndex=0; nIndex < pFields->GetCount(); nIndex++)
                {
                    cout<<" | "<<_bstr_t(pFields->GetItem(nIndex)->GetName());
                }
                cout<<endl;
            }
            else
            {
                cout<<DAM<<": Error: Number of fields in the result set is 0."<<endl;
            }

            cout<<DAM<<": Fetch the actual data: "<<endl;
            int rowCount = 0;
            while (!pRS->AdoNSEOF)
            {
                for (long nIndex=0; nIndex < pFields->GetCount(); nIndex++)
                {
                    cout<<" | "<<_bstr_t(pFields->GetItem(nIndex)->GetValue());
                }
                cout<<endl;
                pRS->MoveNext();
                rowCount++;
            }
            cout<<DAM<<": Total Row Count: "<<rowCount<<endl;
        }
        
        pRS->Close();
        pConn->Close();
        cout<<DAM<<": Cleanup. Done."<<endl;
    }
    else
    {
        cout<<DAM<<": Unable to connect to data source: "<<bstrConnect<<endl;
    }
}
catch(_com_error& e)
{
    cout<<DAM<<": _com_error: "<<e.Description()<<endl;
}

ODBC

ODBC (Open Database Connectivity) ist die älteste der derzeitigen Datenzugriffstechnologien von Microsoft, die das Erstellen einer allgemeinen Codebasis ermöglicht, die Zugriff auf verschiedene relationale Datenspeicher bietet. Ihre Methoden werden mithilfe einer herkömmlichen, nicht objektorientierten C ähnlichen API zur Verfügung gestellt.

Direktes ODBC – Beispiel

Diese Datenzugriffsmethode wird nur für die Verwaltung vorhandener Anwendungen oder bei Notwendigkeit der Verwendung von ANSI/ISO C empfohlen. Das folgende Codebeispiel zeigt die Verbindungsinformationen für direktes ODBC, wobei der in der Bibliothek Aceodbc.dll implementierte Treiber {Microsoft Access Driver (*.mdb, *.accdb)} durch Hinzufügen von <Sqlext.h> verwendet wird.

SQLCHAR szDSN[256] = 
    "Driver={Microsoft Access Driver (*.mdb, *.accdb)};DSN='';DBQ=C:\\Northwind.accdb;PWD=1L0v3Acce55;";

Im folgenden Codebeispiel werden das Schema und die Daten abgerufen.

HENV    hEnv;
HDBC    hDbc;

/* ODBC API return status */
SQLRETURN  rc;

SQLSMALLINT  iConnStrLength2Ptr;
SQLCHAR      szConnStrOut[255];

SQLCHAR* query = "SELECT Customers.[Company], Customers.[First Name] FROM Customers ORDER BY Customers.[Company] ASC;";

SQLCHAR         chval1[128], chval2[128], colName[128];
SQLINTEGER      ret1, ret2;

/* Number of rows and columns in result set */
SQLINTEGER      rowCount = 0;
SQLSMALLINT     fieldCount = 0, column = 0;
HSTMT           hStmt;

/* Allocate an environment handle */
rc = SQLAllocEnv(&hEnv);
/* Allocate a connection handle */
rc = SQLAllocConnect(hEnv, &hDbc);

/* Connect to the 'Northwind 2007.accdb' database */
rc = SQLDriverConnect(hDbc, NULL, szDSN,  _countof(szDSN), 
szConnStrOut, 255, &iConnStrLength2Ptr, SQL_DRIVER_NOPROMPT);
if (SQL_SUCCEEDED(rc)) 
{
    printf("%s: Successfully connected to database. Data source name: \n  %s\n", 
       DAM, szConnStrOut);

    /* Prepare SQL query */
    printf("%s: SQL query:\n  %s\n", DAM, query);

    rc = SQLAllocStmt(hDbc,&hStmt);
    rc = SQLPrepare(hStmt, query, SQL_NTS);
   
    /* Bind result set columns to the local buffers */ 
    rc = SQLBindCol(hStmt, 1, SQL_C_CHAR, chval1, 128, &ret1);
    rc = SQLBindCol(hStmt, 2, SQL_C_CHAR, chval2, 128, &ret2);
   
    /* Run the query and create a record set */
    rc = SQLExecute(hStmt); 
    if (SQL_SUCCEEDED(rc)) 
    {
        printf("%s: Retrieve schema info for the given result set:\n", DAM);
        SQLNumResultCols(hStmt, &fieldCount);
        if (fieldCount > 0)
        {
            for (column = 1; column <= fieldCount; column++)
            {
                SQLDescribeCol(hStmt, column,
                    colName, sizeof(colName), 0, 0, 0, 0, 0);
                printf(" | %s", colName);    
            }
            printf("\n");
        }
        else
        {
            printf("%s: Error: Number of fields in the result set is 0.\n", DAM);
        }

        printf("%s: Fetch the actual data:\n", DAM);
        /* Loop through the rows in the result set */
        rc = SQLFetch(hStmt);
        while (SQL_SUCCEEDED(rc)) 
        {
            printf(" | %s | %s\n", chval1, chval2);
            rc = SQLFetch(hStmt);
            rowCount++;
        };

        printf("%s: Total Row Count: %d\n", DAM, rowCount);
        rc = SQLFreeStmt(hStmt, SQL_DROP);
    }
}
else
{
    printf("%s: Couldn't connect to %s.\n", DAM, szDSN);
}

/* Disconnect and free up allocated handles */
SQLDisconnect(hDbc);
SQLFreeHandle(SQL_HANDLE_DBC, hDbc);
SQLFreeHandle(SQL_HANDLE_ENV, hEnv);

printf("%s: Cleanup. Done.\n", DAM);

MFC ODBC – Beispiel

Das folgende Codebeispiel zeigt die Verbindungsinformationen für MFC ODBC, wobei der in der Bibliothek Aceodbc.dll implementierte Treiber {Microsoft Access Driver (*.mdb, *.accdb)} durch Hinzufügen von <Afxdb.h> verwendet wird.

LPCTSTR lpszConnect = 
    _T("Driver={Microsoft Access Driver (*.mdb, *.accdb)};DSN='';DBQ=C:\\Northwind.accdb;PWD=1L0v3Acce55;");

Im folgenden Codebeispiel werden das Schema und die Daten abgerufen.

BOOL result = TRUE;
CDatabase db;

TRY
{
    result = db.OpenEx(lpszConnect, 
        CDatabase::openReadOnly |
        CDatabase::noOdbcDialog);
    if (FALSE == result)
    {
        cout<<DAM<<": Unable to connect to data source "<<lpszConnect<<endl;
        return result;
    }

    cout<<DAM<<": Successfully connected to database. Data source name:\n  "
        <<db.GetDatabaseName()<<endl;

    // Prepare SQL query
    LPCTSTR query = "SELECT Customers.[Company], Customers.[First Name] FROM Customers ORDER BY Customers.[Company] ASC;";
    cout<<DAM<<": SQL query:\n  "<<query<<endl;
       
    // Run the query and create a record set
    CRecordset rs(&db); 
    result = rs.Open(CRecordset::dynaset, query, CRecordset::none);
    if (result == TRUE)
    {
        cout<<DAM<<": Retrieve schema info for the given result set: "<<endl;
        CODBCFieldInfo fInfo; 
        short sFieldCount = rs.GetODBCFieldCount();
        if (sFieldCount > 0)
        {
            for (short nIndex=0; nIndex < sFieldCount; nIndex++)
            {
                CODBCFieldInfo fInfo;
                rs.GetODBCFieldInfo(nIndex, fInfo);
                cout<<" | "<<fInfo.m_strName;
            }
            cout<<endl;
        }
        else
        {
            cout<<DAM<<": Error: Number of fields in the result set is 0."<<endl;
        }
    
        cout<<DAM<<": Fetch the actual data: "<<endl;
        CDBVariant var;
        CString value;
       
        // Loop through the rows in the result set
        int rowCount = 0;
        while (!rs.IsEOF())
        {
            for (short nIndex=0; nIndex < sFieldCount; nIndex++)
            {
                rs.GetFieldValue(nIndex, var);
                switch (var.m_dwType)
                {
                    case DBVT_STRING:
                        value.Format("%s", var.m_pstring->GetBuffer(var.m_pstring->GetLength()));
                        break;
                    case DBVT_ASTRING:
                        value.Format("%s", var.m_pstringA->GetBuffer(var.m_pstringA->GetLength()));
                        break;
                    case DBVT_WSTRING:
                        value.Format("%s", var.m_pstringW->GetBuffer(var.m_pstringW->GetLength()));
                        break;
                    default:
                        value = "";
                }
                cout<<" | "<<value;
            }
            cout<<endl;
            rowCount++;
            rs.MoveNext();
        }
        cout<<DAM<<": Total Row Count: "<<rowCount<<endl;
    }
}
CATCH_ALL(e)
{
    TCHAR  errMsg[255];
    e->GetErrorMessage(errMsg, 255);
    cout<<DAM<<": CException: "<<errMsg<<endl;
}
END_CATCH_ALL

db.Close();
cout<<DAM<<": Cleanup. Done."<<endl;

JDBC-ODBC – Beispiel

JDBC ist eine Datenzugriffsschicht, die Java die Interaktion mit der zugrunde liegenden Datenquelle ermöglicht. Die JDBC-ODBC-Brücke ist eine Datenbanktreiberimplementierung, die für die Verbindung mit der Access-Datenbank auf dem ODBC-Treiber basiert. Der Treiber wandelt Aufrufe von JDBC-Methoden in Aufrufe von ODBC-Funktionen um.

private static String strConnect =
"jdbc:odbc:DRIVER=Microsoft Access Driver (*.mdb, *.accdb);DBQ=C:\\Northwind.accdb;PWD=1L0v3Acce55;";

Im folgenden Java-Codebeispiel werden das Schema und die Daten abgerufen.

try {
   Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
   Connection con = DriverManager.getConnection(strConnect, "",""); 
   if (null == con) {
   System.out.println(DAM + "Unable to connect to data source " + strConnect);
   return;
   }
   
   System.out.println(DAM + ": Successfully connected to database. Data source name:\n  " 
+ con.getMetaData().getURL());
  
   // Prepare SQL query.
   String query = "SELECT Customers.[Company], Customers.[First Name] FROM Customers ORDER BY Customers.[Company] ASC;";
   System.out.println(DAM + ": SQL query:\n " + query);
   
   // Run the query and create a record set
   Statement stmt = con.createStatement();
   stmt.execute(query); 
   ResultSet rs = stmt.getResultSet(); 
   if (rs != null) {
   System.out.println(DAM + ": Retrieve schema info for the given result set: ");
   ResultSetMetaData rsmd = rs.getMetaData();
   for (int i=1; i <= rsmd.getColumnCount(); i++) {
   System.out.print(" | " + rsmd.getColumnName(i));
   }
   
   System.out.println("\n" + DAM + ": Fetch the actual data: ");
   int rowCount = 0;
   while (rs.next()) {
   for (int i=1; i <= rsmd.getColumnCount(); i++) {
       System.out.print(" | " + rs.getString(i));
       }
   System.out.println("");
   rowCount++;
       }
   System.out.println(DAM + ": Total Row Count: " + rowCount);
   }
   stmt.close(); 
   con.close(); 
} catch (Exception err) {
   System.out.println(DAM + ": Exception: " + err.getMessage());
} finally {
   System.out.println(DAM + ": Cleanup. Done.");
}

Leistungsdaten

Leistungsergebnisse für 64-Bit-Access 2010 wurden einem auf 64-Bit-System mit Windows Server 2008 SP2, einem AMD 64 Athlon X2-Zweikernprozessor 4600+ mit 2,4-GHz-CPU und 8 GB Arbeitsspeicher (RAM) ermittelt. Die Benchmarkprogramme lieferten keine Ausgaben an die Benutzeroberfläche und verwendeten keine neuen oder erweiterten Funktionen des Access-Datenbankmoduls.

Abbildung 3 veranschaulicht die Leistungsdaten.



Abbildung 3. Leistungsmessungen (in Sekunden)

Leistungsmessungen
Ff965871.note(de-de,office.14).gifHinweis:

Alle Benchmarkprogramme wurden als Konsolenanwendung ausgeführt mit Ausnahme des VBA DAO-Codes, der in der VBA/VBE-Umgebung ausgeführt wurde. Dies bedeutet, dass VBA-Code das einzige Programm war, das die Berechtigung zur Ausführung im selben Adressraum wie MSAccess.exe hatte. Dies führte zu einer beträchtlichen Verringerung von E/A-Datenträgervorgängen und Seitenfehlern, wodurch die Gesamtleistung verbessert wurde.

Verwenden von 32-Bit- und 64-Bit-Anbietern des Access-Datenbankmoduls.

Die Anbieter des Access-Datenbankmoduls (ACE DAO, ACE OLE DB oder ACE ODBC) für Access 2007 stehen nur als 32-Bit-Version zur Verfügung. Die Anbieter des Access-Datenbankmoduls für Access 2010 stehen sowohl als 32-Bit- als auch 64-Bit-Version zur Verfügung.

Im Wesentlichen gibt es nun drei mögliche Konfigurationen.

Reine 64-Bit-Lösung (64-Bit-Access, 64-Bit-Windows)

Führen Sie zum Implementieren einer 64-Bit-Lösung folgende Schritte aus:

  1. Stellen Sie 64-Bit-Access 2010 unter 64-Bit-Windows bereit.

  2. Erstellen Sie eine benutzerdefinierte 64-Bit-Datenzugriffsanwendung.

Reine 32-Bit-Lösung (32-Bit-Access, 32-Bit-Windows)

Wenn Sie eine 32-Bit-Anwendung haben und diese weiterhin unverändert mit Access 2010 ausführen möchten, müssen Sie die 32-Bit-Version von Access 2010 installieren.

32-Bit-Access 2010 funktioniert exakt wie 32-Bit-Access 2007, sodass Ihr VBA-Code, Ihre COM-Add-Ins oder ActiveX-Steuerelemente ohne erforderliche Änderungen weiter funktionieren.

WOW64-Lösung (32-Bit-Access, 64-Bit-Windows)

Die WOW64-Technologie erlaubt die Ausführung von 32-Bit-Anwendungen auf 64-Bit-Windows-Plattformen, sodass 32-Bit-Access 2010 unter 64-Bit-Windows installiert werden kann. In diesem Fall muss Ihre Datenanwendung eine 32-Bit-Version haben, damit die Kommunikation mit den Anbietern des Access-Datenbankmoduls funktioniert. Dies ist die Standardinstallation unter 64-Bit-Betriebssystemen, die Kompatibilität mit 32-Bit-Office-Anwendungen zulässt.

Wenngleich 32-Bit-Anwendungen transparent ausgeführt werden können, wird die Kombination zweier Arten von Code innerhalb desselben Prozesses nicht unterstützt. Eine 64-Bit-Anwendung kann nicht mit einer 32-Bit-Systembibliothek (DLL) verbunden werden. Ebenso wenig kann eine 32-Bit-Anwendung nicht mit einer 64-Bit-Systembibliothek verbunden werden.

Ff965871.Important(de-de,office.14).gifWichtig:

Beim Versuch, Ihren 32-Bit-Code der Vorversion mit 64-Bit-Access auszuführen, werden Laufzeitfehler gemeldet. Der Fehler "Der Anbieter 'Microsoft.ACE.OLEDB.12.0' ist nicht auf dem lokalen Computer registriert" kann beispielsweise durch eine fehlende Versionsübereinstimmung zwischen Ihrer Anwendung (32-Bit-Code) und einem der 64-Bit-Anbieter des Access-Datenbankmoduls verursacht werden, die mit 64-Bit-Microsoft Access installiert wurden. Ändern Sie zum Beheben dieses Problems entweder Ihren benutzerdefinierten Code in eine 64-Bit-Version, oder deinstallieren Sie 64-Bit-Access, und ersetzen Sie die Anwendung durch 32-Bit-Access.



Abbildung 4. Übereinstimmende Versionen zwischen Anbietern des Access-Datenbankmoduls und Anwendungen

32-Bit im Gegensatz zu 64-Bit

Parallele Installation

Die parallele Installation von 64-Bit- und 32-Bit-Versionen von Office 2010 wird nicht unterstützt. Dies gilt auch für Access.

Weitere Aspekte

Bestimmen Sie vor der Bereitstellung von 64-Bit-Access, ob es sich um eine geeignete Bereitstellungsoption für Ihre spezifische Umgebung handelt. Es gibt mehrere Faktoren, die Sie auf die Kompatibilität Ihrer aktuellen 32-Bit-Access-Lösung auswirken können. Wenn Sie beispielsweise Datenbanken verwenden, aus denen der Quellcode entfernt wurde (z. B. MDE-, -ADE und ACCDE-Dateien), oder die mit VBA-Code mit "Declare"-Anweisungen, COM-Add-Ins oder ActiveX-Steuerelementen arbeiten, müssen Sie ggf. Entwicklungszeit einkalkulieren, ehe diese Funktionalität zusammen mit 64-Bit-Access funktioniert. Eine alternative Lösung dieses Problems ist ggf. die Installation von 32-Bit-Access unter 32-Bit-Windows oder 32-Bit-Access (WOW64) unter 64-Bit-Windows. Weitere Informationen zu diesem Thema finden Sie unter 64-Bit-Editionen von Office 2010.

Aspekte bei der Auswahl der Datenzugriffstechnologie

Wenn Sie eine Lösung entwickelt haben, die mit einer vorhandenen Access-Datenbank funktioniert, möchten Sie ggf. die derzeitige Datenzugriffstechnologie der Anwendung weiter verwenden, so lange sie Ihre Anforderungen erfüllt. Im Abschnitt Veraltete Datenzugriffsmethoden sind Treiber aufgeführt, die Verbindungen mit Access-Dateiformaten von Vorversionen weiter ermöglichen. Beachten Sie, dass alle neuen Anbieter des Access-Datenbankmoduls voll abwärtskompatibel sind.

Wenn Sie erwarten, dass die Anwendung einen langen Lebenszyklus hat, sind bei Analyse und Entwurf der Anforderungen mehrere Faktoren zu berücksichtigen. Zu den Faktoren bei der Wahl des geeignetsten Datenzugriffstreiber zählen u. a.:

  • Sprache/Plattform. Sind Sie beim Implementieren Ihrer Lösung auf systemeigene Sprachen (C, C++, VBA) oder verwaltete Sprachen (C#, Visual Basic.NET) beschränkt? Verwaltete Sprachen und ihr zugrunde liegendes Datenzugriffs-Framework (ADO.NET) ermöglichen eine einfachere Implementierung, bessere Plattforminteroperabilität und einen skalierbaren Datenzugriff. Wenn Sie z. B. eine erweiterte Integration mit der .NET Framework-Lösung (XML), die die getrennte Geschäftslogik (speicherinterne Darstellung relationaler Daten) benötigt, oder überlegt definierte Schnittstellen mit vorhersehbaren Verhalten, Leistungsdaten und Semantiken wünschen, sollte ADO.NET Ihre erste Wahl sein. Wenn Sie jedoch die bestmögliche Leistung wünschen oder auf den Einsatz einer bestimmten Sprache begrenzt sind, dann sollten Sie auch andere Methoden in Betracht ziehen (direktes DAO, direktes OLE DB usw.). Wenn Sie Ihre Lösung in C entwickeln möchten, sind Ihre Optionen auf direktes ODBC beschränkt. Für die Java-Entwicklung kommt der JDBC-ODBC-Treiber in Frage.

  • Funktionalität. Wenn Ihre Lösung ausschließlich von den Access-Datenbanken abhängt und dies so bleiben soll, bietet sich der DAO-Treiber des Access-Datenbankmoduls an, da er die umfassendste Funktionalität bietet. Langfristig bieten die systemeigenen Datenzugriffstechnologien meist eine kürzere Entwicklungszeit, einen einfacheren Code und eine bessere Leistung. Wenn Sie unbedingt erweiterte Bearbeitungsfunktionen für Recordsets benötigen und sich mit einer unterstützenden externen Quelle verbinden, erwägen Sie ADO.NET (oder ADO) oder OLE DB. Nur der DAO-Treiber des Access-Datenbankmoduls bietet vollständige Unterstützung für Vorversionsfunktionen wie verknüpfte Tabellen und gespeicherte Abfragen sowie für neue mit Access 2007 eingeführte komplexe Datentypen. Der OLE DB-Treiber des Access-Datenbankmoduls bietet begrenzte Unterstützung für komplexe Daten. Legen Sie, um beispielsweise eine bessere Unterstützung für komplexe Datasets (zum Abrufen von Recordsets innerhalb von Recordsets) zu ermöglichen, den Verbindungsparameter "JET OLE DB: Support Complex Data" fest. Andernfalls werden bei komplexen Feldern nur begrenzte Listen abgerufen. ADO.NET, ADO und ODBC des Access-Datenbankmoduls rufen bei komplexen Feldern stets begrenzte Listen ab.

  • Sicherheit. Das Schreiben von sicherem Datenbankcode in einer Mehrbenutzer- und Internetumgebung erfordert wesentlich mehr als das Erstellen eines sicheren Verschlüsselungskennworts. Eine Anwendung, die auf eine Datenbank zugreift, weist viele potenzielle Fehlerstellen auf, die ein Angreifer zum Abrufen, Manipulieren oder Löschen vertraulicher Daten ausnutzen kann. Es ist deshalb wichtig, mit allen Aspekten der Sicherheit vertraut zu sein - von der Risikomodellierung in der Entwurfsphase der Anwendung bis hin zur schlussendlichen Bereitstellung und laufenden Wartung. Im Allgemeinen bietet .NET Framework eine einfacher zu verwendende und überlegt integrierte Umgebung für die Optimierung der Sicherheit Ihrer Anwendung.

  • Leistung. Wenngleich ADO.NET und ADO schnelle Technologien sind, fügen sie eine zusätzliche Abstraktionsschicht zwischen Ihre Anwendung und den OLE DB-Anbieter des Access-Datenbankmoduls ein, wenn dieser mit dem Access-Datenbankmodul zusammenarbeitet. In der Regel sind die direkten DAO-, OLE DB- und ODBC-Methoden insbesondere für größere Datenbanken am schnellsten. Wenn die Leistung ein wichtiger Punkt ist und Sie mit der Zeit ein Wachstum der Datenbank erwarten, sollten Sie Ihre Anwendung in C++ unter Verwendung der OLE DB- oder DAO-Schnittstelle schreiben.

  • Wartung. Lesen Sie zum Entwickeln einfacher Lösungen mit ADO.NET oder direktem DAO (und möglicherweise ADO) den entsprechenden Kommentar. Das Auswählen der Datenzugriffstechnologie OLE DB wirkt sich auf die Kosten der langfristigen Wartung Ihrer Anwendung aus. OLE DB ist aufwändiger als DAO oder ADO.NET, da das Warten und Verbessern von komplexem COM-Code schwieriger ist. Als Alternative zur direkten OLE DB-Methode können Sie den ATL OLE DB-Ansatz wählen (Beispielquellcode wird bereitgestellt), der sich gut zum Abstrahieren der zugrunde liegenden COM-Komplexität eignet.

Ff965871.note(de-de,office.14).gifHinweis:

Office Access 2007-Anbieter des Access-Datenbankmoduls funktionieren nur mit 32-Bit-Clientcode. Access 2010-Anbieter des Access-Datenbankmoduls unterstützen entweder 32-Bit- oder 64-Bit-Code. Zum Implementieren einer 64-Bit-Lösung müssen Sie und Ihre Clients eine 64-Bit-Access 2010-Version bereitstellen. Weitere Informationen finden Sie unter Verwenden von 32-Bit- und 64-Bit-Anbietern des Access-Datenbankmoduls..

Veraltete Datenzugriffsmethoden

Tabelle 2 enthält die ab Access 2007 veralteten Datenzugriffsmethoden. Diese Methoden werden nicht für den Einsatz mit im ACCDB-Format gespeicherten Access-Datenbanken unterstützt und dürfen nur zum Warten von Anwendungen aus Vorversionen verwendet werden.

Tabelle 2. Veraltete Datenzugriffsmethoden

Name des Anbieters Datenzugriffsmethode Verbindungs- und andere Informationen Unterstützte Sprache(n)

JET4.0 OLE DB-Anbieter

OLE DB

Microsoft.JET.OLEDB.4.0

<Atldbcli.h>

C++

MFC DAO

MFC DAO

<Afxdao.h>;

Mit MDAC installiert. MFC-Klassen mit dem Präfix "CDao".

Die MFC DAO-Klassen ermöglichen Benutzern das Verwenden des veralteten Microsoft JET-Datenbankmoduls, werden aber ab Access 2007 nicht mehr unterstützt. DAO 3.6 ist die letzte Version dieser Technologie, die unter 64-Bit-Windows nicht zur Verfügung steht. Visual C++ .NET-Assistenten generieren keinen Code, der Recordsets automatisch erstellt und öffnet.

C++

Access ODBC Driver 4.0

MFC ODBC

Driver={Microsoft Access Driver (*.mdb)};DBQ=path of mdb file

<Afxdb.h>;

Odbcjt32.dll;

C++

Schlussbemerkung

In diesem technischen Artikel wird die allgemeine Architektur von Microsoft Access, des Access-Datenbankmoduls und der Datenanbieter behandelt. Untersucht werden verschiedene Datenzugriffstechnologien, die Ihren zur Programmierung von Access zur Verfügung unabhängig davon zur Verfügung stehen, ob Sie systemeigenen oder verwalteten 32-Bit oder 64-Bit-Code entwickeln. Durch Verwenden von Datenzugriffstechnologien wie DAO, OLE DB, ADO.NET, ADO, ODBC oder JDBC können Sie weiter benutzerdefinierte Access-Lösungen selbst für die komplexesten und anspruchsvollsten Szenarien erstellen. Im Allgemeinen bietet der Standardanbieter des Access-Datenbankmoduls, der DAO-Treiber, die umfassendste systemeigene Schnittstelle zu Access-Datenbanken. ADO.NET ist eine gute Alternative zu .NET-Sprachen. Beide sind nicht nur gut in das Access-Datenbankmodul integriert, sondern bieten zudem eine schnelle, stabile und abwärtskompatible Umgebung mit Dateiformaten von Vorversionen.

Weitere Ressourcen

Community-Beiträge

HINZUFÜGEN
Anzeigen:
© 2014 Microsoft