Anweisung an MySQL - Wie verketten?

Für Themen zu Datenbanken und Zugriff auf diese. Auch für Datenbankkomponenten.
Antworten
thorsten
Beiträge: 5
Registriert: Do 1. Mär 2012, 22:48

Anweisung an MySQL - Wie verketten?

Beitrag von thorsten »

Hallo,

ich als unerfahrener Nicht-Programmierier habe mir unten stehenden DLL Code aus Schnippseln und Beispielen zusammen gebastelt:

Ziel des Aktion ist es, Daten aus den Zeigern DTA1 ... DTA4 in eine MySQL Datenbank, Tabelle = Wetter zu speichern. Für einen Test habe ich die Variable Writedb als PChar augeschrieben und es funktiniert, wie es soll. In einer nächsten Stufe möchte ich dann den PChar writedb aus zwei Variablen, epi1 und pro1, so zusammen setzten. Später sollen dann alle Fett markierten Parameter aus Variablen übergeben werden, um Daraus den Insert-String als PChar aufzubauen. Übrigens sind der Array PString^[xyz] bereits als PCHar definiert. Die Umformung in normale Strings (mit Rücktransfer) steht zur zeit nur drin, um die Strings besser verknüpfen zu könnnen - StrCat kann ja scheinbar nur zwei Strings verbinden....

Sobald ich aber die Zeile Auskommentiere bzw. den derzeitig Aktiven writedb:= "einkommentiere" und versuche, den String aus pro1 und epi1 zusammen zu setzen, funktioniert dies nicht mehr... und ich habe keine Idee, warum. Kann mir jemand helfen, bitte?

Besten Dank & Gruss
Thorsten

Code: Alles auswählen

Procedure CalculateEx(PInput,POutput,PUser: PDLLParams; PStrings: PStringParams); //called regularly from ProfiLab
 
VAR
  sock     : PMYSQL;
  qmysql   : TMYSQL;
  data1    : String;
  data2    : String;
  data3    : String;
  data4    : String;
  writedb  : PChar;
  pro1   : PChar = 'INSERT INTO Wetter (Lufttemperatur,Windgeschwindigkeit,Luftfeuchte,Niederschlag) Values(';
  epi1   : PChar = '4,7,30,33)';
 
 
begin
 
  if PInput^[CLK]<2.5 then //check CLK input HIGH or LOW
    begin
      if (PInput^[CLK]<2.5) and not(PUser^[CLK_old]<2.5) then //check out rising edge at CLK input
        begin
 
        data1:=strPas(PStrings^[DTA1]);
        data2:=strPas(PStrings^[DTA2]);
        data3:=strPas(PStrings^[DTA3]);
        data4:=strPas(PStrings^[DTA4]);
 
        // writedb:=strcat(pro1, epi1);
        writedb:= 'INSERT INTO [b]Wetter[/b] ([b]Lufttemperatur[/b],[b]Windgeschwindigkeit[/b],[b]Luftfeuchte[/b],[b]Niederschlag[/b]) Values([b]18[/b],[b]20[/b],[b]2[/b],[b]0[/b])';
 
 
        mysql_init(PMySQL(@qmysql));
        sock :=  mysql_real_connect(PMysql(@qmysql),PStrings^[SRV],PStrings^[USR],PStrings^[PWD],nil,0,nil,0);
        mysql_select_db(sock,PStrings^[DB]);
        mysql_query(sock,writedb);
        mysql_close(sock);
 
        end;
    end;
    PUser^[CLK_old]:=PInput^[CLK]; //Remember CLK status for next call
end;
 
//export methods for ProfiLab
exports NumInputs,
        NumOutputs,
        CalculateEx,
        InputName,
        OutputName;
 
begin
end.

Benutzeravatar
theo
Beiträge: 11007
Registriert: Mo 11. Sep 2006, 19:01

Re: Anweisung an MySQL - Wie verketten?

Beitrag von theo »

Was da schief läuft, kann ich nicht sagen. Aber versuch doch mal, zuerst mit String zu arbeiten und erst am Schluss zu casten, ist eh einfacher.

Code: Alles auswählen

{$H+} //AnsiString einschalten!
....
const
  pro1= 'INSERT INTO Wetter (Lufttemperatur,Windgeschwindigkeit,Luftfeuchte,Niederschlag) Values(';
var
  sock     : PMYSQL;
  epi1: String = '4,7,30,33)';
  writedb:String;
begin
  writedb:=pro1+epi1;
  mysql_query(sock,PChar(writedb));

DiBo33
Beiträge: 334
Registriert: Do 11. Okt 2007, 18:01

Re: Anweisung an MySQL - Wie verketten?

Beitrag von DiBo33 »

Wobei ich noch weiter gehen würde und die 4 Parameter mit Format einsetze.

Code: Alles auswählen

const
      pro1= 'INSERT INTO Wetter (Lufttemperatur,Windgeschwindigkeit,Luftfeuchte,Niederschlag) VALUES(%d,%d,%d,%d)';
    var
      sock     : PMYSQL;
     d1,d2,d3,d4: integer;
      writedb:String;
    begin
      d1:=4; ...
      writedb:=Format(pro1, [d1,d2,d3,d4]);
      mysql_query(sock,PChar(writedb));
oder noch besser sich mit parametisierte Abfragen beschäftigen.

thorsten
Beiträge: 5
Registriert: Do 1. Mär 2012, 22:48

Re: Anweisung an MySQL - Wie verketten?

Beitrag von thorsten »

Hallo,

danke für die Tipps, der Vorschlag über Format hat Funktioniert, meine kleine DLL ist dank Eurer Hilfe fertig.

Beste Grüsse
Thorsten

Bauer321
Beiträge: 465
Registriert: Sa 21. Aug 2010, 21:30
OS, Lazarus, FPC: Windows 7 Ultimate (L 1.2.2 FPC 2.6.4 32-bit)
CPU-Target: 64-Bit
Wohnort: nahe Bremen
Kontaktdaten:

Re: Anweisung an MySQL - Wie verketten?

Beitrag von Bauer321 »

evtl kann ein Bulk insert die Geschwindigkeit merkbar verbessern, da bei diesem mehrer Datensätze auf einmal "inserted" werden.
www.mcpatcher.net | www.hoeper.me

Antworten