{"id":55000245,"date":"2004-12-01T00:00:00","date_gmt":"2020-05-06T15:17:53","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=245"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"Adressverwaltung_mit_NET_Teil_1","status":"publish","type":"post","link":"https:\/\/access-im-unternehmen.de\/Adressverwaltung_mit_NET_Teil_1\/","title":{"rendered":"Adressverwaltung mit .NET, Teil 1"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/vg06.met.vgwort.de\/na\/0dae9da3e1d546f38a34b4385b8b490a\" width=\"1\" height=\"1\" alt=\"\"><\/p>\n<p><b>Manfred Hoffbauer, D&uuml;sseldorf<\/b><\/p>\n<p><b>Mit den Assistenten und Editoren von Microsoft Access k&ouml;nnen Sie Abfragen, Formulare und Berichte entwerfen. Nach wenigen Mausklicks k&ouml;nnen Sie Daten eingeben, bearbeiten und drucken. Das sieht bei Visual Basic.NET anders aus. Hier f&uuml;hrt kein Weg an der Eingabe von Programmcode vorbei. Aber auch hier gibt es Assistenten, die Ihnen das Leben leichter machen. Deshalb gen&uuml;gt der folgende Beitrag, um schon zu einer kleinen Adressverwaltung zu kommen.<\/b><\/p>\n<p>Diese Beitragsreihe zeigt Ihnen anhand einer Adressverwaltung, wie Sie mit .NET Formulare f&uuml;r den Zugriff auf eine Datenbank erstellen. In diesem ersten Teil erstellen Sie zun&auml;chst ein einfaches Formular mit einem Datenblatt zur Anzeige von Adressen. Sie k&ouml;nnen darin Adressen eingeben, &auml;ndern und l&ouml;schen.<\/p>\n<p>Zur Programmierung einer Adressverwaltung mit Microsoft Visual Basic.NET ben&ouml;tigen Sie eine Datenbank und ein Programm. Als Datenbank bietet sich Microsoft Access an. Die Technik f&uuml;r den Datenzugriff auf eine Access-Datenbank wurde bereits in Heft 5\/2004 unter dem Stichwort ADO.NET beschrieben.<\/p>\n<p>Der vorliegende Beitrag besch&auml;ftigt sich haupts&auml;chlich mit der Gestaltung einer Oberfl&auml;che f&uuml;r eine Adressverwaltung. Der Schwerpunkt liegt demnach auf dem Entwurf von Formularen und nicht auf der Datenzugriffstechnik.<\/p>\n<h3>Hinweis<\/h3>\n<p>Die Beispieldaten zu diesem Beitrag befinden sich auf der Heft-CD in der .zip-Datei Adressen.zip. Die Beispieldatenbanken hei&szlig;en Adress97.mdb und Adress00.mdb.<\/p>\n<h2>Neues Combine anlegen<\/h2>\n<p>Die folgenden Beispiele verwenden die kostenlose Entwicklungsumgebung von SharpDevelop.<\/p>\n<p>Nach dem Start des Programms sollten Sie ein neues Combine anlegen. Markieren Sie die Kategorie VBNET und die Schablone Windows-Anwendung. Damit veranlassen Sie SharpDevelop, einen Applikationsrumpf f&uuml;r Windows-Anwendungen anzulegen. Sie erkennen dies unter anderem daran, dass SharpDevelop der Combine ein leeres Formular hinzuf&uuml;gt und es automatisch die Assemblies System.Windows.Forms und System.Drawing importiert.<\/p>\n<p><IMG height=\"455\" src=\"..\/fileadmin\/_temp_\/{369311D9-FC5E-4208-8579-5F8E28FBF3BC}\/pic001.png\" width=\"500\" border=\"0\"><\/p>\n<p><b><\/b><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 1:  W&auml;hlen Sie bei der Anlage der neuen Combine die Schablone Windows-Anwendung aus Liste.<\/span><\/b><\/p>\n<p><IMG height=\"379\" src=\"..\/fileadmin\/_temp_\/{369311D9-FC5E-4208-8579-5F8E28FBF3BC}\/pic002.png\" width=\"500\" border=\"0\"><\/p>\n<p><b><\/b><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 2:  Diesen Programmcode hat der Designer f&uuml;r Sie generiert.<\/span><\/b><\/p>\n<p>Geben Sie den Text Adressen als Name der neuen Combine ein. Nach der Anlage der Combine zeigt SharpDevelop ein Fenster mit dem Programmcode von MainForm.vb. Hierbei handelt es sich um den Quellcode eines leeren Formulars.<\/p>\n<h2>Der Quellcode eines leerenFormulars<\/h2>\n<p>Im Unterschied zu Microsoft Access verf&uuml;gt ein in Microsoft Visual Basic.NET erstelltes Programm nicht &uuml;ber Systemtabellen mit Formularentw&uuml;rfen. Jeder einzelne Bestandteil eines Formulars muss sich vielmehr in einem Programmbefehl widerspiegeln.<\/p>\n<p>Der Programmcode beginnt mit drei Imports-Anweisungen. Sie importieren die Namespaces System, System.Drawing und System.Windows.Forms. Der Import der Namespaces System.Drawing und System.Windows.Forms ist nicht erforderlich, soll aber wohl die h&auml;ufig ben&ouml;tigten Namespaces direkt verf&uuml;gbar machen. Es handelt sich hierbei um eine Besonderheit von SharpDevelop. Wenn Sie mit Microsoft Visual Studio.NET ein neues Formular anlegen, wird standardm&auml;&szlig;ig nur der Namespace System importiert.<\/p>\n<p>Die Namespace DefaultNamespace definiert einen Namespace namens DefaultNamespace f&uuml;r das Formular. Mit den n&auml;chsten zwei Anweisungen geht&#8220;s dann richtig los:<\/p>\n<pre>Public Class MainForm\r\nInherits System.Windows.Forms.Form<\/pre>\n<p>In .NET ist jedes Formular eine Objektklasse, die von der Basisklasse Form vererbt wurde. Die Basisklasse befindet sich im Namespace System.Windows.Forms, der bei der Inherits-Anweisung mit angegeben wurde. Der Name der neuen Objektklasse lautet MainForm. Die n&auml;chsten vier Anweisungen definieren sozusagen das Hauptprogramm der Windows-Anwendung:<\/p>\n<pre>Public Shared Sub Main\r\n    Dim fMainForm As New MainForm\r\n    fMainForm.ShowDialog()\r\nEnd Sub<\/pre>\n<p>Beim Start eines Programms ruft .NET standardm&auml;&szlig;ig die Prozedur namens Main auf. Dies ist also der Einstiegspunkt der Anwendung.<\/p>\n<p>SharpDevelop hat hier automatisch den Programmcode eingef&uuml;gt, der der Variablen fMainForm eine Instanz der Objektklasse MainForm zuweist.<\/p>\n<p>Mit der anschlie&szlig;enden ShowDialog-Methode wird das Formular zur Anzeige gebracht.<\/p>\n<p>Falls Sie die Wirkung einmal ausprobieren wollen, starten Sie das leere Formular mit der F5-Taste. Der Programmablauf stoppt so lange, wie das Formular angezeigt wird. Wenn Sie das Formular schlie&szlig;en, f&uuml;hrt .NET die Anweisung End Sub aus. Dies ist im Beispiel die letzte Anweisung des Programms.<\/p>\n<h3>Hinweis<\/h3>\n<p>Mit der Compileroption \/main k&ouml;nnen Sie auch einen anderen Einstiegspunkt markieren. Visual Studio.NET macht davon insofern Gebrauch, als Sie hier direkt ein Formular f&uuml;r den Programmstart angeben k&ouml;nnen. Es ruft den Compiler dann automatisch mit der entsprechenden Option auf. <\/p>\n<p>Auf die Definition der Main-Prozedur folgt die Definition des Konstruktors f&uuml;r die Objektklasse MainForm. Dieser Programmcode wird immer dann aufgerufen, wenn Sie ein Objekt dieser Klasse instanzieren, also die New()-Methode aufrufen. Die Anweisung<\/p>\n<pre>MyBase.New<\/pre>\n<p>ruft den Konstruktor der Basisklasse Form auf. Die zweite Anweisung<\/p>\n<pre>Me.InitializeComponent<\/pre>\n<p>startet die Prozedur InitializeComponent. Sie finden diese Prozedur im Programmcode der Region Windows Forms Designer generated code. Mit einem Klick auf das Pluszeichen der Region decken Sie den verborgenen Programmcode auf. Die Prozedur enth&auml;lt vier Anweisungen zur Definition des aktuellen Formulars:<\/p>\n<pre>Me.AutoScaleBaseSize = _    New System.Drawing.Size(5, 13)\r\nMe.ClientSize = _    New System.Drawing.Size(292, 266)\r\nMe.Name = \"MainForm\"\r\nMe.Text = \"MainForm\"<\/pre>\n<p>Die beiden ersten Anweisungen definieren die AutoScaleBaseSize-Gr&ouml;&szlig;e und die Gr&ouml;&szlig;e des Formulars in Pixel. Die Eigenschaft Name definiert den Formularnamen und Me.Text den Text der Titelzeile.<\/p>\n<p>Es sei an dieser Stelle ausdr&uuml;cklich darauf hingewiesen, dass Sie den vom Designer automatisch generierten Programmcode nicht &auml;ndern d&uuml;rfen. Eine &auml;nderung kann dazu f&uuml;hren, dass der Designer den Programmcode nicht mehr richtig interpretiert und deshalb die M&ouml;glichkeit zum Wechsel in die Designansicht verloren geht. Die Ursache hierf&uuml;r besteht darin, dass die Programmiersprache Visual Basic.Net weit mehr M&ouml;glichkeiten bietet, als sich im Designer abbilden lassen.<\/p>\n<p>Zum Test k&ouml;nnen Sie aber ausnahmsweise mal eine Ausnahme machen. &auml;ndern Sie die obige Anweisung wie folgt:<\/p>\n<pre>Me.Text = \"Adressen\"<\/pre>\n<p>Achten Sie darauf, dass Sie wirklich die Text- und nicht die Name-Eigenschaft des Formulars &auml;ndern.<\/p>\n<p>Am unteren Rand des Fensters MainForm.vb befindet sich die Registerlasche Design. Ein Mausklick auf die Registerlasche veranlasst SharpDevelop, das Design des Formulars anzuzeigen. Diese Ansicht &auml;hnelt der Entwurfsansicht eines Formulars bei Microsoft Access.<\/p>\n<p>SharpDevelop generiert die Designansicht vollst&auml;ndig aus dem Programmcode. Wie zu erwarten, wird der Text Adressen als Titelzeile des Formulars angezeigt. Falls Sie den Programmcode manuell so ge&auml;ndert haben, dass SharpDevelop ihn nicht mehr verstehen kann, zeigt es eine Fehlermeldung an.<\/p>\n<h2>Die Toolbox<\/h2>\n<p>Mit dem Men&uuml;befehl Ansicht\/Tools blenden Sie die Toolbox ein. Die Elemente der Toolbox sind gruppiert. Die f&uuml;r die Adressverwaltung interessanten Tools sehen Sie nach einem Klick auf den Balken Windows Forms.<\/p>\n<p>Falls das Eigenschaftsfenster nicht sichtbar ist, brauchen Sie nur mit der rechten Maustaste auf einen leeren Bereich des Formularentwurfs zu klicken. W&auml;hlen Sie den Befehl Eigenschaften aus dem Kontextmen&uuml;. Die Bedienung von Toolbox und Eigenschaftsfenster erfolgt &auml;hnlich wie bei Access.<\/p>\n<p>Um das Formular mit Inhalt zu f&uuml;llen, ben&ouml;tigen Sie Steuerelemente und Programmcode. Beides werden Sie in den kommenden Abschnitten zu einer kleinen Anwendung zusammenstellen. Am Ende verf&uuml;gen Sie &uuml;ber ein Formular, mit dem Sie Adressen aus der Access-Datenbank in ein DataGrid-Steuerelement einlesen, dort bearbeiten und wieder in der zugrunde liegenden Tabelle speichern k&ouml;nnen.<\/p>\n<p><!--30percent--><\/p>\n<p><IMG height=\"394\" src=\"..\/fileadmin\/_temp_\/{369311D9-FC5E-4208-8579-5F8E28FBF3BC}\/pic003.png\" width=\"500\" border=\"0\"><\/p>\n<p><b><\/b><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 3:  Die Designansicht &auml;hnelt dem Formularentwurf von Microsoft Access.<\/span><\/b><\/p>\n<p><IMG height=\"316\" src=\"..\/fileadmin\/_temp_\/{369311D9-FC5E-4208-8579-5F8E28FBF3BC}\/pic004.png\" width=\"500\" border=\"0\"><\/p>\n<p><b><\/b><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 4:  Das Formular enth&auml;lt ein DataGrid- und ein Button-Steuerelement.<\/span><\/b><\/p>\n<h2>Adressen einlesen<\/h2>\n<p>Mit dem DataGrid-Steuerelement verf&uuml;gt Microsoft .NET &uuml;ber eine &auml;hnliche Darstellungsm&ouml;glichkeit f&uuml;r Daten wie die Datenbl&auml;tter von Microsoft Access. Zur Anordnung eines solchen Steuerelements gehen Sie wie folgt vor:<\/p>\n<li>Falls nicht bereits geschehen, &ouml;ffnen Sie mit Ansicht\/Tools die Toolbox von SharpDevelop.<\/li>\n<li>Klicken Sie in der Toolbox auf den Balken Windows Forms.<\/li>\n<li>Markieren Sie das Tool DataGrid.<\/li>\n<li>Klicken Sie auf den leeren Bereich des Entwurfs. (<\/li>\n<p>Damit verf&uuml;gen Sie &uuml;ber ein neues, leeres DataGrid-Steuerelement. Nun ben&ouml;tigen Sie noch den Programmcode, der das DataGrid-Steuerelement mit Daten f&uuml;llt. Zur Anordnung des Programmcodes empfiehlt sich eine Schaltfl&auml;che. Um diese anzulegen, gehen Sie wie folgt vor:<\/p>\n<li>Markieren Sie das Steuerelement Button in der Toolbox.<\/li>\n<li>Klicken Sie an die Stelle des Formulars, an der SharpDevelop das Steuerelement anordnen soll.<\/li>\n<li>Falls es nicht bereits angezeigt wird, &ouml;ffnen Sie das Eigenschaftenfenster durch einen Klick auf den gleichnamigen Befehl des Kontextmen&uuml;s.<\/li>\n<li>&auml;ndern Sie die Eigenschaft Name des Buttons auf btnLesen.<\/li>\n<li>&auml;ndern Sie die Eigenschaft Text des Buttons auf Lesen. (<\/li>\n<h2>Ein Button-Steuerelement mit Code hinterlegen<\/h2>\n<p>Im n&auml;chsten Schritt m&uuml;ssen Sie dem Button Programmcode hinzuf&uuml;gen. F&uuml;hren Sie dazu einen Doppelklick auf das Button-Steuerelement durch. Damit l&ouml;sen Sie gleich mehrere Aktionen aus:<\/p>\n<pre>Private Sub LeseAdressen()\r\n    Dim adp As OleDbDataAdapter\r\n    Dim tblAdressen As DataTable\r\n    Dim dsAdressen As New DataSet\r\n    Dim cnn As OleDbConnection\r\n    tblAdressen = dsAdressen.Tables.Add(\"tblAdressen\")\r\n    cnn = New OleDbConnection(m_CnnString)\r\n    cnn.Open()\r\n    adp = New OleDbDataAdapter(\"SELECT * FROM tblAdressen\", cnn)\r\n    adp.Fill(tblAdressen)\r\n    Me.DataGrid1.SetDataBinding(dsAdressen, \"tblAdressen\")\r\n    adp.Dispose()\r\n    cnn.Close()\r\nEnd Sub<\/pre>\n<p><b>Quellcode 1<\/b><\/p>\n<li>SharpDevelop wechselt automatisch in die Ansicht Quellcode.<\/li>\n<li>Dort finden Sie eine neue Prozedur namens BtnLesenClick.<\/li>\n<p>Die neu hinzugef&uuml;gte Prozedur enth&auml;lt noch keinen Programmcode. Auf den ersten Blick verwunderlich ist die Tatsache, dass die neue Prozedur keine offensichtliche Verbindung zu der Schaltfl&auml;che hat. Um das Geheimnis zu l&uuml;ften, sollten Sie sich die Prozedur InitializeComponent noch einmal etwas genauer ansehen.<\/p>\n<p>Der Designer hat hier jede Menge Programmcode hinzugef&uuml;gt. F&uuml;r jedes der beiden Steuerelemente finden Sie den Programmcode, der die Position, den Namen und weitere Eigenschaften definiert. Die Verbindung zwischen dem Button-Steuerelement und der Prozedur BtnLesenClick stellt die folgende Anweisung her:<\/p>\n<pre>AddHandler Me.btnLesen.Click, _    AddressOf Me.BtnLesenClick<\/pre>\n<p>Diese Anweisung f&uuml;gt dem Programm einen so genannten Ereignishandler f&uuml;r das Ereignis Me.btnLesen.Click hinzu. Dieses Ereignis wird immer dann ausgel&ouml;st, wenn der Anwender auf die Schaltfl&auml;che btnLesen klickt. Der Ereignishandler startet in diesem Fall die Prozedur BtnLesenClick.<\/p>\n<h2>Programmcode zum Lesen der Adressentabelle<\/h2>\n<p>Das Lesen der Adressentabelle sollte m&ouml;glichst in einer in sich abgeschlossenen Prozedur erfolgen.  Sie sparen sich Schreibarbeit, wenn Sie zuerst die Liste der Imports-Anweisungen um folgende Zeilen erweitern:<\/p>\n<pre>Imports System.Data\r\nImports System.Data.OleDb<\/pre>\n<p>Den ben&ouml;tigten ConnectionString sollten Sie in einer globalen Konstante hinterlegen. Damit die Variable in allen Prozeduren der Klasse zu sehen ist, sollten Sie unmittelbar nach der Inherits-Anweisung die folgende Anweisung einf&uuml;gen (in einer Zeile):<\/p>\n<pre>Const m_CnnString = \"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\\Daten\\Haufe\\Adressen\\Adress00.mdb\"<\/pre>\n<p>Es handelt sich hierbei um den OleDb-Connection-String f&uuml;r den Zugriff auf die Beispieldatenbank. Die Angabe von Laufwerk und Pfad m&uuml;ssen Sie den Gegebenheiten Ihres PCs anpassen.<\/p>\n<p>Das Einlesen der Adressentabelle soll in einer eigenen Prozedur namens LeseAdressen erfolgen (s. Quellcode 1). Zu Beginn der Prozedur werden zun&auml;chst die ben&ouml;tigten Objektvariablen deklariert. Um das DataGrid-Objekt sp&auml;ter mit Daten f&uuml;llen zu k&ouml;nnen, ben&ouml;tigen Sie auf jeden Fall ein DataSet-Objekt.<\/p>\n<p>Objekte dieses Typs beinhalten eine oder mehrere Tabellen und bei Bedarf auch die Beziehungen zwischen diesen Tabellen. Im konkreten Beispiel verwenden wir das DataSet-Objekt nur, weil ein DataTable-Objekt nicht als Datenherkunft f&uuml;r ein DataGrid-Objekt erlaubt ist. Das DataSet-Objekt wird nur eine Tabelle enthalten.<\/p>\n<p>Dem Objekt dsAdressen wird in der gleichen Programmzeile, in der die Deklaration erfolgt, eine neue Objektinstanz eines DataSet-Objekts zugewiesen:<\/p>\n<pre>Private Sub LeseAdressen()\r\nDim adp As OleDbDataAdapter\r\nDim tblAdressen As DataTable\r\nDim dsAdressen As New DataSet\r\nDim cnn As OleDbConnection<\/pre>\n<p>Die folgende Anweisung f&uuml;gt dem DataSet dsAdressen eine neue Tabelle hinzu. Die Add-Methode gibt hierbei eine DataTable zur&uuml;ck, die dem DataTable-Objekt tblAdressen zugewiesen wird. Diese Vorgehensweise hat den Vorteil, dass der Name der im DataSet enthaltenen Tabelle klar definiert ist.<\/p>\n<p>Alternativ k&ouml;nnen Sie auch zuerst ein DataTable-Objekt definieren und dieses dann der Tabellenauflistung des DataSet-Objekts hinzuf&uuml;gen. Dann erh&auml;lt das erste Objekt den Namen Table1, das zweite den Namen Table2 und so weiter. Bei Verwendung des hier vorgestellten Verfahrens hei&szlig;t die Tabelle im DataSet-Objekt tblAdressen.<\/p>\n<p>Auf das Hinzuf&uuml;gen des DataTable- zum DataSet-Objekt folgen die Anweisungen, die eine Connection zur Access-Datenbank &ouml;ffnen und das DataTable-Objekt mit dem Inhalt der Adressentabelle f&uuml;llen:<\/p>\n<pre>tblAdressen = _    dsAdressen.Tables.Add(\"tblAdressen\")\r\ncnn = New OleDbConnection(m_CnnString)\r\ncnn.Open()\r\nadp = New OleDbDataAdapter_    (\"SELECT * FROM tblAdressen\", cnn)\r\nadp.Fill(tblAdressen)<\/pre>\n<p>Nach Ausf&uuml;hrung der Fill-Methode enth&auml;lt das DataTable-Objekt tblAdressen eine Liste aller Adressen aus der Access-Datenbank. Beachten Sie, dass das tblAdressen-Objekt im DataSet-Objekt enthalten ist. Die nun folgende Anweisung &uuml;bergibt die Adressentabelle an das DataGrid-Objekt:<\/p>\n<pre>Me.DataGrid1.SetDataBinding(dsAdressen, \"tblAdressen\")\r\nadp.Dispose()\r\ncnn.Close()\r\nEnd Sub<\/pre>\n<p>Abschlie&szlig;end werden die nun nicht mehr ben&ouml;tigten Ressourcen freigegeben. Das bedeutet, dass das DataAdapter-Objekt gel&ouml;scht und die Connection geschlossen wird.<\/p>\n<p>Eine Einf&uuml;hrung in den Datenzugriff mit ADO.NET finden Sie in Heft 5\/2004. <\/p>\n<p>Abschlie&szlig;end m&uuml;ssen Sie die neu programmierte Prozedur noch aufrufen. F&uuml;gen Sie dazu in den Rumpf der Prozedur BtnLesenClick die folgenden Anweisungen ein:<\/p>\n<pre>Try\r\n    LeseAdressen()\r\n    Catch ex As Exception\r\n    MessageBox.Show(ex.ToString())\r\nEnd Try<\/pre>\n<p>Diese Anweisungen rufen die Prozedur LeseAdressen auf. Falls w&auml;hrend der Ausf&uuml;hrung dieser Prozedur ein Fehler auftritt, wird dieser abgefangen und der Fehlertext in einer Dialogbox angezeigt. Nun k&ouml;nnen Sie das Programm durch das Bet&auml;tigen der F5-Taste starten. Um die Daten aus der Adressentabelle einzulesen, klicken Sie in dem sich &ouml;ffnenden Formular auf die Schaltfl&auml;che Lesen.<\/p>\n<p>Nach dem Einlesen stehen die Adressdaten erstmal im DataGrid. Das DataGrid enth&auml;lt einen Datensatzmarkierer, der dem von Access &auml;hnlich sieht. Sie k&ouml;nnen die Daten innerhalb des DataGrids &auml;ndern, neue Zeilen hinzuf&uuml;gen und bestehende Zeilen l&ouml;schen.<\/p>\n<p><IMG height=\"316\" src=\"..\/fileadmin\/_temp_\/{369311D9-FC5E-4208-8579-5F8E28FBF3BC}\/pic005.png\" width=\"500\" border=\"0\"><\/p>\n<p><b><\/b><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 5:  Das DataGrid-Steuerelement zeigt die Daten aus einer Access-Tabelle an.<\/span><\/b><\/p>\n<p>Aber warum lassen sich die Daten bei geschlossener Connection bearbeiten Der Grund besteht darin, dass .NET die verbindungslose Datenverarbeitung erm&ouml;glicht.<\/p>\n<p>Das erneute Herstellen der Verbindung zur Datenquelle ist erst bei der Aktualisierung der Datens&auml;tze erforderlich. Falls Sie dies ernsthaft testen wollen, k&ouml;nnen Sie die Beispieldatenbank nach dem Einlesen der Daten in ein anderes Verzeichnis verschieben.<\/p>\n<p>Danach ist die Eingabe und Bearbeitung von Daten weiterhin m&ouml;glich. Erst beim erneuten Einlesen der Daten erhalten Sie eine Fehlermeldung.<\/p>\n<h2>Daten &auml;ndern und speichern<\/h2>\n<pre>Private Sub SchreibeAdressen()\r\n    Dim dsAdressen As DataSet\r\n    Dim tblAdressen As DataTable\r\n    dsAdressen = Me.DataGrid1.DataSource\r\n    tblAdressen = dsAdressen.Tables(\"tblAdressen\")\r\n    Dim adp As OleDbDataAdapter\r\n    Dim cnn As OleDbConnection\r\n    cnn = New OleDbConnection(m_CnnString)\r\n    cnn.Open()\r\n    adp = New OleDbDataAdapter(\"SELECT * FROM tblAdressen\", cnn)\r\n    Dim cb As OleDbCommandBuilder = New OleDbCommandBuilder(adp)\r\n    adp.Update(tblAdressen)\r\n    adp.Dispose()\r\n    cnn.Close()\r\nEnd Sub<\/pre>\n<p><b>Quellcode 2<\/b><\/p>\n<p>Um die Daten aus dem DataGrid wieder in die zugrunde liegende Tabelle zu schreiben, ist ein zweiter Button erforderlich. Zur Anlage des Buttons gehen Sie wie folgt vor:<\/p>\n<li>Wechseln Sie in die Design-Ansicht des Formulars.<\/li>\n<li>Markieren Sie in der Gruppe Windows Forms das Tool Button.<\/li>\n<li>Klicken Sie auf den Entwurfsbereich des Formulars.<\/li>\n<li>Geben Sie btnSchreiben in die Name-Eigenschaft des Buttons ein. <\/li>\n<li>Geben Sie Schreiben in die Text-Eigenschaft des Buttons ein.<\/li>\n<li>Klicken Sie doppelt auf den Button, damit SharpDevelop den Eingabebereich f&uuml;r die Ereignisprozedur des Buttons &ouml;ffnet. (<\/li>\n<p>Geben Sie f&uuml;r den Button den folgenden Programmcode ein:<\/p>\n<pre>Try\r\n    SchreibeAdressen()\r\n    Catch ex As Exception\r\n    MessageBox.Show(ex.ToString())\r\nEnd Try<\/pre>\n<p>Die Zeile SchreibeAdressen() ruft die gleichnamige Prozedur auf. Die Try Catch-Anweisung schachtelt den Aufruf und f&auml;ngt eventuell auftretende Fehler ab. Falls ein Fehler auftritt, wird die Meldung in einer MessageBox angezeigt. Damit l&auml;sst sich zwar die Fehlerursache nicht beheben, Sie k&ouml;nnen aber den Fehlertext lesen, ohne dass das Programm abst&uuml;rzt. Der Programmcode f&uuml;r die Prozedur SchreibeAdressen lautet wie in Quellcode 2.<\/p>\n<p>Die Prozedur entnimmt als Erstes die zu schreibenden Daten aus der Datenquelle des DataGrid-Steuerelements. Die Zuweisung an das DataSet-Objekt dsAdressen &uuml;bernimmt die folgende Anweisung:<\/p>\n<pre>dsAdressen = Me.DataGrid1.DataSource<\/pre>\n<p>Ein DataSet kann mehrere Tabellen enthalten. Der verwendete DataAdapter enth&auml;lt aber nur die Verbindung zu der Tabelle tblAdressen. Deshalb m&uuml;ssen Sie die Tabelle tblAdressen aus der Tables-Auflistung des DataSet-Objekts einem DataTable-Objekt zuweisen. Mit dem definierten OleDbCommandBuilder-Objekt k&ouml;nnen Sie die Aktualisierung der Daten dann dem .NET-Framework &uuml;berlassen. Die folgende Anweisung f&uuml;hrt automatisch die erforderlichen UPDATE-, INSERT- und DELETE-Anweisungen durch:<\/p>\n<pre>adp.Update(tblAdressen)<\/pre>\n<h2>Vor- und Nachteile der beschriebenen Methode<\/h2>\n<p>Der wohl wichtigste Vorteil des hier beschriebenen Verfahrens besteht darin, dass es sehr einfach zu implementieren ist. Es sind nur wenige Programmzeilen erforderlich, um die Daten in das DataGrid-Steuerelement zu lesen und sie von dort wieder in die zugrunde liegende Tabelle zu schreiben.<\/p>\n<p>Unter Verwendung von globalen Objektvariablen f&uuml;r das Connection-, das DataAdapter-, das DataTable- und das DataSet-Objekt lie&szlig;e sich der Programmcode sogar noch weiter reduzieren. Darauf wurde aber zugunsten der besseren Verdeutlichung der Verbindungslosigkeit im DataGrid-Objekt verzichtet.<\/p>\n<p>Der gr&ouml;&szlig;te Nachteil der verwendeten Methode besteht wohl darin, dass Sie relativ wenig Kontrolle &uuml;ber die Eingaben des Anwenders haben. So kann der Anwender ohne Weiteres auch Werte in das Feld AnredeID eingeben, die in der Tabelle tblAnreden nicht vorhanden sind. Hier ist eine Programmiertechnik erforderlich, mit der sich die &uuml;berpr&uuml;fung der Eingaben pro Feld durchf&uuml;hren l&auml;sst.<\/p>\n<p>Ein Nachteil des DataGrid-Steuerelements in dieser einfachen Form besteht darin, dass Sie nicht &uuml;ber Steuerelemente f&uuml;r Benutzereingaben verf&uuml;gen. So w&auml;re es beispielsweise einfacher, die Anrede aus einem Kombinationsfeld auszuw&auml;hlen. Hierf&uuml;r ben&ouml;tigen Sie eine Gruppe von Steuerelementen zur Bearbeitung eines einzelnen Datensatzes. Innerhalb des DataGrids l&auml;sst sich das nicht realisieren.<\/p>\n<p>Ein weiterer Nachteil der beschriebenen L&ouml;sung besteht darin, dass Fehlermeldungen nur begrenzt im Klartext angezeigt werden. Sie k&ouml;nnen dies einmal ausprobieren, indem Sie zwei neue Datens&auml;tze eingeben. Weisen Sie dem Feld EntryID des ersten Datensatzes den Wert 1 und dem Feld Vorname den Wert Tom und dem Feld EntryID des zweiten Datensatzes den Wert 2 und dem Feld Vorname den Wert Ria zu.<\/p>\n<p><IMG height=\"272\" src=\"..\/fileadmin\/_temp_\/{369311D9-FC5E-4208-8579-5F8E28FBF3BC}\/pic006.png\" width=\"500\" border=\"0\"><\/p>\n<p><b><\/b><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 6:  Mit dieser Fehlermeldung kann der Anwender vermutlich nicht viel anfangen.<\/span><\/b><\/p>\n<p>Um die Datens&auml;tze in der zugrunde liegenden Tabelle zu speichern, klicken Sie auf den Button Schreiben. <\/p>\n<p>Obwohl dem AutoWert-Feld in der zugrunde liegenden Tabelle sofort ein Integer-Wert zugewiesen wird, beh&auml;lt das Feld AdressID im DataGrid den Wert (Null).<\/p>\n<p>Wenn Sie nun die Vornamen der beiden Datens&auml;tze erneut &auml;ndern und Sie nochmal auf Speichern klicken, dann erhalten Sie die Fehlermeldung in Abbildung 6.<\/p>\n<p>Mit dem Fehlertext Parallelit&auml;tsverletzung kann ein Anwender vermutlich nicht viel anfangen. Aus dem Ablauf l&auml;sst sich die Fehlerursache aber eventuell erkl&auml;ren: Beim ersten Speichern werden die Datens&auml;tze an die zugrunde liegende Tabelle angef&uuml;gt.<\/p>\n<p>Beim zweiten Speichern sollen die bestehende Datens&auml;tze aktualisiert werden. Das Problem besteht aber nun darin, dass die Daten im Feld AdressID aufgrund des AutoWert-Feldes in der Tabelle von denen im DataGrid abweichen.<\/p>\n<p>Deshalb kommt es bei der Aktualisierung zu Komplikationen. Diese k&ouml;nnen Sie vermeiden, indem Sie nach jedem Speichervorgang die Daten direkt wieder lesen.<\/p>\n<p>F&uuml;gen Sie dazu einfach den entsprechenden Prozeduraufruf in den Programmcode ein.<\/p>\n<p>Sie haben in diesem Beitrag eine einfache und schnell zu implementierende M&ouml;glichkeit kennen gelernt, mit der Sie Daten aus einer Access-Tabelle lesen, bearbeiten und die ge&auml;nderten Daten speichern k&ouml;nnen.<\/p>\n<p>Die Methode hat aber verschiedene Nachteile, zu deren Vermeidung weit mehr Komponenten erforderlich sind. Sie ben&ouml;tigen unter anderem<\/p>\n<li>Steuerelemente, um jedes Datenfeld einzeln bearbeiten zu k&ouml;nnen, und<\/li>\n<li>Programmcode, der die Daten vor dem Speichern &uuml;berpr&uuml;ft.<\/li>\n<p>Im zweiten Teil dieser Beitragsreihe erfahren Sie, wie Sie ein Formular mit einem Listenfeld zur Auswahl einer Adresse und zur Anzeige der entsprechenden Detaildaten erstellen.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Mit den Assistenten und Editoren von Microsoft Access k&ouml;nnen Sie Abfragen, Formulare und Berichte entwerfen. Nach wenigen Mausklicks k&ouml;nnen Sie Daten eingeben, bearbeiten und drucken. Das sieht bei Visual Basic.NET anders aus. Hier f&uuml;hrt kein Weg an der Eingabe von Programmcode vorbei. Aber auch hier gibt es Assistenten, die Ihnen das Leben leichter machen. Deshalb gen&uuml;gt der folgende Beitrag, um schon zu einer kleinen Adressverwaltung zu kommen.<\/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,66062004,44000027],"tags":[],"class_list":["post-55000245","post","type-post","status-publish","format-standard","hentry","category-NET","category-662004","category-66062004","category-Loesungen"],"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>Adressverwaltung mit .NET, Teil 1 - 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\/Adressverwaltung_mit_NET_Teil_1\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Adressverwaltung mit .NET, Teil 1\" \/>\n<meta property=\"og:description\" content=\"Mit den Assistenten und Editoren von Microsoft Access k&ouml;nnen Sie Abfragen, Formulare und Berichte entwerfen. Nach wenigen Mausklicks k&ouml;nnen Sie Daten eingeben, bearbeiten und drucken. Das sieht bei Visual Basic.NET anders aus. Hier f&uuml;hrt kein Weg an der Eingabe von Programmcode vorbei. Aber auch hier gibt es Assistenten, die Ihnen das Leben leichter machen. Deshalb gen&uuml;gt der folgende Beitrag, um schon zu einer kleinen Adressverwaltung zu kommen.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/access-im-unternehmen.de\/Adressverwaltung_mit_NET_Teil_1\/\" \/>\n<meta property=\"og:site_name\" content=\"Access im Unternehmen\" \/>\n<meta property=\"article:published_time\" content=\"2020-05-06T15:17:53+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/vg06.met.vgwort.de\/na\/0dae9da3e1d546f38a34b4385b8b490a\" \/>\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=\"17\u00a0Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Adressverwaltung_mit_NET_Teil_1\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Adressverwaltung_mit_NET_Teil_1\\\/\"},\"author\":{\"name\":\"Andr\u00e9 Minhorst\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\"},\"headline\":\"Adressverwaltung mit .NET, Teil 1\",\"datePublished\":\"2020-05-06T15:17:53+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Adressverwaltung_mit_NET_Teil_1\\\/\"},\"wordCount\":3092,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Adressverwaltung_mit_NET_Teil_1\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg06.met.vgwort.de\\\/na\\\/0dae9da3e1d546f38a34b4385b8b490a\",\"articleSection\":[\".NET\",\"2004\",\"6\\\/2004\",\"L\u00f6sungen\"],\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Adressverwaltung_mit_NET_Teil_1\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Adressverwaltung_mit_NET_Teil_1\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Adressverwaltung_mit_NET_Teil_1\\\/\",\"name\":\"Adressverwaltung mit .NET, Teil 1 - Access im Unternehmen\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Adressverwaltung_mit_NET_Teil_1\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Adressverwaltung_mit_NET_Teil_1\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg06.met.vgwort.de\\\/na\\\/0dae9da3e1d546f38a34b4385b8b490a\",\"datePublished\":\"2020-05-06T15:17:53+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Adressverwaltung_mit_NET_Teil_1\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Adressverwaltung_mit_NET_Teil_1\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Adressverwaltung_mit_NET_Teil_1\\\/#primaryimage\",\"url\":\"http:\\\/\\\/vg06.met.vgwort.de\\\/na\\\/0dae9da3e1d546f38a34b4385b8b490a\",\"contentUrl\":\"http:\\\/\\\/vg06.met.vgwort.de\\\/na\\\/0dae9da3e1d546f38a34b4385b8b490a\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Adressverwaltung_mit_NET_Teil_1\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Adressverwaltung mit .NET, Teil 1\"}]},{\"@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":"Adressverwaltung mit .NET, Teil 1 - 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\/Adressverwaltung_mit_NET_Teil_1\/","og_locale":"de_DE","og_type":"article","og_title":"Adressverwaltung mit .NET, Teil 1","og_description":"Mit den Assistenten und Editoren von Microsoft Access k&ouml;nnen Sie Abfragen, Formulare und Berichte entwerfen. Nach wenigen Mausklicks k&ouml;nnen Sie Daten eingeben, bearbeiten und drucken. Das sieht bei Visual Basic.NET anders aus. Hier f&uuml;hrt kein Weg an der Eingabe von Programmcode vorbei. Aber auch hier gibt es Assistenten, die Ihnen das Leben leichter machen. Deshalb gen&uuml;gt der folgende Beitrag, um schon zu einer kleinen Adressverwaltung zu kommen.","og_url":"https:\/\/access-im-unternehmen.de\/Adressverwaltung_mit_NET_Teil_1\/","og_site_name":"Access im Unternehmen","article_published_time":"2020-05-06T15:17:53+00:00","og_image":[{"url":"http:\/\/vg06.met.vgwort.de\/na\/0dae9da3e1d546f38a34b4385b8b490a","type":"","width":"","height":""}],"author":"Andr\u00e9 Minhorst","twitter_card":"summary_large_image","twitter_misc":{"Verfasst von":"Andr\u00e9 Minhorst","Gesch\u00e4tzte Lesezeit":"17\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/access-im-unternehmen.de\/Adressverwaltung_mit_NET_Teil_1\/#article","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/Adressverwaltung_mit_NET_Teil_1\/"},"author":{"name":"Andr\u00e9 Minhorst","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f"},"headline":"Adressverwaltung mit .NET, Teil 1","datePublished":"2020-05-06T15:17:53+00:00","mainEntityOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Adressverwaltung_mit_NET_Teil_1\/"},"wordCount":3092,"commentCount":0,"publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Adressverwaltung_mit_NET_Teil_1\/#primaryimage"},"thumbnailUrl":"http:\/\/vg06.met.vgwort.de\/na\/0dae9da3e1d546f38a34b4385b8b490a","articleSection":[".NET","2004","6\/2004","L\u00f6sungen"],"inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/access-im-unternehmen.de\/Adressverwaltung_mit_NET_Teil_1\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/access-im-unternehmen.de\/Adressverwaltung_mit_NET_Teil_1\/","url":"https:\/\/access-im-unternehmen.de\/Adressverwaltung_mit_NET_Teil_1\/","name":"Adressverwaltung mit .NET, Teil 1 - Access im Unternehmen","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Adressverwaltung_mit_NET_Teil_1\/#primaryimage"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Adressverwaltung_mit_NET_Teil_1\/#primaryimage"},"thumbnailUrl":"http:\/\/vg06.met.vgwort.de\/na\/0dae9da3e1d546f38a34b4385b8b490a","datePublished":"2020-05-06T15:17:53+00:00","breadcrumb":{"@id":"https:\/\/access-im-unternehmen.de\/Adressverwaltung_mit_NET_Teil_1\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/access-im-unternehmen.de\/Adressverwaltung_mit_NET_Teil_1\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/Adressverwaltung_mit_NET_Teil_1\/#primaryimage","url":"http:\/\/vg06.met.vgwort.de\/na\/0dae9da3e1d546f38a34b4385b8b490a","contentUrl":"http:\/\/vg06.met.vgwort.de\/na\/0dae9da3e1d546f38a34b4385b8b490a"},{"@type":"BreadcrumbList","@id":"https:\/\/access-im-unternehmen.de\/Adressverwaltung_mit_NET_Teil_1\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/access-im-unternehmen.de\/"},{"@type":"ListItem","position":2,"name":"Adressverwaltung mit .NET, Teil 1"}]},{"@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\/55000245","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=55000245"}],"version-history":[{"count":0,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55000245\/revisions"}],"wp:attachment":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/media?parent=55000245"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/categories?post=55000245"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/tags?post=55000245"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}