Diskussion zum Artikel "SQLite: Natives Arbeiten mit SQL-Datenbanken in MQL5" - Seite 7

 
Renat Fatkhullin:

Morgen werden es 2840 in der Beta sein:

  • SQLite 2.35.2 Version

  • permanenter WAL-Modus, der es erlaubt, mit einer geöffneten Datenbank aus verschiedenen Anwendungen zu arbeiten (vorher konnte MetaEditor nicht parallel zum Terminal arbeiten).

Sehr zufrieden, danke
 
Edgar Akhmadeev:
Sehr zufrieden, danke

Beta 2840 ist verfügbar, bitte testen Sie sie.

 
Renat Fatkhullin:

Morgen werden es 2840 in der Beta sein:

  • SQLite 2.35.2 Version

  • permanenter WAL-Modus, der es erlaubt, mit einer geöffneten Datenbank aus verschiedenen Anwendungen zu arbeiten (vorher konnte MetaEditor nicht parallel zum Terminal arbeiten)

  • Erweiterung der statistischen Funktionen
    Beispiel:
  • neue mathematische Funktionen
  • JSON-Unterstützung ist ebenfalls enthalten

    Wir werden später den neuen json-Typ in den Datenbankerstellungsassistenten aufnehmen.



Renat, ich danke dir sehr!!!
Ich habe nicht erwartet, dass es so schnell geht, sehr erfreut))))))
 
fxsaber:

Wer es herausgefunden hat, zeige bitte die Umsetzung einer solchen Aufgabe.

  1. Es gibt zwei Terminals.
  2. Es ist notwendig, Echtzeit-Kurse eines Symbols von Terminal1 auf das entsprechende benutzerdefinierte Symbol von Terminal2 zu übertragen.
fxsaber:

Verstehe ich das richtig, dass im Rahmen dieser Aufgabe in beiden Fällen (beim Lesen der Basis auf Terminal2 und beim Schreiben auf die Basis in Terminal1) eine Blockierung durch den Transaktionsmechanismus erfolgen soll?

Wie kann man am einfachsten feststellen, dass die Datenbank aktualisiert wurde?

Grundlegend falsch. Sie beschreiben eine verteilte Client-Server-Anwendung mit einem Schema von 1 Schreiber, n Leser. Bei der Entwicklung solcher Systeme (und generell bei allen verteilten Systemen) sollten Sie versuchen, Sperren zu vermeiden, indem Sie sperrenfreie Methoden für die Datenorganisation und den Zugriff auf die Daten verwenden. Wenn die verwendete Technologie es nicht erlaubt, auf Sperren zu verzichten, dann ist sie vielleicht nicht die beste Lösung für Ihre Aufgabe. Für andere Aufgaben kann die Technologie jedoch großartig sein.
In Ihrem Fall ist es besser, einen vollwertigen Server einzusetzen (Sie können dies auf demselben Rechner wie der Client tun) und Angebote in die Nachrichtenwarteschlange zu schreiben, z. B. in Kafka. Der Client liest diese Zitate aus dem gewünschten Index. Dies ist ein sperrfreies Datenzugriffsschema.

fxsaber:

Es stellt sich also heraus, dass der Datenaustausch weniger Möglichkeiten hat als über Dateien?

Kategorisch nein. Die gemeinsame Nutzung von Dateien ist überhaupt nicht atomar, so dass Sperren sowohl auf der Leser- als auch auf der Schreiberseite erforderlich sind. Dies ist der sicherste Weg, um in eine Sackgasse zu geraten und sich in schwer zu findenden und unverständlichen Fehlern zu verlieren.

 
Vasiliy Sokolov:

Grundlegend falsch. Sie beschreiben eine verteilte Client-Server-Anwendung mit einem Schema von 1 Schreiber, n Leser. Bei der Entwicklung solcher Systeme (und generell bei allen verteilten Systemen) sollten Sie versuchen, Sperren zu vermeiden und sperrenfreie Verfahren für die Datenorganisation und den Zugriff auf die Daten zu verwenden. Wenn die verwendete Technologie es nicht erlaubt, auf Sperren zu verzichten, dann ist sie vielleicht nicht die beste Lösung für Ihre Aufgabe. Für andere Aufgaben kann die Technologie jedoch großartig sein.
In Ihrem Fall ist es besser, einen vollwertigen Server einzusetzen (Sie können dies auf demselben Rechner wie der Client tun) und Angebote in die Nachrichtenwarteschlange zu schreiben, z. B. in Kafka. Der Client liest diese Zitate aus dem gewünschten Index. Dies ist ein sperrfreies Datenzugriffsschema.

Kategorisch nein. Die gemeinsame Nutzung von Dateien ist in keiner Weise atomar, so dass Sperren sowohl auf der Leser- als auch auf der Schreiberseite erforderlich sind. Dies ist der sicherste Weg, um in eine Sackgasse zu geraten und sich in schwer zu erkennenden und unverständlichen Fehlern zu verlieren.

Vielen Dank für diese ausführliche Antwort! Leider habe ich völlig vergessen, welches Problem ich zu diesem Zeitpunkt gelöst habe. Deshalb kann ich meine Gedanken zu diesem Thema nicht teilen.

 
Renat Fatkhullin:

Beta 2840 ist verfügbar, bitte testen Sie sie.

Renat, guten Morgen!

Ich habe auch ein Problem in StringFormat bemerkt, wenn ein ziemlich großer Eingabestring von Daten darin platziert wird, z.B. aus einer Ressourcendatei mit 3-4 Anweisungen, z.B. %d, %s, %lld, %s, ich habe mehrere Ersetzungsvarianten geprüft, es handelt sich nur um ein großes Volumen, das in der Funktion besucht wird, was zu Fehler 4003 führt

Ich bin vorübergehend auf die Funktion StringReplace in Projekten umgestiegen, sie funktioniert bei großen Daten in der Eingabezeichenkette korrekt.
 
Gelernt, danke fürs Teilen.
 
In the DataBasePrepare file there is some mistake. I would replace the "pair" by string is that right?
 

Fragen zu dieser Lösung

- Gibt es Probleme, wenn mehrere EAs gleichzeitig dieselbe Sqlite-Datenbank verwenden?

- Können bei einem Absturz des MT5 einige Daten verloren gehen? Wie oft werden Daten auf die Festplatte geschrieben?

 

Guten Tag, liebe Entwickler!

Die Funktion "DatabaseExport" will in keiner Weise funktionieren...sie gibt den Fehler 5601 (Abfrageausführungsfehler, aber ich führe die Abfrage nicht aus), wenn ich den Tabellennamen in den Parametern angebe,

und wenn ich die SQL-Abfrage angebe, gibt sie den Fehler 4022 (Abbruch der Programmausführung), wahrscheinlich ein Fehler innerhalb der MQL-Funktion, ein Teil des Codes aus meiner Bibliothek:


//+------------------------------------------------------------------+
void CSQLite::DataBaseToFile(void)
  {
   uint flags=DATABASE_EXPORT_COMMON_FOLDER | DATABASE_EXPORT_QUOTED_STRINGS;

   long count_rows=0;

   string tables[],
          file_name,
          separator=";",
          query="SELECT name FROM sqlite_master WHERE tbl_name <> 'sqlite_sequence' AND type='table'";

   int total=GetValuesFromDataBase(query,tables); // ТУТ ВСЕ ОК, СПИСОК ТАБЛИЦ ИЗ БАЗЫ ПОЛУЧЕН.

   if(m_handle==NULL)
      Open();

   for(int i=0; i<total; i++)
     {
      file_name=StringFormat("%s.%s",m_name,tables[i]);
      count_rows=DatabaseExport(m_handle,tables[i],file_name,flags,separator); // ОШИБКА ПОСЛЕ ВЫПОЛНЕНИЯ ДАННОЙ ФУНКЦИИ
      Print(StringFormat("Export file: %s, rows: %lld",file_name,count_rows));

      if(count_rows<0)
         Print("DB: ", m_name,", Table: ",tables[i], ", Import failed with code ", GetLastError());
      else
         if(count_rows>0)
            Print(StringFormat("Import file: %s, rows: %lld",file_name,count_rows));
     }

   Finalize();
  }
//+------------------------------------------------------------------+