[gelöst] ADO.NET und MySQL

9. Juni 2020 15:40

Hallo,

wer kann mir bitte verraten, wie man mittels ADO.NET im CA/L eine Verbindung zu einem MySQL-Server generiert. Nach ewiger Suche gehe ich jetzt mal davon aus, dass man in den Globals unter dem Datentyp "DOTNET" fündig wird.
Fragt sich nur, was zu verwenden ist bzw. was am NAV-Server für den MySQL-Connect vorhanden sein muss.... Alle Welt schreibt, dass nach NAV 2009 nicht mehr ODBC, sondern ADO.NET verwendet werden soll.
Hat hier jemand einen Leitfaden?
Es kann ja nicht sein, dass im Jahre 2020 immer noch alles als txt-Export aus NAV für die Weiterverarbeitung bereitgestellt werden muss. Irgendwie bin ich da jetzt ziemlich gefrustet....

Jede Hilfe ist willkommen.
Danke!
Zuletzt geändert von Ralph71 am 30. Juni 2020 11:54, insgesamt 1-mal geändert.

Re: ADO.NET und MySQL

9. Juni 2020 15:53

Hallo,

das mit dem DotNet ist schon correct.
Fang mal damit an: https://docs.microsoft.com/de-de/dotnet/api/system.data.sqlclient.sqlconnection?view=dotnet-plat-ext-3.1&viewFallbackFrom=netstandard-2.1
Was du vorher noch brauchst kommt von hier: https://www.mysql.com/de/products/connector/

Und einen Connection- String brauchst du auch noch, damit du dich via SQLConnection mit deiner MySQL- Datenbank verbinden kannst (auch dafür gibt es Tools)

Der Rest erfolgt über weitere DotNet- Komponenten, die du über die SQLConnection finden solltest.

Gruß Fiddi

Re: ADO.NET und MySQL

9. Juni 2020 16:10

Blöde Fragen:
Ich kann doch keinen C#-Code im CA/L verwenden?
Eine Deklaration unter Globals --> Datentyp "DOTNET" ist nicht der richtige Weg?
Mir scheint, als wäre diese Anforderung im NAV eine echte Herausforderung. Was ich eigentlich nicht verstehe, weil das doch ein 0815-Konstrukt sein sollte....

Sorry, jetzt gehts in die Basics.... :-(

Re: ADO.NET und MySQL

9. Juni 2020 16:23

Ralph71 hat geschrieben:Eine Deklaration unter Globals --> Datentyp "DOTNET" ist nicht der richtige Weg?


naja - entweder global oder lokal...um deine Frage zu beantworten - doch so wäre die Vorgehensweise

Re: ADO.NET und MySQL

9. Juni 2020 16:26

Hallo,

Du kannst zwar keinen C# in NAV verwenden, aber die Dotnet- Komponenten in C/AL.

Und Ja, genau die Deklaration als DotNet- Variable (möglichst lokal) ist der Weg. Dann kannst du die Komponenten fast so benutzen wie in C#.

Das kann übrigens schon NAV5.0 :wink: Ich benutze das dort gerade in zwei Projekten mit dem Vorgänger COM.

Berücksichtige bitte auch, das du nicht direkt in NAV- Tabellen schreiben solltest, die nicht speziell für die Kommunikation mit dem externen System gedacht sind, da sonst evtl. nötige Geschäftslogik nicht ausgeführt wird.

Gruß Fiddi

Re: ADO.NET und MySQL

9. Juni 2020 16:27

Ralph71 hat geschrieben:Blöde Fragen:...

...gibt es nicht.

Ralph71 hat geschrieben:...Ich kann doch keinen C#-Code im CA/L verwenden?...

doch, indem du ... unter Globals --> Datentyp "DOTNET" verwendest.

Dazu brauchst du die entsprechenden Treiber (DLL's) und die enstprechenden Kenntnisse...

Ralph71 hat geschrieben:...jetzt gehts in die Basics.... :-(


Edit: fiddi war schneller...

Re: ADO.NET und MySQL

9. Juni 2020 16:28

Hier sind Links mit Beispielcode für Verbindungen zum MS SQL-Server.
https://www.erpsoftwareblog.com/2014/07 ... ts-part-2/
https://community.dynamics.com/nav/b/na ... rtc-in-nav
https://forum.mibuso.com/discussion/572 ... connection

Re: ADO.NET und MySQL

10. Juni 2020 11:43

Die Reaktionszeiten in diesem Forum sind wirklich gut. Ich bin beeindruckt. :-)

Danke für die Hinweise! Teile davon hab ich natürlich gefunden, konnte aber im ersten Schritt wenig damit anfangen.
Jetzt fehlt mir gedanklich noch die Verbindung vom NAV zum ADO.NET Driver. Den hab ich installiert und "da liegt er nun".
Im CA/L habe ich den "System.Data.SqlClient.SqlConnection.'System.Data, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' " verwendet. Jetzt stellt sich mir die Frage, ob dieser den ADO.NET Driver überhaupt anspricht. :?:

Re: ADO.NET und MySQL

10. Juni 2020 12:00

Hallo,

dafür benötigst du zunächst mal den installierten MySQL- ADO- Treiber,

und dann den passenden Connection-String für die Komponente SQLConnection. Ein Beispiel- Auswahl dafür findest du hier.

Es gibt dafür auch Tools, mit denen du den Connection String zusammenklicken und testen kannst. Ich habe aber gerade keines parat.

Gruß Fiddi

Re: ADO.NET und MySQL

10. Juni 2020 15:48

Das ist mir alles klar.
Dh die DOTNET-Variable findet den MySQL-ADO-Treiber. Dh aber auch: "System.Data.SqlClient.SqlConnection" ist die korrekte Funktion bzw Klasse. Richtig?
Die Seite für den Connection-String kenne ich natürlich. Die ersten Versuche haben bislang nicht funktioniert. Daher eben der Gedanke, ob der MySQL-ADO-Treiber über die "System.Data.SqlClient.SqlConnection" überhaupt angesprochen wird.

Re: ADO.NET und MySQL

10. Juni 2020 16:23

Hallo,

wenn das alles richtig installiert ist, sollte das funktionieren. Versuch es doch mal mit Excel oder einem der Config-Tools um eine Verbindung aufzubauen, so hab ich das auch gemacht.

Gruß Fiddi

Re: ADO.NET und MySQL

24. Juni 2020 09:08

Hallo,
langsam gebe ich auf.
Ich habe mich an den Ratschlag von fiddi gehalten, und über Excel versucht eine Verbindung aufzubauen. Ohne Erfolg

Aktueller Zustand:
Installation des ADO.NET-Treibers unter https://www.mysql.com/de/products/connector/ auf meiner lokalen Maschine
--> ich gehe davon aus, dass nun Windows diesen Treiber verwenden kann. Wird diese Art der Verbindung irgendwo angezeigt (analog: ich installiere einen ODBC-Treiber und der wird dann als Quelle in der ODBC -Verwaltung angeboten) ?
--> Wenn die Art der Verbindung angezeigt wird, wie heißt die Verbindung?

Aktuell versuche ich über den Povider "Microsoft OLE DB Provider for SQL Server" in Excel eine Verbindung herzustellen. Fehlermeldung: "Das Kennwort ist abgelaufen". Kann aber nicht sein, da ein Login auf den MySQL-Server über diesen Benutzer funktioniert.
--> Ist das der richtige?
--> Wenn nicht der richtige, welcher dann?

Versuche im NAV:
Variable mysqlverb als System.Data.OleDb.OleDbConnection.'System.Data, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' deklariert
Verbindungsstring: ConnectionString := 'PROVIDER=SQLOLEDB;SERVER=xxx.xxx.xxx.xxx;DATABASE=yyyyyyyyy;UID=user;PWD=1233454;
Code:
mysqlverb := mysqlverb.OleDbConnection(ConnectionString);
mysqlverb.Open;
Fehler: "Das Kennwort ist abgelaufen"
--> auch hier gehe ich davon aus, dass der Provider nicht korrekt ist.
--> auch hier die Frage, was durch die Installation des ADO.NET-Treibers vom NAV neu angezeigt werden muss.

Re: ADO.NET und MySQL

24. Juni 2020 11:42

Hallo,

evtl. ist diese Fehlermeldung zutreffend oder schlecht aus dem englischen übersetzt.

Manchmal ist keine Verbindung mit Klartext- Passwörtern erlaubt. Das könnte die Ursache für die Fehlermeldung sei.

Du könntest auch über "Systemsteuerung\Verwaltung\ODBC-Manager" versuchen eine Verbindung anzulegen, und dir den String von dort holen.

Gruß Fiddi

Re: ADO.NET und MySQL

24. Juni 2020 13:07

Hallo,

ich bitte höflichst um die Beantwortung meiner Fragen, damit ich mir das alles zusammenreimen kann. :-)

Danke!

Re: ADO.NET und MySQL

24. Juni 2020 13:13

Entschuldige bitte,

wenn ich ein wenig kurz angebunden bin, aber ich habe gerade ein wenig Stress mit der Mwst.- Umstellung zum 30.6. . :roll: :roll:

Daher meine Bitte, den Verbindungsaufbau noch mal mit dem ODBC- Tool zu versuchen (sollte auch für ADO funktionieren)

Gruß Fiddi

Re: ADO.NET und MySQL

24. Juni 2020 14:40

Ralph71 hat geschrieben:...Ich habe mich an den Ratschlag von fiddi gehalten, und über Excel versucht eine Verbindung aufzubauen. Ohne Erfolg...

Wenn das nicht funktioniert, dann kann wahrscheinlich auch NAV nichts aufbauen. Und wenn bei beiden die gleiche Fehlermeldung erscheint, dann wird die wohl richtig sein.

Re: ADO.NET und MySQL

25. Juni 2020 13:10

... der ODBC-Zugriff funktioniert mit dem gleichen Benutzer natürlich. Ich habe meine Hausaufgaben gemacht....
Daher nochmals meine Frage:
Ist "System.Data.OleDb.OleDbConnection.'System.Data, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' " jetzt die richtige Deklaration der Variablen?

[gelöst] Re: ADO.NET und MySQL

30. Juni 2020 11:53

Für alle, die das auch benötigen.
1. Installation des MySQL ADO.NET Treibers am NAV-Server --> https://www.mysql.com/de/products/connector/
2. in den Verweisen erscheint dann der MySQL.Data Eintrag
3. Variablen entsprechen setzen (zB MySql.Data.MySqlClient.MySqlConnection.'MySql.Data, Version=8.0.20.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d')
4. Über https://dev.mysql.com/doc/connector-net ... mming.html bzw. andere Webseiten kann man sichs dann zusammenbauen.

HTH

Re: [gelöst] ADO.NET und MySQL

11. August 2023 12:08

Als Ergänzung wann
  • System.Data.SQLClient
  • System.Data.ODBCClient
  • System.Data.OledbClient
verwendet werden können.
:greenarrow: When should I be using Odbc, OleDb, SQLClient? What are the trade-offs bzw. Quelle What is the difference between System.Data.SqlClient, System.Data.OledbClient and System.Data.OdbcClient for accessing sql data

Als neueste Möglichkeit für MSSQL ab SQL Server 2019 (v15): Einführung in den Namespace „Microsoft.Data.SqlClient“

Beispiel aus der Praxis für Zugriff auf MS SQL Server 2019.
Dotnet-Variablen
System.Data.SqlClient.SqlConnection.'System.Data, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'
System.Data.SqlClient.SqlCommand.'System.Data, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'
System.Data.SqlClient.SqlDataReader.'System.Data, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'
System.Data.SqlClient.SqlDataAdapter.'System.Data, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'
System.Data.SqlClient.SqlCommandBuilder.'System.Data, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'
System.Data.DataTable.'System.Data, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'
System.Data.DataSet.'System.Data, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'

Codefragmente dazu, ohne dabei in alle Details gehen :mrgreen: .
Code:
IF TrustedConnNoPassword THEN BEGIN
  ConnectionString := 'Data Source=' + ServerName+';'
   + 'Initial Catalog=' + DataBaseName + ';'
   + 'Trusted_Connection=True;';
END ELSE BEGIN
//Persist Security Info=false;User ID=*****;Password=*****;Initial Catalog=AdventureWorks;Server=MySqlServer;Encrypt=True
  ConnectionString := 'Persist Security Info=false' + ';'
   + 'User ID=' + MyUserID + ';'
   + 'Password=' + MyPassword + ';'
   + 'Initial Catalog=' + DataBaseName + ';'
   + 'Server=' + ServerName+';'
   + 'Encrypt=false'; // besser auf "true" wenn verfügbar
END;

// ggf. im ConnectionString anhängen
//";MultipleActiveResultSets=True"; // für MARS

CLEAR(SQLReader);
CLEAR(SQLCommand);
CLEAR(SQLConnection);

SQLConnection := SQLConnection.SqlConnection(ConnectionString);
SQLConnection.Open;
SQLCommand.CommandText := MySQLCommand; // die eigene SQL-Abfrage SELECT…FROM…WHERE…ORDER BY…
SQLCommand := SQLConnection.CreateCommand();
SQLReader := SQLCommand.ExecuteReader;

// Vorabprüfung, ob Datensätze vorhanden
IF NOT SQLReader.HasRows THEN BEGIN
  MESSAGE(NoRecordsFoundMsg);
  //Hier kein Clear !
  // In aufrufender Funktion sonst Fehlermeldung:
  //The conversion of a varchar data type to a datetime data type resulted in an out-of-range value.
  EXIT(FALSE);
END;
 
SQLReader.Close; // vor jedem neuen ExecuteReader immer den alten schließen
// Wenn Datensätze vorhanden sind
SQLReader := SQLCommand.ExecuteReader;
WHILE SQLReader.Read DO BEGIN
  // Felder der Abfrage nach Bedarf verarbeiten
  // und dabei die Feldreihenfolge im MySQLCommand beachten
  // je nach Feldtyp SQLReader.GetDouble(<NrInAbfrage>),
  //SQLReader.GetInt32(<NrInAbfrage>),SQLReader.GetString(<NrInAbfrage>) usw.
  // SQLReader.GetFloat(<NrInAbfrage>) führt u.U. zum Fehler,
  // auch wenn für das jeweilige Feld CONVERT(float,SQLTabellenname.SQLFeldname))
  // im MySQLCommand steht
END;
SQLReader.Close;
// nur falls man die braucht, für den SQLReader nicht erforderlich
// im DataAdapter könnte man im Gegensatz zum SQLReader auch schreiben
// falls nur gelesen werden soll, diese weglassen
SQLDataTable := SQLDataTable.DataTable;
SQLDataAdapter := SQLDataAdapter.SqlDataAdapter(SQLCommand);
SQLDataAdapter.Fill(SQLDataTable);

SQLCommand.Dispose;
SQLConnection.Close;
CLEAR(SQLReader);
CLEAR(SQLCommand);
CLEAR(SQLConnection);


Links dazu:
https://learn.microsoft.com/en-us/dotnet/framework/data/adonet/ado-net-overview
https://learn.microsoft.com/en-us/dotnet/framework/data/adonet/ado-net-datasets
https://learn.microsoft.com/en-us/dotnet/api/system.data.dataset?view=net-7.0
https://learn.microsoft.com/de-de/dotnet/api/system.data.sqlclient.sqlconnection?view=dotnet-plat-ext-7.0
https://learn.microsoft.com/en-us/dotnet/framework/data/adonet/sql/sqltypes-and-the-dataset