{"id":752,"date":"2012-08-16T13:05:05","date_gmt":"2012-08-16T11:05:05","guid":{"rendered":"http:\/\/www.capri-soft.de\/blog\/?p=752"},"modified":"2012-09-14T08:59:25","modified_gmt":"2012-09-14T06:59:25","slug":"ibm-doors-dxl-zugriff-auf-ms-sql-server","status":"publish","type":"post","link":"https:\/\/www.capri-soft.de\/blog\/?p=752","title":{"rendered":"IBM Doors DXL: Zugriff auf MS SQL Server"},"content":{"rendered":"<h1>Aufgabenstellung<\/h1>\n<p>In der Programmiersprache DXL von IBM Doors soll auf Daten eines Microsoft SQL Servers zugegriffen werden. <\/p>\n<h1>Ansatz<\/h1>\n<p>Die Verwendung der COM-Schnittstelle erlaubt Zugriff auf die ADODB.Connection. Hierbei handelt es sich um eine Microsoft Bibliothek f\u00fcr den Zugriff auf SQL Server. <\/p>\n<h1>L\u00f6sung 1<\/h1>\n<p>Das folgende Skript erlaubt Zugriff auf den Microsoft SQL Server und f\u00fchrt eine SELECT-Anweisung durch:<\/p>\n<p>\/\/ Connection details<br \/>\nstring dbServer=&#8220;SERVER&#8220;;<br \/>\nstring dbName=&#8220;DATABASE&#8220;;<br \/>\nstring dbUsername=&#8220;USER&#8220;;<br \/>\nstring dbPassword=&#8220;PASS&#8220;;<\/p>\n<p>string connectionString = &#8222;Data Source='&#8220; dbServer &#8222;&#8218;;<br \/>\nInitial Catalog='&#8220; dbName &#8222;&#8218;;User Id='&#8220; dbUsername &#8222;&#8218;;Password='&#8220; dbPassword &#8222;&#8218;;&#8220;;<\/p>\n<p>OleAutoArgs oleAutoArgs=create;<br \/>\nOleAutoObj adodbConnection, adodbRecordset, objFields, objField;<\/p>\n<p>string fieldName, result, err;<br \/>\nint numFields, index;<\/p>\n<p>\/\/ Instantiate a new ADODB Connection object<br \/>\nadodbConnection = oleCreateAutoObject &#8222;ADODB.Connection&#8220;;<\/p>\n<p>if (null adodbConnection)<br \/>\n{<br \/>\n\tprint &#8222;Unable to instantiate database connection\\n&#8220;;<br \/>\n\thalt;<br \/>\n}<\/p>\n<p>\/\/ Instantiate a new ADODB Recordset object<br \/>\nadodbRecordset = oleCreateAutoObject &#8222;ADODB.Recordset&#8220;;<\/p>\n<p>if(null adodbRecordset)<br \/>\n{<br \/>\n\tprint &#8222;Unable to create Recordset object\\n&#8220;;<br \/>\n\thalt;<br \/>\n}<\/p>\n<p>\/\/ Connection details<\/p>\n<p>\/\/ Set the provider and data source of the connection<br \/>\n\/\/ based on information from connectionstrings.com<br \/>\nolePut(adodbConnection, &#8222;Provider&#8220;, &#8222;sqloledb&#8220;);<br \/>\nclear oleAutoArgs;<br \/>\nput(oleAutoArgs, connectionString );<br \/>\n\/\/ &#8222;Password=&#8220; dataPass &#8222;;&#8220;)<br \/>\n\/\/ Open the connection to the database<br \/>\nerr=oleMethod(adodbConnection, &#8222;Open&#8220;, oleAutoArgs);<\/p>\n<p>if(!null err &#8222;&#8220;)<br \/>\n{<br \/>\n\tprint &#8222;Error opening database: &#8220; err &#8222;\\n&#8220;;<br \/>\n\thalt;<br \/>\n}<\/p>\n<p>\/\/ SQL Command: Open a cursor to return all columns and rows of &#8218;tableName&#8216;<br \/>\nclear oleAutoArgs<\/p>\n<p>put(oleAutoArgs, &#8222;select * from [alarms] order by 1&#8220;) \/\/ SQL Command<br \/>\nput(oleAutoArgs, adodbConnection) \/\/ ACTIVE CONNECTION<br \/>\nput(oleAutoArgs, 1) \/\/ CURSOR TYPE &#8211; &#8218;adOpenKeyset&#8216;<br \/>\nput(oleAutoArgs, 1) \/\/ LOCK TYPE &#8211; &#8218;adLockReadOnly&#8216;<br \/>\nput(oleAutoArgs, 1) \/\/ OPTIONS &#8211; &#8218;adCmdText&#8216;<\/p>\n<p>err=oleMethod(adodbRecordset, &#8222;Open&#8220;, oleAutoArgs);<\/p>\n<p>if(!null err &#8222;&#8220;)<br \/>\n{<br \/>\n\tprint &#8222;Error opening table: &#8220; err &#8222;\\n&#8220;;<br \/>\n\thalt;<br \/>\n}<\/p>\n<p>\/\/ From the Recordset object, list each field name (defined in database)<br \/>\noleGet(adodbRecordset, &#8222;Fields&#8220;, objFields);<br \/>\noleGet(objFields, &#8222;Count&#8220;, numFields);<\/p>\n<p>for(index=0; index<numFields; index++)\n{\n\tclear oleAutoArgs;\n\tput(oleAutoArgs, index);\n\toleGet(objFields, \"Item\", oleAutoArgs, objField);\n\toleGet(objField, \"Name\", fieldName);\n\tprint (index>0?&#8220;\\&#8220;,&#8220;:&#8220;&#8220;) &#8222;\\&#8220;&#8220; fieldName;<br \/>\n}<\/p>\n<p>print &#8222;\\&#8220;\\n&#8220;;<\/p>\n<p>\/\/ From the Recordset object cursor, loop through and print each row<br \/>\nwhile(true)<br \/>\n{<br \/>\n\tresult=&#8220;&#8220;;<br \/>\n\tclear oleAutoArgs;<br \/>\n\tput(oleAutoArgs, 2); \/\/ StringFormat &#8211; &#8218;adClipString&#8216;<br \/>\n\tput(oleAutoArgs, 1); \/\/ NumRows<br \/>\n\tput(oleAutoArgs, &#8222;\\&#8220;,\\&#8220;&#8220;); \/\/ ColumnDelimiter<br \/>\n\tput(oleAutoArgs, &#8222;\\&#8220;&#8220;); \/\/ RowDelimiter<br \/>\n\tput(oleAutoArgs, &#8222;&#8220;); \/\/ NullExpr<br \/>\n\toleMethod(adodbRecordset, &#8222;GetString&#8220;, oleAutoArgs, result);<br \/>\n\tif(length(result)<=0) break else print \"\\\"\" result \"\\n\";\n}\n[\/javascript]\n\n\n\n<h1>L\u00f6sung 2<\/h1>\n<p>Das untere Beispiel zeigt die Kapselung in eine Funktion und den Zugriff auf Einzelwerte, bzw. auf einzelne Zellen eines Recordsets. Dieses Beispiel l\u00e4sst sich ausgezeichnet in andere Bibliotheken auslagern:<\/p>\n<p>OleAutoArgs args = null;<\/p>\n<p>void cleanup (OleAutoObj &#038;obj)<br \/>\n{<br \/>\n\tif (!null obj)<br \/>\n\t{<br \/>\n   \t\toleCloseAutoObject obj;<br \/>\n   \t\tobj = null;<br \/>\n\t}<br \/>\n}<\/p>\n<p>\/\/ some syntax helpers for arguments (from DXL standard library) &#8230;<br \/>\nvoid checkNull (string s)<br \/>\n{<br \/>\n\tif (!null s)<br \/>\n\t{<br \/>\n\t\tprint &#8222;Error: &#8220; s &#8222;\\n&#8220; dxlHere();<br \/>\n\t\thalt;<br \/>\n\t}<br \/>\n}<\/p>\n<p>OleAutoArgs createArgs ()<br \/>\n{<br \/>\n\tif (!null args) delete args;<br \/>\n\targs = create();<br \/>\n\treturn args<br \/>\n}<\/p>\n<p>OleAutoArgs ::<-(OleAutoArgs x, int    a) { put(x, a); return x }\nOleAutoArgs ::<-(OleAutoArgs x, string a) { put(x, a); return x }\nOleAutoArgs ::<-(OleAutoArgs x, bool   a) { put(x, a); return x }\n\n\/\/ Hier bekommt man eine Spalte des aktuellen Records als String\nstring stringProperty (OleAutoObj obj, string s) \n{ \n\tstring result = null; \n\tcheckNull oleGet (obj, s, result); \n\treturn result \n}\n\n\nvoid selectStatement(string sql, string dbServer, string dbName, \nstring dbUsername, string dbPassword)\n{\n\tstring connectionString = \"Data Source='\" dbServer \"';Initial Catalog='\" \n dbName \"';User Id='\" dbUsername \"';Password='\" dbPassword \"';\";\n\n \tOleAutoArgs oleAutoArgs=create;\n\tOleAutoObj adodbConnection, adodbRecordset, objFields, objField;\n\n\t\n\t\n\tstring fieldName, result, err;\n\tint numFields, index;\n\t\n\t\/\/ Instantiate a new ADODB Connection object\n\tadodbConnection = oleCreateAutoObject \"ADODB.Connection\";\n\t\n\tif (null adodbConnection)\n\t{\n\t\tprint \"Unable to instantiate database connection\\n\";\n\t\thalt;\n\t}\n\t\n\t\/\/ Instantiate a new ADODB Recordset object\n\tadodbRecordset = oleCreateAutoObject \"ADODB.Recordset\";\n\t\n\tif(null adodbRecordset)\n\t{\n\t\tprint \"Unable to create Recordset object\\n\";\n\t\thalt;\n\t}\n\t\n\t\/\/ Connection details\n\t\n\t\/\/ Set the provider and data source of the connection\n\t\/\/ based on information from connectionstrings.com\n\tolePut(adodbConnection, \"Provider\", \"sqloledb\");\n\tclear oleAutoArgs;\n\tput(oleAutoArgs, connectionString );\n\t\/\/ \"Password=\" dataPass \";\")\n\t\/\/ Open the connection to the database\n\terr=oleMethod(adodbConnection, \"Open\", oleAutoArgs);\n\t\n\tif(!null err \"\")\n\t{\n\t\tprint \"Error opening database: \" err \"\\n\";\n\t\thalt;\n\t}\n\t\n\t\/\/ SQL Command: Open a cursor to return all columns and rows of 'tableName'\n\tclear oleAutoArgs\n\t\n\tput(oleAutoArgs, sql) \/\/ SQL Command\n\tput(oleAutoArgs, adodbConnection) \/\/ ACTIVE CONNECTION\n\tput(oleAutoArgs, 1) \/\/ CURSOR TYPE - 'adOpenKeyset'\n\tput(oleAutoArgs, 1) \/\/ LOCK TYPE - 'adLockReadOnly'\n\tput(oleAutoArgs, 1) \/\/ OPTIONS - 'adCmdText'\n\t\n\terr=oleMethod(adodbRecordset, \"Open\", oleAutoArgs);\n\t\n\tif(!null err \"\")\n\t{\n\t\tprint \"Error opening table: \" err \"\\n\";\n\t\thalt;\n\t}\n\t\n\t\/\/ From the Recordset object, list each field name (defined in database)\n\toleGet(adodbRecordset, \"Fields\", objFields);\n\toleGet(objFields, \"Count\", numFields);\n\t\n\tfor(index=0; index<numFields; index++)\n\t{\n\t\tclear oleAutoArgs;\n\t\tput(oleAutoArgs, index);\n\t\toleGet(objFields, \"Item\", oleAutoArgs, objField);\n\t\toleGet(objField, \"Name\", fieldName);\n\t\tprint (index>0?&#8220;\\&#8220;,&#8220;:&#8220;&#8220;) &#8222;\\&#8220;&#8220; fieldName;<br \/>\n\t}<\/p>\n<p>\tprint &#8222;\\&#8220;\\n&#8220;;<\/p>\n<p>\t\/\/ From the Recordset object cursor, loop through and print each row<br \/>\n\twhile(true)<br \/>\n\t{<br \/>\n\t\t\/\/ Break when we are still at the end<br \/>\n\t\tbool bEOF = false;<br \/>\n\t\tcheckNull oleGet(adodbRecordset, &#8222;EOF&#8220;, bEOF);<br \/>\n\t\tif (bEOF) break;<\/p>\n<p>\t\toleGet(adodbRecordset, &#8222;Fields&#8220;, objFields);<\/p>\n<p>\t\t\/\/ Hier werden die Einzelfelder ausgelesen<br \/>\n\t\toleGet(objFields, &#8222;Item&#8220;, createArgs <- 0 , objField);\n\t\tstring feld1 = stringProperty(objField, \"Value\");\n\n\t\toleGet(objFields, \"Item\", createArgs <- 1 , objField);\n\t\tstring feld2 = stringProperty(objField, \"Value\");\n\t\t\n\t\toleGet(objFields, \"Item\", createArgs <- 2 , objField);\n\t\tstring feld3 = stringProperty(objField, \"Value\");\n\n\n\t\tprint feld3 \" \" feld1 \" \" feld2 \"\\n\";\n\t\t\t\t\n\t\tcheckNull oleMethod (adodbRecordset, \"MoveNext\");\n\n\t}\n\t\n\tcleanup adodbConnection; \n             cleanup adodbRecordset; \n             cleanup objFields; \n             cleanup objField;\n}\n\n\n\/\/ Connection details\nstring sql=\"select [alarm_id], [subsystem], [bitnumber] from [alarms] order by 1\";\nstring dbServer=\"SERVER\";\nstring dbName=\"DATENBANK\";\nstring dbUsername=\"USER\";\nstring dbPassword=\"PASS\";\n\nselectStatement(sql,dbServer,dbName,dbUsername,dbPassword);\n[\/javascript]\n<\/p>\n<iframe src=\"http:\/\/www.facebook.com\/plugins\/like.php?href=https%3A%2F%2Fwww.capri-soft.de%2Fblog%2F%3Fp%3D752&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 In der Programmiersprache DXL von IBM Doors soll auf Daten eines Microsoft SQL Servers zugegriffen werden. Ansatz Die Verwendung der COM-Schnittstelle erlaubt Zugriff auf die ADODB.Connection. Hierbei handelt es sich um eine Microsoft Bibliothek f\u00fcr den Zugriff auf SQL Server. L\u00f6sung 1 Das folgende Skript erlaubt Zugriff auf den Microsoft SQL Server und f\u00fchrt &hellip; <a href=\"https:\/\/www.capri-soft.de\/blog\/?p=752\" class=\"more-link\"><span class=\"screen-reader-text\">IBM Doors DXL: Zugriff auf MS SQL Server<\/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_post_was_ever_published":false,"_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}},"categories":[22,19,11],"tags":[],"class_list":["post-752","post","type-post","status-publish","format-standard","hentry","category-dxl","category-ibm-doors","category-ms-sql-server"],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"jetpack_shortlink":"https:\/\/wp.me\/p4yGeN-c8","jetpack_likes_enabled":true,"jetpack-related-posts":[],"_links":{"self":[{"href":"https:\/\/www.capri-soft.de\/blog\/index.php?rest_route=\/wp\/v2\/posts\/752","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=752"}],"version-history":[{"count":8,"href":"https:\/\/www.capri-soft.de\/blog\/index.php?rest_route=\/wp\/v2\/posts\/752\/revisions"}],"predecessor-version":[{"id":754,"href":"https:\/\/www.capri-soft.de\/blog\/index.php?rest_route=\/wp\/v2\/posts\/752\/revisions\/754"}],"wp:attachment":[{"href":"https:\/\/www.capri-soft.de\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=752"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.capri-soft.de\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=752"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.capri-soft.de\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=752"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}