MySQL an MQ4 anbinden - Seite 5

 
sergeev:

Ja, alles funktioniert perfekt, aber bis jetzt habe ich es nur für MQL5 gemacht

ein Beispiel dafür, wie es funktioniert, siehe oben in meinem Beitrag


Können Sie mir ein Stück Code in Bezug auf mysql_fetch_row senden, es ist nicht klar, aus Ihrem Beispiel, wie man Zellen zu holen, wenn das Ergebnis besteht aus mehreren Zeilen und Spalten.
 
Graff:

Können Sie ein Stück Code bezüglich mysql_fetch_row senden, es ist nicht klar aus Ihrem Beispiel, wie man Zellen erhält, wenn das Ergebnis aus mehreren Zeilen und Spalten besteht.

in ähnlicher Weise.

1. nehmen Sie mysql_num_rows, mysql_num_fields

2. einen Zeiger auf ein Array von Zeigern auf die nächste Zeichenkette mysql_fetch_row, und einen Zeiger auf Feldlängen mysql_fetch_lengths erhalten

3. Wir ziehen diese Längen aus dem Längen-Array in unser eigenes Array (via memcpy).

4. aus einem Zeiger auf ein Array von Feldzeigern, ziehen Sie dieses Array von Feldzeigern (da wir mysql_num_fields kennen).

5. Mit der Kenntnis der Feldlängen (Array der Längen aus fetch_lengths) und den Zeigern auf die Felder selbst ziehen wir die Daten mit memcpy in das uchar-Array jedes Feldes

6. Gehen Sie zurück zu Schritt 2.

 
HIDDEN:
Ich habe es in beide Richtungen gedreht und gewendet, nichts hat bei mir bei 4 funktioniert. Manchmal stürzt das Terminal sogar komplett ab.

Kirill, in MQL4 funktioniert alles, ich habe es mit dem Build 409 getestet.

Hier ein Beispiel, um eine Zeichenkette zu erhalten

#import "libmysql.dll"
    int mysql_get_client_info(); // функция вернула char*
#import "msvcrt.dll"
    int strcpy(string strDestination, int strSource); // копируем NULL-строку из source в байтовый массив 
#import

void start()
{
    int ptr; string data="123456789"; 
    ptr=mysql_get_client_info(); // получили указатель на строку
    strcpy(data, ptr); // скопировали его в массив
    Print("client_info="+data); // вывели на печать
}

Ergebnis
!sql USDCHF,M30: client_info=6.0.0

dasselbe für ein ganzzahliges Array
ersetzen durch

    int strcpy(int &strDestination[], int strSource); // копируем NULL-строку из source в байтовый массив 
 
sergeev:

Kirill, alles funktioniert in MQL4, ich habe es mit Build 409 getestet.

Hier ist ein Beispiel, um die Zeichenkette zu erhalten

Ergebnis
!sql USDCHF,M30: client_info=6.0.0

dasselbe, wenn Sie es für ein Array tun
ersetzen durch

Ich habe das gleiche Build, aber mein Terminal stürzt ab.... Ich muss es an verschiedenen Terminals von verschiedenen Maklerfirmen ausprobieren.

Obwohl es vom System abhängen kann, teste ich mit Win7 x64.

 

HIDDEN:


xp/32

Suchen Sie dann die verschiedenen Anrufoptionen heraus und wenden Sie sich wegen des Fehlers an den Service Desk.

Vielleicht können sie uns beraten, was wir tun sollen.

 
sergeev:

in ähnlicher Weise.

1. nehmen Sie mysql_num_rows, mysql_num_fields

2. einen Zeiger auf ein Array von Zeigern auf die nächste Zeichenkette mysql_fetch_row, und einen Zeiger auf Feldlängen mysql_fetch_lengths erhalten

3. Wir ziehen diese Längen aus dem Längen-Array in unser eigenes Array (via memcpy).

4. aus einem Zeiger auf ein Array von Feldzeigern, ziehen Sie dieses Array von Feldzeigern (da wir mysql_num_fields kennen).

5. Mit der Kenntnis der Feldlängen (Array der Längen aus fetch_lengths) und den Zeigern auf die Felder selbst ziehen wir die Daten mit memcpy in das uchar-Array jedes Feldes

6. zurück zu Schritt 2.



Fast fertig. In diesem Stadium können wir nur die erste Zelle jeder Zeile abrufen. memcpy kopiert aus irgendeinem Grund nur das erste Element in meine Arrays. Das hat mir einen ganzen Abend geraubt. Was mache ich falsch?

Quelle, Speicherauszug, Protokoll im Anhang.

Dateien:
 
Graff:


Ich habe es fast geschafft. In diesem Stadium kann ich nur die erste Zelle jeder Zeile abrufen. memcpy kopiert aus irgendeinem Grund nur das erste Element in meine Arrays. Das hat mir einen ganzen Abend geraubt. Was mache ich falsch?

Quellcode, Dump, Protokoll im Anhang.


es gibt Kommentare

(1) Es besteht keine Notwendigkeit, UNICODE2ANSI-Funktionen zu verwenden. Zu diesem Zweck gibt es CharArrayToStr und ShortArrayToStr.

2. ich habe nicht versucht, String in der Funktion strcpy(string strDestination, int strSource); zu verwenden, alles wurde über Arrays durchgeführt. Wenn Sie wissen, was Sie aus der UTF-Kodierung kopieren, ist es besser, die Daten in einem kurzen Array zu speichern.

3. hier liegt ein technischer Fehler vor (deshalb geht alles schief)
memcpy(alens,lens,num_fields);

Es handelt sich nicht um ein Ein-Byte-Array wie uchar. Ich brauche memcpy(alens,lens,num_fields*sizeof(int));

 
sergeev:

es gibt Kommentare

(1) Die Verwendung der UNICODE2ANSI-Funktionen ist überhaupt nicht erforderlich. Zu diesem Zweck gibt es CharArrayToStr und ShortArrayToStr.

2. ich habe nicht versucht, String in der Funktion strcpy(string strDestination, int strSource); zu verwenden, alles wird über Arrays durchgeführt. Wenn Sie wissen, was Sie aus der UTF-Kodierung kopieren, ist es besser, die Daten in einem kurzen Array zu speichern.

3. hier liegt ein technischer Fehler vor (der alles zum Scheitern bringt)
memcpy(alens,lens,num_fields);

Es handelt sich nicht um ein Ein-Byte-Array wie uchar. Sie benötigen memcpy(alens,lens,num_fields*sizeof(int));



Ich danke Ihnen! Es klappt. Planen Sie, eine Klasse oder Bibliothek für die Arbeit mit dem Muskel zu veröffentlichen?
 
Graff:

Ich danke Ihnen! Es klappt. Irgendwelche Pläne zur Veröffentlichung einer Klasse oder Bibliothek für die Arbeit mit musl?

Wenn es nötig ist, kann ich das tun. Ich muss nur nicht erklären, was bereits klar ist...

Es gibt nur 50 Funktionen in dieser libmysql...

und die meisten davon sind reine Servicefunktionen. Von den Dutzenden, die Sie brauchen.

--------

Wie stellen Sie sich diese Klasse oder Bibliothek eigentlich vor? Welche Funktionen sollte sie haben?

Machen Sie einfach Duplikate von API-Funktionen, oder packen Sie einige Aktionssätze in eine Funktion?

 
sergeev:

Wenn es nötig ist, kann ich das tun. Ich muss nur nicht erklären, was bereits klar ist...

Es gibt nur 50 Funktionen in dieser libmysql...

Die meisten von ihnen sind reine Dienstleistungsfunktionen. Zehn von ihnen sind für die Arbeit unerlässlich.

--------

Wie stellen Sie sich diese Klasse oder Bibliothek im Allgemeinen vor? Welche Funktionen sollte sie haben?



Ich glaube, dass es nicht ausreicht, nur die Funktionen von libmysql.dll zu beschreiben. Die Klasse muss es dem Benutzer ermöglichen, einfach und mühelos mit der Datenbank zu arbeiten.

Beispiel 1: DB-Verbindung. Um über meine Squishy-Klasse eine Verbindung zur Datenbank herzustellen, muss der Klassenkonstruktor aufgerufen werden, obwohl innerhalb der Klasse eine ganze Reihe von Aktionen stattfindet, von denen man nicht immer wissen muss und will.

CMYSQL2::CMYSQL2(const string host="localhost",const string user="root",const string password="",const string database="database",const uint port=3306)
  {
   uchar _host[],_user[],_password[],_database[],_socket[];
   StringToCharArray(host,_host);
   StringToCharArray(user,_user);
   StringToCharArray(password,_password);
   StringToCharArray(database,_database);
// Connecting
   mysql=mysql_init(NULL);
   uint conn=mysql_real_connect(mysql,_host,_user,_password,_database,port,_socket,0);
   if(mysql==NULL || conn==NULL || mysql!=conn){ Print(__FUNCTION__,"-> MySQL connetion failure.");}
  }

Beispiel 2: Erhalten eines mehrzeiligen und mehrspaltigen Ergebnisses. Der Benutzer muss lediglich die Abfrage und ein Array (Struktur) eingeben, um das Ergebnis zu schreiben.

//+------------------------------------------------------------------+
//|  Returns string array as sql_results struct param and rows count
//+------------------------------------------------------------------+
uint CMYSQL2::GetArray(string query,sql_results &out[])
  {
   Query2(query);
   StoreResult();
   uint rows=GetNumRows();
   uint fields=GetNumFields();
   ArrayResize(out,rows);

   for(uint r=0;r<rows;r++)
     {
      ArrayResize(out[r].value,fields);
      string fr_res=mysql_fetch_row(result);
      
      for(uint f=0;f<fields;f++)
        {
         out[r].value[f]=get_cell_u(fr_res,f);//Print("3,",f,",",fields);
        }
     }
   FreeLastResult();
   return(rows);
  }

^ Das ist alter Code, nur um eine Vorstellung zu bekommen.

Es könnte auch viele Beispiele dafür geben, wie man der Datenbank Informationen hinzufügen kann.

Wenn Sie nur eine Reihe von Funktionen ohne Prüfungen verwenden, ist es sehr einfach, eine Zugriffsverletzung beim Lesen von 0x00000000 in 'libmysql.dll' zu erhalten und das gesamte System zum Absturz zu bringen.

Sie sind bereit, die Möglichkeit zu prüfen, eine offene Klasse für die Arbeit mit dem Muskel zu schaffen.