![]() |
Datenbank: MySQL • Version: 8 • Zugriff über: FireDac
JSONArray in Insert-Statement
Hallo Zusammen,
ich bin gerade an einer Client / Server App. Der Client schickt ein JSArray-String an den Server. Der Server soll diese Daten in eine MySQL-Tabelle schreiben. Ich habe gelesen, dass ich den JSON-String direkt dazu benutzen könne. Stimmt das? Ich habe es so versucht, wie ich es verstanden hatte, aber ohne Erfolg...
Delphi-Quellcode:
Bei diesem Versuch bekomme ich die Fehlermeldung:
INSERT INTO versand (bnumber, print_status, ship_date, ship_time, tnumber, vdienstl)
VALUES ( '[{"bnumber":"200026","print_status":"print_ok","ship_date":"2021.04.16","ship_time":"12:42:22","tnumber":"00346527107258","vdienstl":"(Standard-Versand)"}]' ) Column count doesn't match value count at Row 1 Kennt jemand diese Vorgehensweise oder kann mir jemand einen anderen Weg weisen, wie ich aus diesem String die Daten in eine MySQL-Tabelle bekomme? Vielen Dank Patrick |
AW: JSONArray in Insert-Statement
Du musst einfach die Feldliste weglassen. ;-)
Die steht ja schließlich im JSON Text drin.
Code:
INSERT INTO versand VALUES (
'{"bnumber":"200026","print_status":"print_ok","ship_date":"2021.04.16","ship_time":"12:42:22","tnumber":"00346527107258","vdienstl":"(Standard-Versand)"}' ) |
AW: JSONArray in Insert-Statement
Das wäre ja super, wenn das geht. Ich hatte bis heute noch nie etwas von der Möglichkeit gehört.
Ich habe es jetzt so versucht:
Delphi-Quellcode:
INSERT INTO versand VALUES (
'{ "bnumber":"200026", "print_status":"print_ok", "ship_date":"2021.04.16", "ship_time":"12:42:22", "tnumber":"003465271258", "vdienstl":"(Standard-Versand)" }' ) Aber leider bekomme ich dennoch die Fehlermeldung: Column count doesn't match value count at row 1 Ich habe es sorgfältig geprüft, dass die Felder alle da sind und das die Schreibweisen identisch sind. Ich sehe auch keine verfänglichen Schreibweisen in dem String. Hast Du noch eine Idee, was ich falsch machen könnte? Vielen Dank Patrick |
AW: JSONArray in Insert-Statement
Haben die Felder denn auch den Typ json?
// EDIT: Und ich habe gerade gelesen, dass es nur mit InnoDB als Speichersystem geht. Ob das so ist und noch stimmt, weiß ich nicht. |
AW: JSONArray in Insert-Statement
Die Engine ist InnoDB
Aber die Felder sind VARCHAR, Date und Time Felder... Ich habe auch mal eben eine Test-Tabelle angelegt, in der ich alle Datenfelder als JSON definiert habe, aber da bekomme ich die gleiche Fehlermeldung... Wie lösen andere das Thema. Ich wäre auch bereit, mit einem klassischen insert zu arbeiten, bekomme aber die Werte nicht aus dem JS_Array. In dem Beispiel ist es nur eine Zeile, es können aber beliebig viele sein... LG Patrick |
AW: JSONArray in Insert-Statement
Zitat:
Ansonsten findest du in der Unit System.JSON einiges um auf die Json-Objekte und -Arrays zuzugreifen, wenn du bei Bordmitteln bleiben möchtest. |
AW: JSONArray in Insert-Statement
Ich finde Superobject ganz praktisch, um JSON Arrays/Objekte zu verarbeiten.
Leicht verständlich und schnell erlernbar. |
AW: JSONArray in Insert-Statement
mORMot hat auch was nettes an bord für solche zwecke (_Json).
Bedienung ist kinderleicht solange der JSON inhalt fest vorgeschrieben ist (feldnamen oder wie man das nennt).
Delphi-Quellcode:
var
Ykcim: Variant; begin Ykcim := _Json(JSON_String); Writeln(Ykcim.bnumber); // 200026 Writeln(Ykcim.print_status); // print_ok Writeln(Ykcim.ship_date); // 2021.04.16 Writeln(Ykcim.ship_time); // 12:42:22 Writeln(Ykcim.tnumber); // 003465271258 Writeln(Ykcim.vdienstl); // (Standard-Versand) end. |
AW: JSONArray in Insert-Statement
mysql ist nicht so toll im Umgang mit json wie z.B. postgres, aber etwas kann es auch.
Vielleicht hilft Dir 'json_extract'
Code:
SELECT
JSON_EXTRACT('{"Name": "Bart", "Age": 10}', '$.Name') AS 'Result'; ![]() Es gibt noch einige weitere Funktionen für den Umgang mit Arrays und Array Aggregation. Wenn Dein json komplexter ist, muss der (oder die) "path" Parameter (hier $.name) entsprechend aufgebaut werden. |
AW: JSONArray in Insert-Statement
Hallo Zusammen,
ich habe die verschiedenen Vorschläge versucht umzusetzen und habe in diese Richtungen gelesen, was ich gefunden habe, aber bin irgendwie nicht zurande gekommen. Jetzt habe ich gerade noch einmal gesucht und ein Code gefunden, den ich umbauen konnte, mit dem es funktioniert...
Delphi-Quellcode:
Vielen Dank für die Unterstützung!
type
TRows = array of array of string; TCols = array of string; procedure TForm1.AdvGlowButton1Click(Sender: TObject); var JS_Array: TJSONArray; JS_Value: TJSONValue; Insert_String, Value_String: string; I, J: integer; Rows: TRows; Cols: TCols; begin SetLength(Cols, 6); SetLength(Rows, Length(Cols),0); Cols[0] := 'BNumber'; Cols[1] := 'Print_Status'; Cols[2] := 'Ship_Date'; Cols[3] := 'Ship_Time'; Cols[4] := 'TNumber'; Cols[5] := 'VDienstL'; JS_Array := TJSONArray.Create; try JS_Array := TJSONObject.ParseJSONValue(JS_ArrayString) as TJSONArray; I := 0; for JS_Value in JS_Array do begin SetLength(Rows, Length(Cols), Length(Rows[0])+1); for J := 0 to Length(Cols) -1 do begin Rows[J,I] := JS_Value.GetValue<string>(Cols[J]); end; INC(I); end; for I := 0 to Length(Rows[0]) -1 do begin if I=0 then begin Value_String := ''; end else begin Value_String := Value_String + ', '; end; Value_String := Value_String+ '('; for J := 0 to Length(Cols) -1 do begin if J=0 then begin Value_String := Value_String + QuotedStr(Rows[J,I]); end else begin Value_String := Value_String + ', ' + QuotedStr(Rows[J,I]); end; end; end; Insert_String := 'INSERT INTO versand (bnumber, print_status, ship_date, ship_time, tnumber, vdienstl) '+ 'VALUES '+Value_String; finally JS_Array.Free; end; Guten Nacht Patrick |
AW: JSONArray in Insert-Statement
Hier fehlt noch ein ')' am Ende jeder Datenzeile.
Für bessere Lesbarkeit könnte man die Datenzeilen zusätzlich mit Zeilenumbruch trennen (statt ', ' mit ',' + Zeilenumbruch). Auch das Zwischenspeichern in Rows[] könnte man wegoptimieren und direkt die Datenzeile bilden. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:19 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz