{"id":568,"date":"2012-03-14T11:23:45","date_gmt":"2012-03-14T10:23:45","guid":{"rendered":"http:\/\/www.capri-soft.de\/blog\/?p=568"},"modified":"2012-03-14T15:59:48","modified_gmt":"2012-03-14T14:59:48","slug":"ms-sql-server-und-c-net-textdatei-per-sql-bulk-insert","status":"publish","type":"post","link":"https:\/\/www.capri-soft.de\/blog\/?p=568","title":{"rendered":"MS SQL Server und C#.NET: Textdatei per SQL Bulk Insert"},"content":{"rendered":"<h1>Aufgabenstellung<\/h1>\n<p>Es wird eine perfomante (ohne Cursor-Iterationen) M\u00f6glichkeit gesucht um Textdateien per C#.NET in den Microsoft SQL Server zu importieren. <\/p>\n<h1>Ansatz<\/h1>\n<p>C# bietet eine Klassenbibliothek mit den Klassen SqlBulkCopy und SqlBulkCopyOptions, die bereits im <a href=\"https:\/\/www.capri-soft.de\/blog\/?p=17\">SAP Stammdaten Importer Tool<\/a> vorgestellt wurde, und dessen Quellcode im unteren Abschnitt des Artikel als Visual Studio 2005 Projekt zum download angeboten wird. Dieses Tool erm\u00f6glicht das einlesen von SE16-Downloaddateien mit ein paar Millionen Datens\u00e4tzen in weniger als 2 Sekunden. Bei der herk\u00f6mmlichen Methode, einer Cursor-Iteration, wird je INSERT-Statement ein Datenbankaufruf\/Netzwerkzugriff durchgef\u00fchrt. Dies ist nur nicht mehr notwendig. <\/p>\n<h1>L\u00f6sung<\/h1>\n<h3>DataTable f\u00fcllen<\/h3>\n<pre>\r\n<code>\r\n...\r\nDataTable dataTable = new DataTable();\r\n...\r\n\/\/ Spalten\u00fcberschriften zum Table hinzuf\u00fcgen (in einer Schleife bef\u00fcllbar)\r\nfor (\/*Schleife um die Spaltennamen einzulesen*\/)\r\n{\r\n   \/\/ Die Anzahl der Columns muss = objects array sein\r\n   dataTable.Columns.Add(\"SPALTENNAME\");\r\n}\r\n...\r\n\/\/ Definition des Zeilenarrays\r\nArrayList objects = new ArrayList();\r\n...\r\nwhile(\/*Schleife um zeilenweise \u00fcber Datei zu iterieren*\/)\r\n{\r\n  ...\r\n  for (\/*Schleife um \u00fcber Zellen der Zeile zu iterieren*\/)\r\n  {\r\n     ...\r\n     objects.Add(aktuellesZellenElementString);\r\n     ...\r\n  }\r\n   ...\r\n   \/\/ Hinzuf\u00fcgen des Datenelements, das die Zeilendaten hat\r\n   dataTable.Rows.Add(objects.ToArray());\r\n}\r\n...\r\n\r\n<\/code>\r\n<\/pre>\n<h3>DataTable in den MS SQL Server importieren<\/h3>\n<pre>\r\n<code>\r\nprivate void WriteToDatabase()\r\n{\r\n    \/\/ get your connection string\r\n    string connString = msSqlServerString;\r\n    \/\/ connect to SQL\r\n    using (SqlConnection connection =  new SqlConnection(connString))\r\n    {\r\n        \/\/ make sure to enable triggers\r\n        \/\/ more on triggers in next post\r\n\r\n        SqlBulkCopy bulkCopy = new SqlBulkCopy\r\n        (\r\n            connection,\r\n            SqlBulkCopyOptions.TableLock |\r\n            SqlBulkCopyOptions.FireTriggers |\r\n            SqlBulkCopyOptions.UseInternalTransaction,\r\n            null\r\n         );\r\n\r\n        \/\/ set the destination table name\r\n        bulkCopy.DestinationTableName = txtImportTable.Text;\r\n        connection.Open();\r\n\r\n        \/\/ write the data in the \"dataTable\"\r\n        try\r\n        {\r\n            bulkCopy.WriteToServer(dataTable);\r\n        }\r\n        catch (Exception e)\r\n        {\r\n            MessageBox.Show(\"Es ist ein Fehler aufgetreten. \"+\r\n            \"Stellen Sie sicher dass der Timeout im SQL Server \"+\r\n            \"auf unendlich steht und AutoClose f\u00fcr die Verbindung \"+\r\n            \"nicht aktiviert wurde. \" + e.Message, \"Fehler!\");\r\n        }\r\n        connection.Close();\r\n    }\r\n    \/\/ reset\r\n    this.dataTable.Clear();\r\n}\r\n<\/code>\r\n<\/pre>\n<p>Ein komplettes Beispiel l\u00e4sst sich hier downloaden:<br \/>\n<a href=\"https:\/\/www.capri-soft.de\/blog\/wp-content\/uploads\/2012\/03\/Masterdata_Importer.zip\">Quellcode SAP Stammdaten Importer (VS 2005 Projekt)<\/a><\/p>\n<iframe src=\"http:\/\/www.facebook.com\/plugins\/like.php?href=https%3A%2F%2Fwww.capri-soft.de%2Fblog%2F%3Fp%3D568&amp;layout=standard&amp;show_faces=true&amp;width=450&amp;action=like&amp;colorscheme=light\" scrolling=\"no\" frameborder=\"0\" allowTransparency=\"true\" style=\"border:none; overflow:hidden; width:450px;margin-top:5px;\"><\/iframe>","protected":false},"excerpt":{"rendered":"<p>Aufgabenstellung Es wird eine perfomante (ohne Cursor-Iterationen) M\u00f6glichkeit gesucht um Textdateien per C#.NET in den Microsoft SQL Server zu importieren. Ansatz C# bietet eine Klassenbibliothek mit den Klassen SqlBulkCopy und SqlBulkCopyOptions, die bereits im SAP Stammdaten Importer Tool vorgestellt wurde, und dessen Quellcode im unteren Abschnitt des Artikel als Visual Studio 2005 Projekt zum download &hellip; <a href=\"https:\/\/www.capri-soft.de\/blog\/?p=568\" class=\"more-link\"><span class=\"screen-reader-text\">MS SQL Server und C#.NET: Textdatei per SQL Bulk Insert<\/span> weiterlesen <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":false,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2},"jetpack_post_was_ever_published":false},"categories":[4,11],"tags":[],"class_list":["post-568","post","type-post","status-publish","format-standard","hentry","category-net","category-ms-sql-server"],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"jetpack_shortlink":"https:\/\/wp.me\/p4yGeN-9a","jetpack_likes_enabled":true,"jetpack-related-posts":[],"_links":{"self":[{"href":"https:\/\/www.capri-soft.de\/blog\/index.php?rest_route=\/wp\/v2\/posts\/568","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.capri-soft.de\/blog\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.capri-soft.de\/blog\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.capri-soft.de\/blog\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.capri-soft.de\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=568"}],"version-history":[{"count":8,"href":"https:\/\/www.capri-soft.de\/blog\/index.php?rest_route=\/wp\/v2\/posts\/568\/revisions"}],"predecessor-version":[{"id":573,"href":"https:\/\/www.capri-soft.de\/blog\/index.php?rest_route=\/wp\/v2\/posts\/568\/revisions\/573"}],"wp:attachment":[{"href":"https:\/\/www.capri-soft.de\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=568"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.capri-soft.de\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=568"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.capri-soft.de\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=568"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}