{"id":55000009,"date":"2015-02-01T00:00:00","date_gmt":"2020-08-25T08:43:14","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=9"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"Datenzugriff_mit_ADONET_Teil_1","status":"publish","type":"post","link":"https:\/\/vbentwickler.de\/Datenzugriff_mit_ADONET_Teil_1\/","title":{"rendered":"Datenzugriff mit ADO.NET, Teil 1"},"content":{"rendered":"<p><b>Wer lange mit Access gearbeitet hat, dem ist der Datenzugriff &uuml;ber die DAO-Bibliothek mit dem Recordset-Objekt, das Bearbeiten mit AddNew, Update und Edit sowie das Formulieren von SQL-Aktionsabfragen f&uuml;r die Execute-Anweisung in Fleisch und Blut &uuml;bergegangen. Nun hei&szlig;t es umdenken: Unter der Datenzugriffsbibliothek ADO.NET sieht vieles anders aus. Diese Artikelreihe zeigt, wie Sie die unter Access gelernten Abl&auml;ufe auch mit Visual Studio unter C#\/ADO.NET programmieren k&ouml;nnen.<\/b><\/p>\n<p>ADO.NET ist nicht etwa der Nachfolger der zwischenzeitlich aufgekommenen ADODB-Bibliothek, die Sie auch in Access nutzen konnten (und k&ouml;nnen). Es ist eine komplett neue Bibliothek, die Microsoft f&uuml;r das .NET-Framework geschaffen hat.<\/p>\n<p>ADO.NET bietet teilweise Datenzugriff mit offener Verbindung, teilweise verbindungslosen Zugriff an. Unter Access k&ouml;nnen Sie beispielsweise ein ADODB-Recordset mit den Daten einer Tabelle f&uuml;llen und dann die Verbindung l&ouml;sen, um die Daten zu ver&auml;ndern, ohne dass sich dies auf die zugrunde liegende Tabelle auswirkt. Dies geschieht mit vielen Objekten unter ADO.NET genauso.<\/p>\n<p><b>Provider<\/b><\/p>\n<p>Unter Access konnten Sie entweder direkt &uuml;ber die <b>CurrentDb<\/b>&#8211; oder die <b>OpenDatabase<\/b>-Funktion ein <b>Database<\/b>-Objekt referenzieren und dann mit Methoden wie <b>Execute<\/b>, <b>OpenRecordset <\/b>et cetera schreibend oder lesend\/schreibend auf die Daten zugreifen. Oder Sie haben per ODBC mit einer entsprechenden Verbindungszeichenfolge auf weitere Datenbanken wie MySQL oder Microsoft SQL Server zugegriffen. Unter C# sieht dies etwas anders aus.<\/p>\n<p>Hier verwenden Sie zwar auch noch eine Verbindungszeichenfolge, jedoch legen Sie sich bereits zuvor auf einen Datenprovider fest.<\/p>\n<p>Es gibt beispielsweise die folgenden Provider:<\/p>\n<ul>\n<li><b>SqlClient<\/b>: Microsoft SQL Server<\/li>\n<li><b>OleDb<\/b>: Zugriff &uuml;ber einen OleDb-Provider, beispielsweise f&uuml;r den Zugriff auf Access-Datenbanken.<\/li>\n<li><b>Odbc<\/b>: Zugriff auf Datenbanken &uuml;ber den jeweiligen ODBC-Treiber, zum Beispiel auf MySQL-Datenbanken oder &auml;ltere Access-Datenbanken wie Access 97.<\/li>\n<\/ul>\n<p>Je nachdem, welchen Sie ben&ouml;tigen, f&uuml;gen Sie Ihrer Klasse einen Verweis auf den jeweiligen Namespace hinzu:<\/p>\n<pre>\/\/F&uuml;r OleDb:\r\nusing System.Data.OleDb;\r\n\/\/F&uuml;r Odbc:\r\nusing System.Data.Odbc;\r\n\/\/F&uuml;r SQL Server:\r\nusing System.Data.SqlClient;<\/pre>\n<p><b>Beispieldatenbank<\/b><\/p>\n<p>F&uuml;r die Beispiele dieses Artikels verwenden wir eine Access-Datenbank, da wir diese einfach als Datei mitliefern k&ouml;nnen. Das hei&szlig;t, dass wir den <b>OleDb<\/b>-Provider nutzen wollen:<\/p>\n<pre>using System.Data.OleDb;<\/pre>\n<p>Die Beispieldatenbank ist die S&uuml;dsturm-Datenbank, die viele Leser vermutlich schon vom Magazin <b>Access im Unternehmen <\/b>kennen.<\/p>\n<p>Die Datenbank enth&auml;lt einige Tabellen, die wir f&uuml;r die folgenden Beispiele nutzen werden. Bild 1 zeigt das Datenmodell dieser Datenbank.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2015_01\/pic_9_001.png\" alt=\"Datenmodell der Beispieldatenbank\" width=\"700\" height=\"412,84\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 1: Datenmodell der Beispieldatenbank<\/span><\/b><\/p>\n<p><b>Speicherort der Datenbank<\/b><\/p>\n<p>W&auml;hrend der Tests werden wir die Anwendung von Visual Studio aus mit <b>F5 <\/b>starten. Die <b>ADONET.exe<\/b>-Datei wird dann im Unterverzeichnis <b>\\bin\\debug <\/b>des Projektordners erstellt werden.<\/p>\n<p>Damit wir ohne weitere Pfadangaben auf die Datei <b>Suedsturm.mdb <\/b>zugreifen k&ouml;nnen, f&uuml;gen wir auch die Datenbankdatei zu diesem Verzeichnis hinzu.<\/p>\n<p><b>Beispielprojekt<\/b><\/p>\n<p>Als Beispielprojekt verwenden wir zun&auml;chst eine Konsolenanwendung (siehe Ordner <b>ADONET <\/b>im Download). Die einzelnen Beispiele k&ouml;nnen Sie jeweils in die Methode <b>Main<\/b> einf&uuml;gen und ausf&uuml;hren.<\/p>\n<p><b>Verbindung aufbauen<\/b><\/p>\n<p>Grundlage f&uuml;r den Zugriff auf eine Datenbank ist der Aufbau einer Verbindung. Dies erledigen Sie unter C# wie in der Methode aus Listing 1. Die Methode definiert zun&auml;chst eine Verbindungszeichenfolge, wie Sie sie m&ouml;glicherweise auch von <b>ADODB <\/b>kennen.<\/p>\n<pre>static void Main(string[] args)\r\n{\r\n     string Connectionstring = \"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=Suedsturm.mdb\";\r\n     OleDbConnection cnn = new OleDbConnection(Connectionstring);\r\n     cnn.Open();\r\n     Console.WriteLine(\"Provider: {0}\", cnn.Provider);\r\n     Console.WriteLine(\"DataSource: {0}\", cnn.DataSource);\r\n     Console.ReadLine();\r\n     cnn.Close();\r\n}<\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 1: Herstellen einer Verbindung und Ausgeben einiger Verbindungseigenschaften<\/span><\/b><\/p>\n<p>Dann erstellt die Methode ein neues Objekt des Typs <b>OleDbConnection <\/b>mit der Verbindungszeichenfolge als Parameter und speichert den Verweis darauf in der Variablen <b>cnn<\/b>. Dessen <b>Open<\/b>-Methode &ouml;ffnet schlie&szlig;lich die Verbindung und folgenden Anweisungen geben den <b>Provider <\/b>(<b>Microsoft.Jet.OLEDB.4.0<\/b>) und die <b>DataSource <\/b>(<b>Suedsturm.mdb<\/b>) in der Konsole aus.<\/p>\n<p><b>Objekte nach Datenquelle<\/b><\/p>\n<p>Es gibt unter C# kein <b>Connection<\/b>-Objekt wie unter Access, das Sie mit einer datenquellenspezifischen Verbindungszeichenfolge versehen. Stattdessen finden Sie hier verschiedene Objekte vor, zum Beispiel die folgenden:<\/p>\n<ul>\n<li><b>OleDbConnection<\/b><\/li>\n<li><b>SqlConnection<\/b><\/li>\n<li><b>OdbcConnection<\/b><\/li>\n<\/ul>\n<p>Gleiches gilt auch f&uuml;r die &uuml;brigen Objekte weiter unten vorgestellten Objekte: Wenn Sie die Beispiele also nicht mit Access, sondern mit einer anderen Datenquelle ausprobieren m&ouml;chten, ersetzen Sie das Pr&auml;fix des jeweiligen Objekts (also etwa <b>OleDb&#8230; <\/b>durch <b>Sql&#8230;<\/b>, wenn Sie auf den SQL Server zugreifen m&ouml;chten).<\/p>\n<p><b>Aktionsabfragen ausf&uuml;hren<\/b><\/p>\n<p>Unter VBA gibt es mehrere M&ouml;glichkeiten, Aktionsabfragen auszuf&uuml;hren. Dabei f&uuml;hren Sie die angegebene SQL-Anweisung (<b>INSERT INTO<\/b>, <b>UPDATE<\/b>, <b>DELETE <\/b>oder <b>SELECT INTO<\/b>) zum Beispiel mit der <b>Execute<\/b>-Methode des <b>Database<\/b>-Objekts oder mit der <b>RunSQL<\/b>-Methode des <b>DoCmd<\/b>-Objekts aus:<\/p>\n<pre>'VBA-Code:\r\n<span style=\"color:blue;\">Dim <\/span>db<span style=\"color:blue;\"> As <\/span>DAO.Database\r\n<span style=\"color:blue;\">Set<\/span> db = CurrentDb\r\ndb.Execute \"DELETE FROM tblArtikel\", dbFailOnError<\/pre>\n<p>oder<\/p>\n<pre>'VBA-Code:\r\nDoCmd.RunSQL \"DELETE FROM tblArtikel\"<\/pre>\n<p>Es gibt auch noch eine ADODB-Methode, die wir hier nicht mehr auff&uuml;hren wollen. Unter C# verwenden wir das Objekt <b>OleDbCommand <\/b>(beziehungsweise <b>SqlCommand <\/b>oder <b>OdbcCommand <\/b>f&uuml;r andere Datenquellen als Access), um eine Aktionsabfrage abzusetzen. Ein Beispiel sieht wie in Listing 2 aus. Die dortigen Anweisungen (auszuprobieren innerhalb der <b>Main<\/b>-Methode des Konsolenprojekts) stellen wieder die Verbindungszeichenfolge zusammen. Die folgende Anweisung deklariert eine <b>int<\/b>-Variable namens <b>AnzahlGeaenderteDatensaetze <\/b>zum Erfassen der Anzahl der von der folgenden &Auml;nderungsabfrage betroffenen Datens&auml;tze.<\/p>\n<pre>...\r\nstring Connectionstring = \"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=Suedsturm.mdb\";\r\nint AnzahlGeaenderteDatensaetze;\r\nOleDbConnection cnn = new OleDbConnection(Connectionstring);\r\nOleDbCommand cmd = new OleDbCommand();\r\ncmd.CommandText = \"UPDATE tblArtikel SET Artikelname = 'Chai (Tee)' WHERE Artikelname = 'Chai'\";\r\ncmd.Connection = cnn;\r\ncnn.Open();\r\nAnzahlGeaenderteDatensaetze = cmd.ExecuteNonQuery();\r\nConsole.WriteLine(\"Ge&auml;nderte Datens&auml;tze: {0}\", AnzahlGeaenderteDatensaetze);\r\nConsole.ReadLine();\r\ncnn.Close();\r\n...<\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 2: Ausf&uuml;hren einer Aktualisierungsabfrage<\/span><\/b><\/p>\n<p>Wie in der vorherigen Methode erstellen wir auch hier wieder ein <b>OleDbConnection<\/b>-Objekt. Au&szlig;erdem ben&ouml;tigen wir ein Objekt des Typs <b>OleDbCommand <\/b>(referenziert mit der Variablen <b>cmd<\/b>). <\/p>\n<div class=\"rcp_restricted\"><p><span style=\"color: #ff0000;\">M&ouml;chten Sie weiterlesen? Dann l&ouml;sen Sie Ihr Ticket!<\/span><br \/>\n<span style=\"color: #ff0000;\">Hier geht es zur Bestellung des Jahresabonnements des Magazins <strong>Visual Basic Entwickler<\/strong>:<\/span><br \/>\n<span style=\"color: #ff0000;\"><a style=\"color: #ff0000;\" href=\"https:\/\/shop.minhorst.com\/magazine\/363\/visual-basic-entwickler-jahresabonnement?c=77\">Zur Bestellung ...<\/a><\/span><br \/>\n<span style=\"color: #ff0000;\">Danach greifen Sie sofort auf <strong>alle rund 200 Artikel<\/strong> unseres Angebots zu - auch auf diesen hier!<\/span><br \/>\n<span style=\"color: #000000;\">Oder haben Sie bereits Zugangsdaten? Dann loggen Sie sich gleich hier ein:<\/span><\/p>\n<\/div>\n\n\t\n\t<form id=\"rcp_login_form\"  class=\"rcp_form\" method=\"POST\" action=\"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000009\/\">\n\n\t\t\n\t\t<fieldset class=\"rcp_login_data\">\n\t\t\t<p>\n\t\t\t\t<label for=\"rcp_user_login\">Username or Email<\/label>\n\t\t\t\t<input name=\"rcp_user_login\" id=\"rcp_user_login\" class=\"required\" type=\"text\"\/>\n\t\t\t<\/p>\n\t\t\t<p>\n\t\t\t\t<label for=\"rcp_user_pass\">Password<\/label>\n\t\t\t\t<input name=\"rcp_user_pass\" id=\"rcp_user_pass\" class=\"required\" type=\"password\"\/>\n\t\t\t<\/p>\n\t\t\t\t\t\t<p>\n\t\t\t\t<input type=\"checkbox\" name=\"rcp_user_remember\" id=\"rcp_user_remember\" value=\"1\"\/>\n\t\t\t\t<label for=\"rcp_user_remember\">Remember me<\/label>\n\t\t\t<\/p>\n\t\t\t<p class=\"rcp_lost_password\"><a href=\"\/data\/wp\/v2\/posts\/55000009?rcp_action=lostpassword\"><\/a><\/p>\n\t\t\t<p>\n\t\t\t\t<input type=\"hidden\" name=\"rcp_action\" value=\"login\"\/>\n\t\t\t\t<input type=\"hidden\" name=\"rcp_redirect\" value=\"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000009\/\"\/>\n\t\t\t\t<input type=\"hidden\" name=\"rcp_login_nonce\" value=\"1f69832577\"\/>\n\t\t\t\t<input id=\"rcp_login_submit\" class=\"rcp-button\" type=\"submit\" value=\"Login\"\/>\n\t\t\t<\/p>\n\t\t\t\t\t<\/fieldset>\n\n\t\t\n\t<\/form>\n<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Wer lange mit Access gearbeitet hat, dem ist der Datenzugriff &uuml;ber die DAO-Bibliothek mit dem Recordset-Objekt, das Bearbeiten mit AddNew, Update und Edit sowie das Formulieren von SQL-Aktionsabfragen f&uuml;r die Execute-Anweisung in Fleisch und Blut &uuml;bergegangen. Nun hei&szlig;t es umdenken: Unter der Datenzugriffsbibliothek ADO.NET sieht vieles anders aus. Diese Artikelreihe zeigt, wie Sie die unter Access gelernten Abl&auml;ufe auch mit Visual Studio unter C#\/ADO.NET programmieren k&ouml;nnen.<\/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":[66012015,662015,44000008,44000027],"tags":[],"yst_prominent_words":[66062023,66062051,66062047,66062059,66062061,66062096],"class_list":["post-55000009","post","type-post","status-publish","format-standard","hentry","category-66012015","category-662015","category-Datenzugriffstechnik","category-Excel_programmieren"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000009","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/comments?post=55000009"}],"version-history":[{"count":0,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000009\/revisions"}],"wp:attachment":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/media?parent=55000009"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/categories?post=55000009"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/tags?post=55000009"},{"taxonomy":"yst_prominent_words","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/yst_prominent_words?post=55000009"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}