<?xml version="1.0" encoding="utf-8"?>
<feed xml:lang="en" xmlns="http://www.w3.org/2005/Atom"><title>Recent posts to Anschluss an MSSQL</title><link href="https://forge.codesys.com/forge/talk/Deutsch/thread/b4d0ab7a6d/" rel="alternate"/><link href="https://forge.codesys.com/forge/talk/Deutsch/thread/b4d0ab7a6d/feed.atom" rel="self"/><id>https://forge.codesys.com/forge/talk/Deutsch/thread/b4d0ab7a6d/</id><updated>2020-02-28T08:55:03.422000Z</updated><subtitle>Recent posts to Anschluss an MSSQL</subtitle><entry><title>Anschluss an MSSQL</title><link href="https://forge.codesys.com/forge/talk/Deutsch/thread/b4d0ab7a6d/?limit=25#3225" rel="alternate"/><published>2020-02-28T08:55:03.422000Z</published><updated>2020-02-28T08:55:03.422000Z</updated><author><name>rudl</name><uri>https://forge.codesys.com/u/rudl/</uri></author><id>https://forge.codesys.com6935d508e4d2b0011f3374c51e3dbe22d1afa273</id><summary type="html">&lt;div class="markdown_content"&gt;&lt;p&gt;&lt;a class="" href="http://www.sql4automation.com" rel="nofollow"&gt;http://www.sql4automation.com&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;Mit SQL4automation hat man aus der CoDeSys Steuerungen direkten zugriff auf Datenbanken. Mit der SQL Sprache kann man aus der Steuerung neue Datensätze anlegen, Datensätze verändern, Daten abfragen und löschen. Ausserdem können Prozeduren in der Datenbank aufgerufen werden. Es gibt bereits getestete Bibliotheken für CoDeSys V2 und V3, die sehr einfach ins Projekt eingebunden werden können. Die Performance mit den CoDeSys Steuerungen ist wirklich sehr gut! (4000 Variablen ~16‘500 Byte in 650ms).&lt;/p&gt;&lt;/div&gt;</summary></entry><entry><title>Anschluss an MSSQL</title><link href="https://forge.codesys.com/forge/talk/Deutsch/thread/b4d0ab7a6d/?limit=25#4f3e" rel="alternate"/><published>2020-02-28T08:55:00.896000Z</published><updated>2020-02-28T08:55:00.896000Z</updated><author><name>Anonymous</name><uri>https://forge.codesys.com/u/*anonymous/</uri></author><id>https://forge.codesys.com130396d108f56713d1942d93d673f2c85d0aaa6f</id><summary type="html">&lt;div class="markdown_content"&gt;&lt;p&gt;&lt;em&gt;Originally created by:&lt;/em&gt; plivelic@metaind.de&lt;/p&gt;
&lt;p&gt;Hallo,&lt;/p&gt;
&lt;p&gt;jetzt gibt es!&lt;/p&gt;
&lt;p&gt;Schaue: "http://www.metaind.de/metaind/de/software-shop"&lt;/p&gt;
&lt;p&gt;Ein beispiel mit der Funktion SQL_GET:&lt;/p&gt;
&lt;p&gt;PROGRAM SAMPLE_SQL_GET&lt;/p&gt;
&lt;p&gt;VAR&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="nv"&gt;bStart_Sample_1&lt;/span&gt;   : &lt;span class="nv"&gt;BOOL&lt;/span&gt;&lt;span class="c1"&gt;;             (* Activate CREATE TABLE *)&lt;/span&gt;

&lt;span class="nv"&gt;Str_SQL&lt;/span&gt;           : &lt;span class="nv"&gt;STRING&lt;/span&gt;[&lt;span class="mi"&gt;4128&lt;/span&gt;]&lt;span class="c1"&gt;;     (* SQL statement                *)&lt;/span&gt;

&lt;span class="nv"&gt;sRes&lt;/span&gt;              : &lt;span class="nv"&gt;STRING&lt;/span&gt;[&lt;span class="mi"&gt;4128&lt;/span&gt;]&lt;span class="c1"&gt;;     (* Reserve space for respons string from function SQL_GET *)&lt;/span&gt;

&lt;span class="nv"&gt;iRows&lt;/span&gt;             : &lt;span class="nv"&gt;INT&lt;/span&gt;&lt;span class="c1"&gt;;              (* Affected rows                *)&lt;/span&gt;

&lt;span class="nv"&gt;dwID&lt;/span&gt;              : &lt;span class="nv"&gt;DWORD&lt;/span&gt;&lt;span class="c1"&gt;;            (* ITEM_ID in table TARGETS     *)&lt;/span&gt;

&lt;span class="nv"&gt;iTarget&lt;/span&gt;           : &lt;span class="nv"&gt;INT&lt;/span&gt;&lt;span class="c1"&gt;;              (* TARGET in table  TARGETS     *)&lt;/span&gt;

&lt;span class="nv"&gt;sDate&lt;/span&gt;             : &lt;span class="nv"&gt;STRING&lt;/span&gt;[&lt;span class="mi"&gt;128&lt;/span&gt;]&lt;span class="c1"&gt;;      (* DATUM in table  TARGETS      *)&lt;/span&gt;

&lt;span class="nv"&gt;sText&lt;/span&gt;             : &lt;span class="nv"&gt;STRING&lt;/span&gt;[&lt;span class="mi"&gt;128&lt;/span&gt;]&lt;span class="c1"&gt;;      (* DESCRIPTION in table TARGETS *)&lt;/span&gt;

&lt;span class="nv"&gt;rc1&lt;/span&gt;,&lt;span class="nv"&gt;rc2&lt;/span&gt;,&lt;span class="nv"&gt;rc3&lt;/span&gt;,&lt;span class="nv"&gt;rc4&lt;/span&gt;   : &lt;span class="nv"&gt;INT&lt;/span&gt;&lt;span class="c1"&gt;;              (* Return codes                 *)&lt;/span&gt;

&lt;span class="nv"&gt;iSQL_get_err&lt;/span&gt;      : &lt;span class="nv"&gt;INT&lt;/span&gt; :&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="c1"&gt;;        (* Error code, 0-OK             *)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;END_VAR&lt;/p&gt;
&lt;p&gt;(&lt;em&gt; Program start &lt;/em&gt;)&lt;/p&gt;
&lt;p&gt;IF bStart_Sample_1 THEN&lt;/p&gt;
&lt;p&gt;bStart_Sample_1 := FALSE;&lt;/p&gt;
&lt;p&gt;Str_SQL := 'select ITEM_ID, DATUM, DESCRIPTION, TARGET from TARGETS where ITEM_ID=123450'; &lt;/p&gt;
&lt;p&gt;(&lt;em&gt;  Str_SQL := 'select * from TARGETS'; &lt;/em&gt;) &lt;/p&gt;
&lt;p&gt;iSQL_get_err := SQL_GET (Str_SQL, ADR(iRows), ADR(sRes));&lt;/p&gt;
&lt;p&gt;IF iSQL_get_err &amp;lt;&amp;gt; 0 THEN&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="nv"&gt;PROTO_TIME&lt;/span&gt; &lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;gfpProto&lt;/span&gt;, &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;SAMPLE_SQL_GET(): We made a SQL error&lt;/span&gt;&lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;RETURN&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;END_IF&lt;/p&gt;
&lt;p&gt;IF iRows = 0 THEN  (&lt;em&gt; No row maches this where condition &lt;/em&gt;) &lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="nv"&gt;PROTO_TIME&lt;/span&gt; &lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;gfpProto&lt;/span&gt;, &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;SAMPLE_SQL_GET(): iRows = 0&lt;/span&gt;&lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;RETURN&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;END_IF&lt;/p&gt;
&lt;p&gt;PROTO_TIME (gfpProto, 'SQL_GET() war erfolgreich');&lt;/p&gt;
&lt;p&gt;(&lt;em&gt; Extract particular column values &lt;/em&gt;)&lt;/p&gt;
&lt;p&gt;rc1 := VAR_DWORD (sRes, 1, ADR(dwID));       (&lt;em&gt; iVar_no is sequence number of this column in select command &lt;/em&gt;)  &lt;/p&gt;
&lt;p&gt;rc2 := VAR_STR (sRes, 2, ADR(sDate));&lt;/p&gt;
&lt;p&gt;rc3 := VAR_STR (sRes, 3, ADR(sText));&lt;/p&gt;
&lt;p&gt;rc4 := VAR_INT (sRes, 4, ADR(iTarget));&lt;/p&gt;
&lt;p&gt;IF rc4 = 1 THEN   (&lt;em&gt; This value is not defined in data base &lt;/em&gt;)&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;iTarget&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;Target&lt;/span&gt; &lt;span class="k"&gt;unknown&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;g&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt; &lt;span class="n"&gt;tage&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="n"&gt;target&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;END_IF&lt;/p&gt;
&lt;p&gt;END_IF&lt;/p&gt;
&lt;p&gt;(&lt;em&gt; Program end &lt;/em&gt;)&lt;/p&gt;
&lt;p&gt;Es handelt sich hier um eine echte gelinkte Library ohne Zwischenkommunikation wie etwa TCP/IP or UDP.&lt;/p&gt;
&lt;p&gt;Gruß&lt;/p&gt;
&lt;p&gt;Boris&lt;/p&gt;&lt;/div&gt;</summary></entry><entry><title>Anschluss an MSSQL</title><link href="https://forge.codesys.com/forge/talk/Deutsch/thread/b4d0ab7a6d/?limit=25#d6a5" rel="alternate"/><published>2020-02-28T08:54:54.308000Z</published><updated>2020-02-28T08:54:54.308000Z</updated><author><name>Fabi</name><uri>https://forge.codesys.com/u/fabi/</uri></author><id>https://forge.codesys.com3b44a2cc8de24200dfca7687dba4d590a74f3e06</id><summary type="html">&lt;div class="markdown_content"&gt;&lt;p&gt;Hallo,&lt;/p&gt;
&lt;p&gt;Ich bin zur Zeit in Indien mit einem Kunden der ein grosses Projekt hat.&lt;/p&gt;
&lt;p&gt;Ich möchte wissen ob es ein Library gibt um mich an eine SQL DB anzuschliessen.&lt;/p&gt;
&lt;p&gt;Untenstehend was ich machen will:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Nur lesen... kein schreiben auf MSSQL&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Anschliessen an MSSQL, connection immer offen lassen da cyclisch gelesen wird (kein Close)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Entdecken wenn Anschluss nicht möglich oder verloren... dann neu anschliessen.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Select * from Table... (alle meine Infos sind bereits in einer View)&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;4.1. Wissen wieviele Zeilen ich erhalten habe&lt;/p&gt;
&lt;p&gt;4.2. alles in ein Array schaufeln&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Alle Minuten das Array aktualisieren.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;CloseConnection erst beim runterfahren.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Note: Die MSSQL DB liegt auf einem anderen PC.&lt;/p&gt;
&lt;p&gt;Note2: Ich werde MSSQL2000 verwenden... nicht 2005.&lt;/p&gt;
&lt;p&gt;Note3: Am liebsten JET oder ADO... besser als ODBC.&lt;/p&gt;
&lt;p&gt;Note4: Ich habe MDAC 2.8 auf dem PC.&lt;/p&gt;
&lt;p&gt;Zweite Frage:&lt;/p&gt;
&lt;p&gt;wie gross darf mein Array sein? Kann ich ein Array 2000x4 definieren?&lt;/p&gt;
&lt;p&gt;Wenn es klappt schicke ich Dir dann ein Bentchmark.&lt;/p&gt;
&lt;p&gt;Im Voraus besten Dank.&lt;/p&gt;
&lt;p&gt;Fabi&lt;/p&gt;&lt;/div&gt;</summary></entry></feed>