Einleitung


Auf eine Accessdatenbank kann man über zwei Möglichkeiten zugreifen

  • a) ADO.Net (Daten lesen, schreiben, analysieren etc.)
  • b) ADOX  (Umgang mit dem Accessprogram ansich)

Hier, in diesem Kapitel gehe näher auf ADOX ein. 

Access und ADO.Net habe ich unter dem Kapitel "Datenbanken -> Access ADO.Net" näher beschrieben.
 

ADOX

Mit ADO.Net lassen sich die meisten Aufgaben mit prinzipiell baugleichen Skripten für verschiedene Datenquellen (Excel, SqlServer, Access und weitere) erledigen -> Datenzugriffe über ADO.Net - Connected Classes. Allerdings gibt es für Access ein paar Ausnahmen bei der Administration von Accessdatenbanken. Zumindest habe ich für folgende Aufgaben an AccessDbs keine Lösungen gefunden.

  • Create Database
  • Create/ Alter Table

Im Netz findet man Aussagen, dass dies nicht möglich sei, oder dass selbst anerkannte Spezialisten noch keine Lösung mit ADO.Net gefunden haben 

Richard Siddaway's Blog "One thing that is obvious is that I am not checking the SQL to ensure that it is a CREATE TABLE command that is being passed in.  This is a job for another time"

Den Ausweg bietet die ADOX-Bibliothek MSDN: ADOX Fundamentals (=Microsoft® ActiveX® Data Objects Extensions for Data Definition Language and Security (ADOX)). Nach dieser MSDN-Seite ist ADOX eine Erweiterung der ADO-Bibiliothek (nicht ADO.Net) und beinhaltet Funktionen zur Administration des Schemas (=Tabellen, Abfragen, Makros) einer Datenbank, sowie zur Verwaltung von Sicherheitsfunktionen.

 

Beispiel 1: Anlegen einer (leeren) Tabelle und anschließendes Auslesen aller Tabellen der Nordwind.mdb

Set-StrictMode -Version "2.0"
Remove-Variable * force
Clear-Host

#$DatabaseName = "C:\Temp\Nordwind.accdb"
$DatabaseName = "C:\Temp\Nordwind.mdb"
$Provider="Provider=Microsoft.ACE.OLEDB.12.0"

#Zusammenbau des ConnectionStrings
$DataSource="Data Source=$DataBaseName"
$ConnectionString = "$Provider;$DataSource;"

#ConnectionObject erstellen und Öffnen
$Conn = New-Object -ComObject 'ADODB.Connection'
$Conn.ConnectionString = "$Provider;$DataSource;"
$Conn.Open($null,$null,$null,0)

#CatalogObject erstellen und öffnen
$Catalog = New-Object -ComObject 'ADOX.Catalog'
$Catalog.ActiveConnection = $Conn

#TabellenObject erstellen und benennen
$Table = New-Object -ComObject 'ADOX.Table'
$Table.Name = "Neue Tabelle"

#Tabelle an Datenbank (=Catalog) anfügen
$Catalog.Tables.Append($Table)

#Ausgabe aller Tabellen
$Catalog.Tables | Sort Type,Name | Format-Table Name,Type -AutoSize

#Schließen der Verbindung
$Conn.Close()

#getestet mit Office2010 und Win7 64bit/64bit

#Ausgabe gekürzt

Name                            Type        
----                            ----        
MSysAccessObjects               ACCESS TABLE
MSysAccessXML                   ACCESS TABLE
...
MSysRelationships               SYSTEM TABLE
Artikel                         TABLE       
Bestelldetails                  TABLE       
...      
Neue Tabelle                    TABLE       
Personal                        TABLE       
Versandfirmen                   TABLE       
Alphabetische Artikelliste      VIEW        
...    
Umsätze nach Kategorie          VIEW        
Umsätze nach Kategorie für 1997 VIEW

Es gibt in Access offenbar mehrere Typen von Tabellen

  • AccessTable
  • SystemTable
  • Table
  • View

Access- und System Table sind offenbar interne Systemtabellen von Access. er Typ Table gehört zu den auch in der GUI verwaltbaren Tabellen und der Typ View entspricht dort einer Abfrage/ Query.

 

Beispiel 2: DesignAnalyse einer bestimmten Tabelle in einer Accessdatenbank

Bei einer Datenbanktabelle ist neben den Daten vor allem das Design einer Tabelle entscheidend. Im DesignView von Access werden die Spalten definiert (Datentyp, Länge). 

 

Per Skript kann man sich diese Informationen natürlich ebenso beschaffen

Set-StrictMode -Version "2.0"
Remove-Variable * force
Clear-Host

#$DatabaseName = "C:\Temp\Nordwind.accdb"
$DatabaseName = "C:\Temp\Nordwind.mdb"
$Provider = "Provider=Microsoft.ACE.OLEDB.12.0"
$TableName = "Artikel"

#Zusammenbau des ConnectionStrings
$DataSource="Data Source=$DataBaseName"
$ConnectionString = "$Provider;$DataSource;"

#ConnectionObject erstellen und Öffnen
$Conn = New-Object -ComObject 'ADODB.Connection'
$Conn.ConnectionString = "$Provider;$DataSource;"
$Conn.Open($null,$null,$null,0)

#CatalogObject erstellen und öffnen
$Catalog = New-Object -ComObject 'ADOX.Catalog'
$Catalog.ActiveConnection = $Conn

#bestimmte Tabelle auswählen und analysieren
$ArtikelTable = $Catalog.Tables | Where {$_.Name -eq $TableName}
$ArtikelTable.Columns | Format-Table  Name, DefinedSize, Type –AutoSize
#$ArtikelTable.Columns | Format-Table  * –AutoSize

#Schließen der Verbindung
$Conn.Close()

#getestet mit Office2010 und Win7 64bit/64bit
#Ausgabe

Name               DefinedSize Type
----               ----------- ----
Artikelname                 40  202
Artikel-Nr                   0    3
Auslaufartikel               2   11
BestellteEinheiten           0    2
Einzelpreis                  0    6
Kategorie-Nr                 0    3
Lagerbestand                 0    2
Lieferanten-Nr               0    3
Liefereinheit               25  202
Mindestbestand               0    2

Die Spalte "Artikelname" besitzt den Type 202, was dem DataType "Text" entspricht. Die FieldSize (=DefinedSize) ist mit 40 festgelegt.

Alle möglichen Typewerte findet ihr selbstverständlich in der MSDN: ADO API Reference -> DataTypeEnum

Auszug aus der genannten MSDN-Tabelle:

adSmallInt 2 Indicates a two-byte signed integer (DBTYPE_I2).
adInteger 3 Indicates a four-byte signed integer (DBTYPE_I4).
adCurrency 6 Indicates a currency value (DBTYPE_CY). Currency is a fixed-point number with four digits to the right of the decimal point. It is stored in an eight-byte signed integer scaled by 10,000.
adBoolean 11 Indicates a Boolean value (DBTYPE_BOOL).
adVarWChar 202 Indicates a null-terminated Unicode character string.

 

Beispiel 3: Erstellen einer Tabelle mit zwei Spalten

Set-StrictMode -Version "2.0"
Remove-Variable * force
Clear-Host

#$DatabaseName = "C:\Temp\Nordwind.accdb"
$DatabaseName = "C:\Temp\Nordwind.mdb"
$Provider="Provider=Microsoft.ACE.OLEDB.12.0"

$TableName = "Neue Tabelle"
 
#Zusammenbau des ConnectionStrings
$DataSource="Data Source=$DataBaseName"
$ConnectionString = "$Provider;$DataSource;"

#ConnectionObject erstellen und öffnen
$Conn = New-Object -ComObject 'ADODB.Connection'
$Conn.ConnectionString = "$Provider;$DataSource;"
$Conn.Open($null,$null,$null,0)

#CatalogObject erstellen und öffnen
$Catalog = New-Object -ComObject 'ADOX.Catalog'
$Catalog.ActiveConnection = $Conn

#TabellenObject erstellen, designen und benennen
$Table = New-Object -ComObject 'ADOX.Table'
$Table.Columns.Append("Marke",202,42)
$Table.Columns.Append("Wert",6,4)
$Table.Name = $TableName

#Tabelle an Datenbank (=Catalog) anfügen
$Catalog.Tables.Append($Table)

#Ausgabe aller DesignInfos
$Table.Columns | Format-List  *

#Schließen der Verbindung
$Conn.Close()

#getestet mit Office2010 und Win7 64bit/64bit

#Ausgabe

Name          : Marke
Attributes    : 0
DefinedSize   : 42
NumericScale  : 0
Precision     : 0
RelatedColumn :
SortOrder     :
Type          : 202
Properties    : System.__ComObject
ParentCatalog :

Name          : Wert
Attributes    : 0
DefinedSize   : 4
NumericScale  : 0
Precision     : 0
RelatedColumn :
SortOrder     :
Type          : 6
Properties    : System.__ComObject
ParentCatalog :

Dieses Skript legt eine neue Tabelle in der AccessDatenbank "nordwind.mdb" an und fügt dieser Tabelle zwei Datenfelder hinzu. Die Definition der Typen findet ihr in dem Link aus Beispiel 2.

Um Daten in die Tabellen einzutragen oder daraus auszulesen, seht euch das Kapitel Datenzugriffe über ADO.Net - ADO.Net an