{"id":55000233,"date":"2004-10-01T00:00:00","date_gmt":"2023-02-10T14:47:22","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=233"},"modified":"2024-02-19T08:16:20","modified_gmt":"2024-02-19T08:16:20","slug":"adonet__eine_einfuehrung","status":"publish","type":"post","link":"https:\/\/access-im-unternehmen.de\/adonet__eine_einfuehrung\/","title":{"rendered":"ADO.NET &#8211; eine Einf&uuml;hrung"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/vg02.met.vgwort.de\/na\/3018cd3173a248bebd8272050f70e16d\" width=\"1\" height=\"1\" alt=\"\"><\/p>\n<p><b>Manfred Hoffbauer, D&uuml;sseldorf<\/b><\/p>\n<p><b>Die in Microsoft Access integrierte Programmiersprache VBA unterst&uuml;tzt den Zugriff auf Access-Datenbanken per DAO und ADO. Auch in Microsoft Visual Basic.NET ist mit ADO.NET eine Technik f&uuml;r den Zugriff auf solche Datenbanken enthalten. Der folgende Beitrag beschreibt die wichtigsten Techniken f&uuml;r den lesenden und schreibenden Zugriff auf die Daten einer Access-Datenbank.<\/b><\/p>\n<p>Einer der Gr&uuml;nde f&uuml;r den Erfolg von Access ist, dass man auch mit wenigen Kenntnissen schnell achtbare Ergebnisse erzielt und alle notwendigen Hilfsmittel in einer einzigen Anwendung findet. F&uuml;r die Erstellung einer Anwendung auf Basis der .NET-Technologien bedarf es weit mehr: Dazu sind Kenntnisse in Winforms oder ASP.NET, ADO.NET und einer .NET-Programmiersprache wie C#.NET oder VB.NET erforderlich. <\/p>\n<p>Da der vorliegende Beitrag aber &#8222;nur&#8220; eine Einf&uuml;hrung in ADO.NET geben m&ouml;chte, sind die Beispiele auf das Mindeste reduziert &#8211; sie haben keine Benutzeroberfl&auml;che und auch die Ausgabe der Ergebnisse erfolgt lediglich per Konsole. Alles andere h&auml;tte auch den Rahmen gesprengt und zu sehr vom eigentlichen Thema abgelenkt. Daf&uuml;r lernen Sie aber alle wichtigen Techniken f&uuml;r den Zugriff auf eine Access-Datenbank per ADO.NET kennen und k&ouml;nnen diese Kenntnisse sp&auml;ter leicht aufgreifen, wenn Sie einmal eine &#8222;richtige&#8220; .NET-Anwendung mit Benutzeroberfl&auml;che erstellen.<\/p>\n<h3>Hinweis<\/h3>\n<p>Die Beispieldaten befinden sich auf der Heft-CD in der Zip-Datei ADO.NET.zip. Als Beispieldatenbank dient die Adressverwaltung, die Sie unter dem Dateinamen Adress97.mdb bzw. Adress00.mdb auf der Heft-CD finden. Den kompletten Code mit allen Beispielen enth&auml;lt die Datei Main.vb. <\/p>\n<p>Schon seit mehreren Jahren beherrscht Access neben DAO ein weiteres Verfahren f&uuml;r den Datenzugriff. Mit den so genannten Active Data Objects (kurz: ADO) verf&uuml;gt der Access-Programmierer &uuml;ber ein modernes Verfahren f&uuml;r den Datenzugriff. Zahlreiche Beitr&auml;ge von Access im Unternehmen haben sich mit den Vor- und Nachteilen von ADO und DAO besch&auml;ftigt. Einer der wichtigsten Vorteile von ADO besteht wohl darin, dass Sie mit dieser Technik sowohl auf Access-Datenbanken als auch auf SQL Server-Datenbanken zugreifen k&ouml;nnen. Microsoft selbst weist immer wieder darauf hin, dass DAO und ADO bei der Programmierung mit Access ihre Berechtigung haben. Je nach Anwendung ist die eine oder die andere Zugriffstechnik besser geeignet.<\/p>\n<h2>ADO.NET<\/h2>\n<p>Die mit .NET eingef&uuml;hrte Methode f&uuml;r den Datenzugriff nennt Microsoft ADO.NET. Wie der Name schon verr&auml;t, hat ADO.NET mehr &auml;hnlichkeiten mit ADO als mit DAO. Access-Programmierer, die bisher vorwiegend mit DAO gearbeitet haben, m&uuml;ssen sich also umstellen. Wie bei ADO basiert bei ADO.NET der gesamte Datenzugriff auf einem Connection-Objekt. Mit ihm &ouml;ffnen Sie unter Verwendung eines .NET-Datenproviders den Zugang zu einer Datenquelle. Abb. 1 zeigt eine &uuml;bersicht &uuml;ber die Datenzugriffsobjekte. <\/p>\n<h3>Hinweis<\/h3>\n<p>Im Zusammenhang mit ADO.NET ist von Objekten wie Connection, DataCommand und DataAdapter die Rede. Tats&auml;chlich sind diese Objekte in Microsoft.NET gar nicht vorhanden. Es handelt sich lediglich um Oberbegriffe f&uuml;r die je nach verwendeter Technik dedizierten Objekte. Bei Verwendung von OleDB verwenden Sie die Objekte OleDBConnection, OleDbCommand und OleDBDataAdapter. Diese Objekte befinden sich im Namespace System.Data.OleDB. <\/p>\n<p><IMG height=\"523\" src=\"..\/fileadmin\/_temp_\/{D470EB58-B776-45FA-8171-E5B68E5E7B54}\/pic001.png\" width=\"500\" border=\"0\"><\/p>\n<p><b><\/b><\/p>\n<p><b>Abb. 1: Datenzugriffsobjekte<\/b><\/p>\n<p>Im Namespace System.Data.SqlClient ist der Datenprovider f&uuml;r SQL Server-Datenbanken (ab Version 7.0) enthalten. <\/p>\n<p>Im Namespace System.Data.OleDB ist der Datenprovider f&uuml;r andere Datenquellen enthalten. Seit der Version 1.1 des Microsoft .NET-Frameworks befinden sich im Namespace System.Data.ODBC die Objekte f&uuml;r den Zugriff mit der &auml;ltesten der drei Techniken. Bei Version 1.0 des .NET-Frameworks musste der ODBC-Provider nachtr&auml;glich installiert werden.<\/p>\n<h2>Der OleDbConnection-String<\/h2>\n<p>Die Anforderungen an den ConnectionString variieren stark zwischen SqlClient, OleDB und ODBC. Speziell beim OleDBConnection-String k&ouml;nnen Sie innerhalb des Strings einen Datenprovider spezifizieren.<\/p>\n<p>M&ouml;gliche Eintr&auml;ge lauten wie folgt:<\/p>\n<li>SQLOLEDB: SQL Server ab Version 6.5<\/li>\n<li>MSDAORA: Oracle-Datenbanken<\/li>\n<li>Microsoft.Jet.OLEDB.4.0: Microsoft JET, also MDB-Datenbankdateien von Microsoft Access<\/li>\n<h2>Combine anlegen<\/h2>\n<p>Um die Beispiele aus diesem Beitrag nachzuvollziehen, sollten Sie mit SharpDevelop (Beschreibung und Download siehe Ausgabe 4\/2004, Beitrag .Net-Programmierung mit SharpDevelop) eine neue Combine anlegen.<\/p>\n<p>Starten Sie das Programm und gehen Sie wie folgt vor:<\/p>\n<li>Klicken Sie im Startdialog von SharpDevelop auf den Button Neues Combine.<\/li>\n<li>Markieren Sie die Kategorie VB.NET.<\/li>\n<li>Markieren Sie die Schablone Konsolenanwendung.<\/li>\n<li>Geben Sie Ado.Jet als Dateinamen ein.<\/li>\n<li>Klicken Sie auf den Button Erstellen. (<\/li>\n<p>SharpDevelop erstellt die Combine und f&uuml;gt den Standardcode f&uuml;r eine Konsolenanwendung ein. Durch das Bet&auml;tigen der F5-Taste k&ouml;nnen Sie das Programm sofort starten.<\/p>\n<h3>Hinweis<\/h3>\n<p>Wenn Sie die nachfolgenden Beispiele einfach nur nachvollziehen und nicht selbst eingeben m&ouml;chten, k&ouml;nnen Sie nach dem &ouml;ffnen von SharpDevelop auch direkt auf die Schaltfl&auml;che Combine &ouml;ffnen klicken und die im OrdnerAdo.Jet (Sharp Develop) enthaltene DateiAdo.Jet.cmbx ausw&auml;hlen. Die Prozedur Main enth&auml;lt alle nachfolgend beschriebenen Beispiele; nach dem Bet&auml;tigen von F5 durchl&auml;uft die Prozedur nacheinander die Beispiele. <\/p>\n<p>Wie Sie in Abb. 2 erkennen k&ouml;nnen, f&uuml;hrt Windows die Konsolenanwendung im Fenster des Befehlszeileninterpreters aus. Durch das Bet&auml;tigen einer beliebigen Taste k&ouml;nnen Sie die Anwendung beenden, was wiederum zum automatischen Schlie&szlig;en des Befehlszeileninterpreterfensters f&uuml;hrt.<\/p>\n<p>Dieser Typ Anwendung eignet sich gut, um Techniken wie beispielsweise den Datenzugriff unabh&auml;ngig von irgendwelchen Fragen der Benutzeroberfl&auml;che zu testen.<\/p>\n<pre>Dim cnnString As String\ncnnString = \"Provider=Microsoft.Jet.OLEDB.4.0;\" & _\n    \"Data Source=&lt;Dateipfad&gt;\\\\Adress00.mdb\"\nDim cnn As OleDbConnection\ncnn = New OleDbConnection(cnnString)\ncnn.Open()<\/pre>\n<p><b>Quellcode 1<\/b><\/p>\n<p><IMG height=\"355\" src=\"..\/fileadmin\/_temp_\/{D470EB58-B776-45FA-8171-E5B68E5E7B54}\/pic002.png\" width=\"500\" border=\"0\"><\/p>\n<p><b><\/b><\/p>\n<p><b>Abb. 2: Die von SharpDevelop generierte Konsolenanwendung k&ouml;nnen Sie sofort starten.<\/b><\/p>\n<p>Dieser Beitrag besch&auml;ftigt sich mit dem Zugriff auf Access-Datenbanken. Er geht deshalb vorwiegend auf OleDB und den Zugriff auf Access-Datenbanken ein. Die hierf&uuml;r ben&ouml;tigten Objekte befinden sich im Namespace System.Data.OleDB.<\/p>\n<p>Um auf ein Objekt aus diesem Namespace zuzugreifen, k&ouml;nnen Sie ihm die Bezeichnung des Namespaces voranstellen oder Sie schreiben einmal zu Beginn Ihres Programms die folgende Anweisung:<\/p>\n<pre>Imports System.Data.OleDb<\/pre>\n<p>Mit der Imports-Anweisung sparen Sie viel Schreibarbeit. Jetzt k&ouml;nnen Sie n&auml;mlich statt<\/p>\n<pre>Dim cnn As System.Data.OleDb.OleDbConnection<\/pre>\n<p>(ohne Zeilenumbruch) vereinfacht Folgendes schreiben:<\/p>\n<pre>Dim cnn As OleDbConnection<\/pre>\n<p>Hierf&uuml;r ben&ouml;tigen Sie eine Verbindung, die Sie wie in Quellcode 1 erzeugen und &ouml;ffnen k&ouml;nnen.<\/p>\n<p>Mit der Dim-Anweisung definieren Sie die String-Variable cnnString.<\/p>\n<p>Dieser Variablen weisen Sie den eigentlichen Connection-String zu. Er hat die gleiche Bedeutung wie bei der Programmierung mit dem herk&ouml;mmlichen ADO.<\/p>\n<pre>Sub Main()\n    Dim cnnString As String\n    cnnString = \"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\\\\Nordwind.mdb\"\n    Dim cnn As OleDbConnection\n    cnn = New OleDbConnection(cnnString)\n    cnn.Open()\n    Dim cmdUDI As OleDbCommand\n    cmdUDI = New OleDbCommand(\"UPDATE Personal SET Vorname = ''''Hans'''' \" _        & \"WHERE Vorname = ''''Andrew''''\", cnn)\n    console.writeline(\"Anzahl ge&auml;nderter Datens&auml;tze: \" + _        cmdUDI.ExecuteNonQuery().ToString)\n    cmdUDI = New OleDbCommand(\"INSERT INTO Personal ( Vorname, Nachname ) VALUES \" _        & \"(''''Manfred'''', ''''Hoffbauer'''' )\", cnn)\n    console.writeline(\"Anzahl hinzugef&uuml;gter Datens&auml;tze: \" + cmdUDI.ExecuteNonQuery()\n    cmdUDI = New OleDbCommand(\"DELETE FROM Personal WHERE Vorname = ''''Manfred'''' \" _        & \"AND Nachname = ''''Hoffbauer''''\", cnn)\n    Console.WriteLine(\"Anzahl Deletes: \" + cmdUDI.ExecuteNonQuery().ToString)\n    cmdUDI = New OleDbCommand(\"SELECT COUNT(*) FROM Personal\", cnn)\n    Console.WriteLine(\"Anzahl Mitarbeiter: \" + cmdUDI.ExecuteScalar().ToString)\n    cnn.Close\nEnd Sub<\/pre>\n<p><b>Quellcode 2<\/b><\/p>\n<p>Im Beispiel benennt er den zu verwendenden Datenprovider und die zu &ouml;ffnende Access-MDB-Datei.<\/p>\n<p>Die zweite Dim-Anweisung definiert ein neues OleDbConnection-Objekt und weist ihm die Verbindung zu. Mit cnn.Open() wird die Verbindung ge&ouml;ffnet.<\/p>\n<p>Wenn Sie statt auf einen OleDB-Provider auf einen SQL-Provider zugreifen wollen, dann verwenden Sie statt des OleDBConnection- ein SqlConnection-Objekt. Beide Begriffe werden in der Fachliteratur als DataConnection zusammengefasst. Objekte k&ouml;nnen aber nur den Typ OleDBConnection oder SqlConnection und nicht den Type DataConnection haben. <\/p>\n<h2>Update-, Delete- und Insert-Anweisungen per OleDbCommand-Objekt ausf&uuml;hren<\/h2>\n<p>Eine Connection an sich ist keine wirkliche Errungenschaft, aber die notwendige Voraussetzung f&uuml;r weitere Verfahren des Datenzugriffs.  Basierend auf einer OleDBConnection k&ouml;nnen Sie ein OleDBCommand-Objekt definieren.<\/p>\n<p>Das OleDBCommand-Objekt verf&uuml;gt &uuml;ber die drei folgenden Methoden:<\/p>\n<li>ExecuteNonQuery: Mit dieser Anweisung k&ouml;nnen Sie SQL-Anweisungen ausf&uuml;hren, die keine R&uuml;ckgabewerte haben. Beispiele sind INSERT, UPDATE und DELETE. Die Methode gibt die Anzahl der betroffenen Datens&auml;tze zur&uuml;ck.<\/li>\n<li>ExecuteScalar: Mit dieser Methode k&ouml;nnen Sie SQL-Anweisungen ausf&uuml;hren, die einen einzelnen R&uuml;ckgabewert erfordern (zum Beispiel die Anzahl der betroffenen Datens&auml;tze).<\/li>\n<li>ExecuteReader: Mit dieser Methode erhalten Sie ein DataReader-Objekt mit dem Ergebnis Ihrer Abfrage. Damit k&ouml;nnen Sie etwa die per SELECT-Anweisung ermittelten Datens&auml;tze lesen.<\/li>\n<p>Die ExecuteNonQuery-Methode ist zur Ausf&uuml;hrung von INSERT-, UPDATE- und DELETE-Anweisungen geeignet. Sie &auml;hnelt der Execute-Methode von Access. Die Anzahl der von einer Aktion betroffenen Datens&auml;tze erhalten Sie als Funktionsargument zur&uuml;ck. Betrachten Sie dazu die Routine aus Quellcode 2.<\/p>\n<pre>Dim strSQL As String\nstrSQL = \"SELECT Vorname, Nachname, Strasse, \" _    & \"PLZ, Ort FROM tblAdressen;\"\nDim cmd As OleDbCommand\ncmd = New OleDbCommand(strSQL, cnn)\nDim reader As OleDbDataReader\nreader = cmd.ExecuteReader()\nWhile reader.Read()\n    Console.WriteLine(reader(\"Vorname\"))\nEnd While<\/pre>\n<p><b>Quellcode 3<\/b><\/p>\n<p>Die Dim-Anweisung definiert das Objekt cmdUDI mit dem Typ OleDBCommand. Die anschlie&szlig;ende Zuweisung weist dem Objekt ein neues Command-Objekt mit der jeweils angegebenen SQL-Anweisung zu. Die Angabe der Verbindung bestimmt, auf welcher Datenbank die SQL-Anweisung ausgef&uuml;hrt wird.<\/p>\n<p>Die Methode cmdUDI.ExectureNonQuery() f&uuml;hrt die SQL-Anweisung aus. Bei allen Aktionsabfragen wird die Anzahl der betroffenen Datens&auml;tze per Console.WriteLine() angezeigt. Die Methode cmdUDI.ExecuteScalar() f&uuml;hrt die SELECT-Anweisung aus und gibt den Wert der ersten Spalte der ersten Zeile des Abfrageergebnisses als Wert zur&uuml;ck. Im Beispiel entspricht dies der Anzahl der Datens&auml;tze aus der Tabelle Personal.<\/p>\n<h2>Daten per SELECT-Anweisung lesen<\/h2>\n<p>Mit der ExecuteReader-Methode k&ouml;nnen Sie ein DataReader-Objekt erzeugen lassen. Mit dem DataReader-Objekt k&ouml;nnen Sie die Daten einer Abfrage vorw&auml;rts gerichtet lesen. Das Verhalten des Objekts entspricht daher ein wenig dem sequenziellen Lesen von Daten aus einer Textdatei. Das DataReader-Objekt h&auml;lt immer nur einen Datensatz im Speicher und spart deshalb Ressourcen. Gleichzeitig ben&ouml;tigt es die Verbindung aber w&auml;hrend seiner gesamten Lebensdauer exklusiv. Das Beispiel aus Quellcode 3 zeigt das satzweise Lesen von Adressen mit dem DataReader-Objekt.<\/p>\n<p>Sie k&ouml;nnen eine Objektvariable vom Typ DataReader nicht direkt mit New instanzieren. Ein DataReader-Objekt kann nur mittels der ExecuteReader-Methode eines OleDBCommand-Objektes erzeugt werden.<\/p>\n<p>Im Beispiel wird eine SELECT-Abfrage auf die Adresstabelle durchgef&uuml;hrt. Die Read-Methode des DataReader-Objektes gibt den Wert True zur&uuml;ck, wenn ein Datensatz gelesen werden konnte.<\/p>\n<p>Andernfalls gibt die Methode den Wert False zur&uuml;ck. Mit dem DataReader-Objekt k&ouml;nnen Sie unter Angabe des Feldnamens direkt auf die einzelnen Spaltenwerte zugreifen.<\/p>\n<p>Abb. 3 zeigt exemplarisch die Anzeige der Vornamen aus der Adressentabelle.<\/p>\n<p><IMG height=\"159\" src=\"..\/fileadmin\/_temp_\/{D470EB58-B776-45FA-8171-E5B68E5E7B54}\/pic003.png\" width=\"283\" border=\"0\"><\/p>\n<p><b><\/b><\/p>\n<p><b>Abb. 3: Ausgabe der Vornamen mittels DataReader-Objekt<\/b><\/p>\n<p>Die obige Schleife zeigt alle Vornamen aus der Adressentabelle an. Zum Schluss des Beispielprogramms sollten Sie die verwendeten Ressourcen freigeben:<\/p>\n<pre>reader.Close()\ncnn.Close()\nConsole.ReadLine()<\/pre>\n<p>Die Anweisung Console.ReadLine() wartet auf eine Benutzereingabe. Sie h&auml;lt das Windows-Befehlszeilenfenster so lange offen, bis Sie die Eingabetaste bet&auml;tigen.<\/p>\n<pre>Dim tblAdressen As New DataTable\nDim adp As New OleDbDataAdapter(\"SELECT * FROM tblAdressen\", cnn)\nadp.Fill(tblAdressen)\nDim row As DataRow\nFor Each row In tblAdressen.Rows\n    Console.WriteLine(row.Item(\"Vorname\"))\nNext<\/pre>\n<p><b>Quellcode 4<\/b><\/p>\n<pre>Dim col As DataColumn\nFor Each col In tblAdressen.Columns\n    Console.WriteLine(col.ColumnName.ToString + \"-&gt;\" + col.DataType.ToString)\nNext<\/pre>\n<p><b>Quellcode 5<\/b><\/p>\n<p>Der Datenzugriff mit ADO.NET basiert auf der verbindungslosen Datenzugriffstruktur. Anders als bei Microsoft Access &uuml;blich werden ein oder mehrere Datens&auml;tze aus einer oder mehreren Tabellen in den Speicher gelesen, dort bearbeitet und bei Bedarf die &auml;nderungen geschrieben. Verbindungslos bedeutet in diesem Fall, dass nach dem Lesen der Bezug zur Datenquelle vollst&auml;ndig verloren gehen kann. Zur Handhabung dieser Architektur stellt ADO.NET das DataTable- und das DataSet-Objekt zur Verf&uuml;gung.<\/p>\n<p>Ein DataTable-Objekt besteht aus Zeilen und Spalten und ist prinzipiell mit einer Datentabelle vergleichbar. Ein DataSet-Objekt kann aus ein oder mehreren Tabellen und Relationen bestehen. Ein DataSet ist einerseits mit einer Datenbank vergleichbar, weist aber gleichzeitig gravierende Unterschiede auf. Dadurch bedingt, dass ein DataSet verbindungslos im Speicher gehalten wird, k&ouml;nnen die Daten der enthaltenen Tabellen aus sehr verschiedenen Quellen stammen. So lassen sich in ein und demselben DataSet Datentabellen aus einer Textdatei, einer Access-Datenbank, einer SQL-Server-Datenbank und aus weiteren Datenquellen zusammenf&uuml;gen.<\/p>\n<h2>Daten in ein DataTable lesen<\/h2>\n<p>Das DataAdapter-Objekt ist der Vermittler zwischen einem Connection-Objekt und einer DataTable oder einem DataSet. Es enth&auml;lt die SQL-Abfragen, mit denen Sie Daten lesen und schreiben. Das Beispiel aus Quellcode 4 zeigt, wie Sie die Vornamen aus der Adressentabelle mit Hilfe eines DataTable-Objektes anzeigen k&ouml;nnen.<\/p>\n<p>Die Dim-Anweisung definiert das Objekt tblAdressen vom Typ DataTable. Der Variablen wird gleichzeitig eine neue, leere Instanz des Objekts zugewiesen.<\/p>\n<p>Die zweite Anweisung definiert ein OleDBDataAdapter-Objekt, das als Vermittler zwischen der Connection und der DataTable fungiert. Bei der Definition des OleDBDataAdapter-Objekts werden eine SELECT-Anweisung und eine Connection angegeben.<\/p>\n<p>Mit adp.Fill(tblAdressen) werden die Daten aus der Adressentabelle in das DataTable-Objekt tblAdressen &uuml;bertragen. Beachten Sie, dass der Name des DataTable-Objekts frei gew&auml;hlt werden kann. Im Beispiel wurde es nur deshalb tblAdressen genannt, damit der Bezug zur Quelltabelle sofort klar wird. Alternativ k&ouml;nnten Sie das Objekt auch tblX oder einfach nur Adressen nennen.<\/p>\n<p>Mit der Fill-Anweisung werden nicht nur die Daten, sondern es wird auch die Struktur in das DataTable-Objekt &uuml;bertragen.<\/p>\n<p>Das Objekt enth&auml;lt nach der Zuweisung die gleichen Spalten inklusive Feldnamen, Datentypen und die gleiche Prim&auml;rschl&uuml;sseldefinition wie die Herkunftstabelle. Die Definition der Spalten k&ouml;nnen Sie mit der Schleife aus Quellcode 5 &uuml;berpr&uuml;fen.<\/p>\n<p>Die Schleife durchl&auml;uft die Columns-Auflistung des tblAdressen-Objekts. Zu jeder Spalte werden der Name und der von .NET zugewiesene Datentyp angezeigt. Das Ergebnis eines Schleifendurchlaufs sehen Sie in Abb. 4.<\/p>\n<p>Der Auflistung in der Abbildung k&ouml;nnen Sie entnehmen, wie .NET die in der Access-Tabelle definierten Datentypen in eigene Datentypen umsetzt. Zus&auml;tzlich zu der Struktur hat die Fill-Methode auch alle Daten in das DataTable-Objekt &uuml;bernommen. Die einzelnen Datens&auml;tze stellen die Zeilen innerhalb des Objekts dar. Mit der Rows-Auflistung k&ouml;nnen Sie die Zeilen durchlaufen und direkt auf die einzelnen Feldwerte zugreifen. Im obigen Beispiel wird exemplarisch der Wert des Feldes Vorname angezeigt.<\/p>\n<h2>Daten aktualisieren<\/h2>\n<p>Das Aktualisieren der Daten in einem DataTable-Objekt erfolgt durch direkte Zuweisung. Mit der folgenden Anweisung k&ouml;nnen Sie beispielsweise den Wert im Feld Vorname des vierten Datensatzes &auml;ndern (ohne Zeilenumbruch):<\/p>\n<pre>tblAdressen.Rows(3).Item(\"Vorname\") = \"&lt;Unbekannt&gt;\"<\/pre>\n<p><IMG height=\"353\" src=\"..\/fileadmin\/_temp_\/{D470EB58-B776-45FA-8171-E5B68E5E7B54}\/pic004.png\" width=\"500\" border=\"0\"><\/p>\n<p><b><\/b><\/p>\n<p><b>Abb. 4: Diese Feldnamen und Datentypen verwendet .NET zur Verwaltung der Adressentabelle.<\/b><\/p>\n<p><IMG height=\"421\" src=\"..\/fileadmin\/_temp_\/{D470EB58-B776-45FA-8171-E5B68E5E7B54}\/pic005.png\" width=\"500\" border=\"0\"><\/p>\n<p><b><\/b><\/p>\n<p><b>Abb. 5: Diesen Fehler meldet ADO.NET, falls die zugrunde liegende Datenbank exklusiv gesperrt wurde.<\/b><\/p>\n<p>Beachten Sie dabei, dass die meisten Indizes in .NET auf 0 basieren. Die erste Zeile erhalten Sie mit Row(0), die zweite mit Row(1) und so weiter.<\/p>\n<p>Was nutzt das &auml;ndern von Daten in einem verbindungslosen DataTable-Objekt? Es hat tats&auml;chlich zun&auml;chst keinerlei Auswirkung auf den zugrunde liegenden Datenbestand.<\/p>\n<p>Sie k&ouml;nnen dies leicht pr&uuml;fen, indem Sie einige Feldwerte &auml;ndern und dann die folgenden beiden Anweisungen in das Programm aufnehmen (ohne Zeilenumbruch):<\/p>\n<pre>Console.WriteLine(\"&lt;Bitte bet&auml;tigen Sie die &lt;Enter&gt;-Taste.\")\nConsole.ReadLine()<\/pre>\n<p>Wenn Sie das Programm zum Bet&auml;tigen der Eingabetaste auffordert, k&ouml;nnen Sie die MDB-Datei &ouml;ffnen und sich die Daten ansehen. Sie werden feststellen, dass keine &auml;nderungen an den Daten durchgef&uuml;hrt wurden. Sie k&ouml;nnen die Datenbank zu diesem Zeitpunkt sogar exklusiv mit Microsoft Access &ouml;ffnen. Dies ist gleichzeitig der Beweis daf&uuml;r, dass die Verbindung vom DataTable-Objekt zur Datenbank vollst&auml;ndig gel&ouml;st wurde. Um die Daten in der zugrunde liegenden Datenbank zu aktualisieren, haben Sie prinzipiell zwei M&ouml;glichkeiten.<\/p>\n<li>Sie k&ouml;nnen die Rows-Auflistung des DataTable-Objekts dazu verwenden, f&uuml;r jede ge&auml;nderte Zeile eine Update-Anweisung zusammenzusetzen und diese per OleDBCommand-Objekt auszuf&uuml;hren. Ob eine Zeile ge&auml;ndert wurde, k&ouml;nnen Sie mit der RowState-Eigenschaft abfragen:<\/li>\n<pre>If row.RowState=DataRowState.Modified Then\n   ...<\/pre>\n<li>Die weitaus komfortablere Methode besteht darin, die beschriebenen Arbeitsschritte dem DataAdapter-Objekt zu &uuml;berlassen.  Dies ist ein klassischer Zweizeiler:<\/li>\n<pre>Dim cb As OleDbCommandBuilder = New _    OleDbCommandBuilder(adp)\nadp.Update(tblAdressen)<\/pre>\n<p><IMG height=\"248\" src=\"..\/fileadmin\/_temp_\/{D470EB58-B776-45FA-8171-E5B68E5E7B54}\/pic006.png\" width=\"500\" border=\"0\"><\/p>\n<p><b><\/b><\/p>\n<p><b>Abb. 6: Mit einem Try-Catch-Block erhalten Sie die Fehlermeldung im Klartext.<\/b><\/p>\n<p>Mit der ersten Anweisung definieren Sie ein OleDBCommandBuilder-Objekt. Durch die Zuweisung mit New OleDBCommandBuilder(adp) veranlassen Sie .NET, dem OleDBCommandBuilder-Objekt automatisch eine UPDATE-, eine INSERT- und eine DELETE-Anweisung hinzuzuf&uuml;gen. Da das OleDBCommandBuilder-Objekt im DataAdapter-Objekt enthalten ist, k&ouml;nnen die SQL-Anweisungen in der anschlie&szlig;enden Update-Anweisung verwendet werden. Sie schreibt die &auml;nderungen in die zugrunde liegende Datentabelle.<\/p>\n<p>Zu diesem Zeitpunkt stellt .NET die Verbindung zur Datenbank wieder her und versucht, die erforderlichen UPDATE-Anweisungen durchzuf&uuml;hren.<\/p>\n<p>Falls die Access-Datenbank nicht verf&uuml;gbar oder exklusiv gesperrt wurde, tritt hierbei ein Fehler auf. In Abb. 5 sehen Sie, dass sich mit der Fehlermeldung nicht allzu viel anfangen l&auml;sst.<\/p>\n<pre>Dim cb As OleDbCommandBuilder = _    New OleDbCommandBuilder(adp)\nTry\n    adp.Update(tblAdressen)\nCatch exOle As OleDbException\n    Console.WriteLine(exOle.ToString)\nCatch ex As Exception\n    Console.WriteLine(ex.Message)\nEnd Try<\/pre>\n<p><b>Quellcode 6<\/b><\/p>\n<p>Es ist deshalb empfehlenswert, die Update-Anweisung in einen Try Catch-Block zu schachteln (s. Quellcode 6). Mit diesen Programmzeilen erhalten Sie zwar noch keine wirkliche Fehlerbehandlung, Sie erreichen aber immerhin die Anzeige der Fehlermeldung im Klartext.<\/p>\n<p>Wenn Sie das Programm nun erneut starten und die Access-Datenbank vor der Ausf&uuml;hrung der Update-Anweisung exklusiv sperren, dann erhalten Sie die Anzeige in Abb. 6.<\/p>\n<p>Die oben beschriebene Vorgehensweise basiert auf einem automatisch generierten UPDATE-Statement. Mit wenigen Programmzeilen k&ouml;nnen Sie den SQL-Text dieses Statements in die Datei C:\\\\Test.TXT exportieren lassen (s. Quellcode 7). Als Ergebnis erhalten Sie die UPDATE-Anweisung aus Abb. 7.<\/p>\n<pre>Dim w As New System.IO.StreamWriter(\"C:\\\\TEST.TXT\")\nw.Write(cb.GetUpdateCommand().CommandText)\nw.Close()<\/pre>\n<p><b>Quellcode 7<\/b><\/p>\n<pre>strSQL = \"SELECT Vorname, Nachname FROM tblAdressen WHERE PLZ LIKE ''''4%''''\"\nDim daFilter As New OleDbDataAdapter(strSQL, cnn)\nDim tblLokaleAdressen As New DataTable\ndaFilter.Fill(tblLokaleAdressen)\nFor Each row In tblLokaleAdressen.Rows\n    Console.WriteLine(row.Item(\"Vorname\").ToString + \" \" + _        row.Item(\"Nachname\").ToString)\nNext\ntblLokaleAdressen = Nothing\ndaFilter.Dispose()<\/pre>\n<p><b>Quellcode 8<\/b><\/p>\n<p><IMG height=\"309\" src=\"..\/fileadmin\/_temp_\/{D470EB58-B776-45FA-8171-E5B68E5E7B54}\/pic007.png\" width=\"500\" border=\"0\"><\/p>\n<p><b><\/b><\/p>\n<p><b>Abb. 7: SQL-Text eines UPDATE-Statements<\/b><\/p>\n<p>.NET f&uuml;hrt diese Anweisung f&uuml;r jede Zeile mit ge&auml;nderten Daten einmal aus. Die Fragezeichen werden dabei durch die Werte der gleichnamigen Felder aus dem DataTable-Objekt ersetzt. <\/p>\n<p>Das OleDBCommandBuilder-Objekt enth&auml;lt &auml;hnliche Anweisungen f&uuml;r die DELETE- und die INSERT-Anweisung.<\/p>\n<h2>Daten filtern<\/h2>\n<p>Ein wichtiger Aspekt beim Abruf von Daten ist die Selektion der ben&ouml;tigten Datens&auml;tze. Im Hinblick auf die verwendeten Ressourcen ist es am g&uuml;nstigsten, die Daten direkt bei der Abfrage zu filtern. Hierzu k&ouml;nnen Sie das SQL-Statement des DataAdapter-Objekts mit einer WHERE-Klausel ausstatten (s. Quellcode 8).<\/p>\n<p>In diesem Beispiel selektieren Sie spalten- und zeilenweise. Das Abfrageergebnis enth&auml;lt nur den Vor- und den Nachnamen der Adressen aus dem Postleitzahlengebiet 4. <\/p>\n<p>Dieses Verfahren hat den Nachteil, dass das Filterkriterium statisch in den SQL-String integriert ist. Wesentlich flexibler ist die Variante, das Filterkriterium als Parameter zu definieren (s. Quellcode 9).<\/p>\n<p>Die Verwendung eines benannten Parameters hat den Vorteil, dass Ihre SQL-Statements besser lesbar sind. Insbesondere bei komplizierten SQL-Statements oder vielen Parametern helfen Ihnen benannte Parameter, Programmierfehler zu vermeiden.<\/p>\n<pre>strSQL = \"SELECT Vorname, Nachname FROM tblAdressen WHERE PLZ = @PLZ\"\nDim daParamFilter As New OleDbDataAdapter(strSQL, cnn)\ndaParamFilter.SelectCommand.Parameters.Add(\"@PLZ\", OleDbType.VarChar, 50).Value = _    \"79102\"\nDim tblParamAdressen As New DataTable\ndaParamFilter.Fill(tblParamAdressen)\nFor Each row In tblParamAdressen.Rows\n    Console.WriteLine(row.Item(\"Vorname\").ToString + \" \" + _        row.Item(\"Nachname\").ToString)\nNext\ntblParamAdressen = Nothing\ndaParamFilter.Dispose()<\/pre>\n<p><b>Quellcode 9<\/b><\/p>\n<pre>Dim RowsSelected() As DataRow\nRowsSelected = tblAdressen.Select(\"PLZ = ''''79102''''\")\nDim i As Integer\nFor i = 0 To RowsSelected.Length - 1\n    Console.WriteLine(RowsSelected(i).Item(\"Vorname\").ToString + \" \" _        + RowsSelected(i).Item(\"Nachname\").ToString)\nNext<\/pre>\n<p><b>Quellcode 10<\/b><\/p>\n<p>Wenn Sie die Daten nicht direkt bei der Abfrage selektieren k&ouml;nnen, benutzen Sie am besten die Select-Methode des DataTable-Objekts.<\/p>\n<p>Die Methode selektiert die DataRow-Objekte aus einem DataTable-Objekt, die dem angegebenen Filterkriterium entsprechen. Als Ergebnis erhalten Sie ein Array von DataRow-Objekten mit den gefundenen Zeilen (s. Quellcode 10).<\/p>\n<h2>Das DataSet-Objekt<\/h2>\n<p>Mit dem DataSet-Objekt k&ouml;nnen Sie mehrere Datentabellen gleichzeitig im Speicher halten. Dies hat den Vorteil, dass Sie mehrere relational verkn&uuml;pfte Tabellen in einem einzigen Objekt verwalten k&ouml;nnen. Das folgende Beispiel definiert ein neues DataSet und f&uuml;llt es mit der Unternehmens- und der Adressentabelle (s. Quellcode 11).<\/p>\n<p>Im Beispiel fungiert die Unternehmenstabelle als Mastertabelle. Die Adressentabelle enth&auml;lt das Feld UnternehmenID, mit dem eine Adresse optional einem Masterdatensatz in der Unternehmenstabelle zugeordnet werden kann.<\/p>\n<p>Eine solche Relation k&ouml;nnen Sie dem DataSet mit folgenden Anweisungen hinzuf&uuml;gen (s. Quellcode 12).<\/p>\n<p>Wenn die Relation einmal definiert ist, k&ouml;nnen Sie nach Bedarf in den Zeilen der Master- und der Detailtabelle bl&auml;ttern. Besonders interessant ist dabei die M&ouml;glichkeit, zu einem Datensatz der Mastertabelle eine Liste der Detaildatens&auml;tze abzufragen. Die GetChildRows-Methode f&uuml;llt hierzu ein Array mit den Row-Objekten der Child-Tabelle. Das folgende Beispiel durchl&auml;uft alle Datens&auml;tze der Unternehmenstabelle und zeigt die jeweils zugeordneten Datens&auml;tze der Adressentabelle an (s. Quellcode 13).<\/p>\n<pre>Dim ds As New DataSet\nstrSQL = \"SELECT * FROM tblUnternehmen\"\nDim daParent As New OleDbDataAdapter(strSQL, cnnString)\ndaParent.Fill(ds, \"tblUnternehmen\")\nstrSQL = \"SELECT * FROM tblAdressen\"\nDim daChild As New OleDbDataAdapter(strSQL, cnnString)\ndaChild.Fill(ds, \"tblAdressen\")<\/pre>\n<p><b>Quellcode 11<\/b><\/p>\n<pre>Dim colParent, colChild As DataColumn\ncolParent = ds.Tables(\"tblUnternehmen\").Columns(\"UnternehmenID\")\ncolChild = ds.Tables(\"tblAdressen\").Columns(\"UnternehmenID\")\nDim relUnternehmenAdressen As New DataRelation(\"relUnternehmenAdressen\", colParent, _    colChild)\nds.Relations.Add(relUnternehmenAdressen)<\/pre>\n<p><b>Quellcode 12<\/b><\/p>\n<pre>'''' Master- und Childatens&auml;tze anzeigen\nDim ChildRows() As DataRow\nDim ParentRow As DataRow\nDim i As Integer\nFor Each ParentRow In ds.Tables(\"tblUnternehmen\").Rows\n    Console.WriteLine(\"**** \" + ParentRow.Item(\"Unternehmen\").ToString _        + \"**** \")\n    ChildRows = ParentRow.GetChildRows(relUnternehmenAdressen)\n    For i = 0 To ChildRows.Length - 1\n        Console.WriteLine(ChildRows(i).Item(\"Vorname\").ToString + \" \" + _            ChildRows(i).Item(\"Nachname\").ToString)\n    Next\nNext<\/pre>\n<p><b>Quellcode 13<\/b><\/p>\n<p>Der obige Beitrag beschreibt die wichtigsten Objekte f&uuml;r den Zugriff auf MDB-Datenbankdateien mit Microsoft .NET. Dar&uuml;ber hinaus k&ouml;nnen Sie mit ADO.NET auch auf andere Datenquellen wie Textdateien, XML-Dateien, SQL Server-Datenbanken und Oracle-Datenbank zugreifen. Mit ODBC erschlie&szlig;en Sie sich zudem ein nahezu unbegrenztes Potenzial an Datenformaten. Die Daten aller Formate lassen sich in DataTable- und DataSet-Objekte laden und dort gemeinsam verarbeiten.<\/p>\n<p>Mit diesen Objekten erhalten Sie deshalb einen relativ hohen Grad der Abstraktion. Aufgrund der verbindungslosen Speicherung der Daten sind die Objekte sowohl f&uuml;r Windows- als auch f&uuml;r Web-Anwendungen geeignet.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Die in Microsoft Access integrierte Programmiersprache VBA unterst&uuml;tzt den Zugriff auf Access-Datenbanken per DAO und ADO. Auch in Microsoft Visual Basic.NET ist mit ADO.NET eine Technik f&uuml;r den Zugriff auf solche Datenbanken enthalten. Der folgende Beitrag beschreibt die wichtigsten Techniken f&uuml;r den lesenden und schreibenden Zugriff auf die Daten einer Access-Datenbank.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"om_disable_all_campaigns":false,"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"_uf_show_specific_survey":0,"_uf_disable_surveys":false,"footnotes":""},"categories":[44000017,662004,66052004,44000035],"tags":[],"class_list":["post-55000233","post","type-post","status-publish","format-standard","hentry","category-NET","category-662004","category-66052004","category-Datenzugriff_programmieren"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.9 (Yoast SEO v27.3) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>ADO.NET - eine Einf&uuml;hrung - Access im Unternehmen<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/access-im-unternehmen.de\/adonet__eine_einfuehrung\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"ADO.NET - eine Einf&uuml;hrung\" \/>\n<meta property=\"og:description\" content=\"Die in Microsoft Access integrierte Programmiersprache VBA unterst&uuml;tzt den Zugriff auf Access-Datenbanken per DAO und ADO. Auch in Microsoft Visual Basic.NET ist mit ADO.NET eine Technik f&uuml;r den Zugriff auf solche Datenbanken enthalten. Der folgende Beitrag beschreibt die wichtigsten Techniken f&uuml;r den lesenden und schreibenden Zugriff auf die Daten einer Access-Datenbank.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/access-im-unternehmen.de\/adonet__eine_einfuehrung\/\" \/>\n<meta property=\"og:site_name\" content=\"Access im Unternehmen\" \/>\n<meta property=\"article:published_time\" content=\"2023-02-10T14:47:22+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-02-19T08:16:20+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/vg02.met.vgwort.de\/na\/3018cd3173a248bebd8272050f70e16d\" \/>\n<meta name=\"author\" content=\"Andr\u00e9 Minhorst\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Verfasst von\" \/>\n\t<meta name=\"twitter:data1\" content=\"Andr\u00e9 Minhorst\" \/>\n\t<meta name=\"twitter:label2\" content=\"Gesch\u00e4tzte Lesezeit\" \/>\n\t<meta name=\"twitter:data2\" content=\"18\u00a0Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/adonet__eine_einfuehrung\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/adonet__eine_einfuehrung\\\/\"},\"author\":{\"name\":\"Andr\u00e9 Minhorst\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\"},\"headline\":\"ADO.NET &#8211; eine Einf&uuml;hrung\",\"datePublished\":\"2023-02-10T14:47:22+00:00\",\"dateModified\":\"2024-02-19T08:16:20+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/adonet__eine_einfuehrung\\\/\"},\"wordCount\":3216,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/adonet__eine_einfuehrung\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg02.met.vgwort.de\\\/na\\\/3018cd3173a248bebd8272050f70e16d\",\"articleSection\":[\".NET\",\"2004\",\"5\\\/2004\",\"Datenzugriff programmieren\"],\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/adonet__eine_einfuehrung\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/adonet__eine_einfuehrung\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/adonet__eine_einfuehrung\\\/\",\"name\":\"ADO.NET - eine Einf&uuml;hrung - Access im Unternehmen\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/adonet__eine_einfuehrung\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/adonet__eine_einfuehrung\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg02.met.vgwort.de\\\/na\\\/3018cd3173a248bebd8272050f70e16d\",\"datePublished\":\"2023-02-10T14:47:22+00:00\",\"dateModified\":\"2024-02-19T08:16:20+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/adonet__eine_einfuehrung\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/adonet__eine_einfuehrung\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/adonet__eine_einfuehrung\\\/#primaryimage\",\"url\":\"http:\\\/\\\/vg02.met.vgwort.de\\\/na\\\/3018cd3173a248bebd8272050f70e16d\",\"contentUrl\":\"http:\\\/\\\/vg02.met.vgwort.de\\\/na\\\/3018cd3173a248bebd8272050f70e16d\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/adonet__eine_einfuehrung\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"ADO.NET &#8211; eine Einf&uuml;hrung\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\",\"name\":\"Access im Unternehmen\",\"description\":\"Das Magazin f\u00fcr Datenbankentwickler auf Basis von Microsoft Access\",\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/access-im-unternehmen.de\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"de\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\",\"name\":\"Andr\u00e9 Minhorst Verlag\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/wp-content\\\/uploads\\\/2019\\\/09\\\/aiu_wp.png\",\"contentUrl\":\"https:\\\/\\\/access-im-unternehmen.de\\\/wp-content\\\/uploads\\\/2019\\\/09\\\/aiu_wp.png\",\"width\":370,\"height\":111,\"caption\":\"Andr\u00e9 Minhorst Verlag\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/logo\\\/image\\\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\",\"name\":\"Andr\u00e9 Minhorst\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g\",\"caption\":\"Andr\u00e9 Minhorst\"}}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"ADO.NET - eine Einf&uuml;hrung - Access im Unternehmen","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/access-im-unternehmen.de\/adonet__eine_einfuehrung\/","og_locale":"de_DE","og_type":"article","og_title":"ADO.NET - eine Einf&uuml;hrung","og_description":"Die in Microsoft Access integrierte Programmiersprache VBA unterst&uuml;tzt den Zugriff auf Access-Datenbanken per DAO und ADO. Auch in Microsoft Visual Basic.NET ist mit ADO.NET eine Technik f&uuml;r den Zugriff auf solche Datenbanken enthalten. Der folgende Beitrag beschreibt die wichtigsten Techniken f&uuml;r den lesenden und schreibenden Zugriff auf die Daten einer Access-Datenbank.","og_url":"https:\/\/access-im-unternehmen.de\/adonet__eine_einfuehrung\/","og_site_name":"Access im Unternehmen","article_published_time":"2023-02-10T14:47:22+00:00","article_modified_time":"2024-02-19T08:16:20+00:00","og_image":[{"url":"http:\/\/vg02.met.vgwort.de\/na\/3018cd3173a248bebd8272050f70e16d","type":"","width":"","height":""}],"author":"Andr\u00e9 Minhorst","twitter_card":"summary_large_image","twitter_misc":{"Verfasst von":"Andr\u00e9 Minhorst","Gesch\u00e4tzte Lesezeit":"18\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/access-im-unternehmen.de\/adonet__eine_einfuehrung\/#article","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/adonet__eine_einfuehrung\/"},"author":{"name":"Andr\u00e9 Minhorst","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f"},"headline":"ADO.NET &#8211; eine Einf&uuml;hrung","datePublished":"2023-02-10T14:47:22+00:00","dateModified":"2024-02-19T08:16:20+00:00","mainEntityOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/adonet__eine_einfuehrung\/"},"wordCount":3216,"commentCount":0,"publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/adonet__eine_einfuehrung\/#primaryimage"},"thumbnailUrl":"http:\/\/vg02.met.vgwort.de\/na\/3018cd3173a248bebd8272050f70e16d","articleSection":[".NET","2004","5\/2004","Datenzugriff programmieren"],"inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/access-im-unternehmen.de\/adonet__eine_einfuehrung\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/access-im-unternehmen.de\/adonet__eine_einfuehrung\/","url":"https:\/\/access-im-unternehmen.de\/adonet__eine_einfuehrung\/","name":"ADO.NET - eine Einf&uuml;hrung - Access im Unternehmen","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/adonet__eine_einfuehrung\/#primaryimage"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/adonet__eine_einfuehrung\/#primaryimage"},"thumbnailUrl":"http:\/\/vg02.met.vgwort.de\/na\/3018cd3173a248bebd8272050f70e16d","datePublished":"2023-02-10T14:47:22+00:00","dateModified":"2024-02-19T08:16:20+00:00","breadcrumb":{"@id":"https:\/\/access-im-unternehmen.de\/adonet__eine_einfuehrung\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/access-im-unternehmen.de\/adonet__eine_einfuehrung\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/adonet__eine_einfuehrung\/#primaryimage","url":"http:\/\/vg02.met.vgwort.de\/na\/3018cd3173a248bebd8272050f70e16d","contentUrl":"http:\/\/vg02.met.vgwort.de\/na\/3018cd3173a248bebd8272050f70e16d"},{"@type":"BreadcrumbList","@id":"https:\/\/access-im-unternehmen.de\/adonet__eine_einfuehrung\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/access-im-unternehmen.de\/"},{"@type":"ListItem","position":2,"name":"ADO.NET &#8211; eine Einf&uuml;hrung"}]},{"@type":"WebSite","@id":"https:\/\/access-im-unternehmen.de\/#website","url":"https:\/\/access-im-unternehmen.de\/","name":"Access im Unternehmen","description":"Das Magazin f\u00fcr Datenbankentwickler auf Basis von Microsoft Access","publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/access-im-unternehmen.de\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"de"},{"@type":"Organization","@id":"https:\/\/access-im-unternehmen.de\/#organization","name":"Andr\u00e9 Minhorst Verlag","url":"https:\/\/access-im-unternehmen.de\/","logo":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/logo\/image\/","url":"https:\/\/access-im-unternehmen.de\/wp-content\/uploads\/2019\/09\/aiu_wp.png","contentUrl":"https:\/\/access-im-unternehmen.de\/wp-content\/uploads\/2019\/09\/aiu_wp.png","width":370,"height":111,"caption":"Andr\u00e9 Minhorst Verlag"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f","name":"Andr\u00e9 Minhorst","image":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/secure.gravatar.com\/avatar\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g","caption":"Andr\u00e9 Minhorst"}}]}},"_links":{"self":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55000233","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/comments?post=55000233"}],"version-history":[{"count":1,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55000233\/revisions"}],"predecessor-version":[{"id":88075291,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55000233\/revisions\/88075291"}],"wp:attachment":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/media?parent=55000233"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/categories?post=55000233"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/tags?post=55000233"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}