# Error saving JSON to database

**URL:** <https://forum.inductiveautomation.com/t/error-saving-json-to-database/73988>\
**Category:** Ignition\
**Tags:** scripting\
**Created:** [May 20, 2023, 6:24pm UTC](https://forum.inductiveautomation.com/t/error-saving-json-to-database/73988 "2023-05-20T18:24:58Z")\
**Posts on this page:** 5\
**Page:** 1

<div class="post-metadata">

**Author:** ![Transistor](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/transistor/32/3380_2.png) [@Transistor](https://forum.inductiveautomation.com/u/Transistor)\
**Post date:** [May 20, 2023, 6:24pm UTC](https://forum.inductiveautomation.com/t/error-saving-json-to-database/73988/1 "2023-05-20T18:24:58Z")

</div>

I'm trying to save some configurations as JSON. I have one of the MySQL columns set as JSON datatype.  
This script works in MySqlWorkbench:

```auto
UPDATE db_os_manf_dashboard.config
SET configvalue = '{"One": 1, "Two": 2}'
WHERE id = 4;

```

This fails in Designer's Script Console:

```auto
outJSON = {"One": 3, "Two": 4}
x = system.db.runPrepUpdate("UPDATE config SET configvalue = '?' WHERE id = ?", [outJSON, 2])

```

> **Traceback**
>
> ```auto
> Java Traceback:
> Traceback (most recent call last):
> File "<input>", line 5, in <module>
> at com.inductiveautomation.ignition.common.script.builtin.AbstractDBUtilities.error(AbstractDBUtilities.java:392)
> at com.inductiveautomation.ignition.common.script.builtin.AbstractDBUtilities.runPrepUpdate(AbstractDBUtilities.java:268)
> at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
> at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
> at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
> at java.base/java.lang.reflect.Method.invoke(Unknown Source)
> java.lang.Exception: java.lang.Exception: Error executing system.db.runPrepUpdate(UPDATE config SET configvalue = '?' WHERE id = ?, [{'One': 3, 'Two': 4}, 2], , , false, false)
> 
> at org.python.core.Py.JavaError(Py.java:547)
> at com.inductiveautomation.ignition.common.script.builtin.AbstractDBUtilities.error(AbstractDBUtilities.java:392)
> at com.inductiveautomation.ignition.common.script.builtin.AbstractDBUtilities.runPrepUpdate(AbstractDBUtilities.java:268)
> at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
> at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
> at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
> at java.base/java.lang.reflect.Method.invoke(Unknown Source)
> at org.python.core.PyReflectedFunction. __call__ (PyReflectedFunction.java:190)
> at com.inductiveautomation.ignition.common.script.ScriptManager$ReflectedInstanceFunction. __call__ (ScriptManager.java:552)
> at org.python.core.PyObject. __call__ (PyObject.java:477)
> at org.python.core.PyObject. __call__ (PyObject.java:481)
> at org.python.pycode._pyx53.f$0(<input>:6)
> at org.python.pycode._pyx53.call_function(<input>)
> at org.python.core.PyTableCode.call(PyTableCode.java:173)
> at org.python.core.PyCode.call(PyCode.java:18)
> at org.python.core.Py.runCode(Py.java:1687)
> at org.python.core.Py.exec(Py.java:1731)
> at org.python.util.PythonInterpreter.exec(PythonInterpreter.java:277)
> at org.python.util.InteractiveInterpreter.runcode(InteractiveInterpreter.java:130)
> at com.inductiveautomation.ignition.designer.gui.tools.jythonconsole.JythonConsole$ConsoleWorker.doInBackground(JythonConsole.java:626)
> at com.inductiveautomation.ignition.designer.gui.tools.jythonconsole.JythonConsole$ConsoleWorker.doInBackground(JythonConsole.java:614)
> at java.desktop/javax.swing.SwingWorker$1.call(Unknown Source)
> at java.base/java.util.concurrent.FutureTask.run(Unknown Source)
> at java.desktop/javax.swing.SwingWorker.run(Unknown Source)
> at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
> at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
> at java.base/java.lang.Thread.run(Unknown Source)
> Caused by: java.lang.Exception: Error executing system.db.runPrepUpdate(UPDATE config SET configvalue = '?' WHERE id = ?, [{'One': 3, 'Two': 4}, 2], , , false, false)
> ... 26 more
> Caused by: com.inductiveautomation.ignition.client.gateway_interface.GatewayException: Unable to decode arguments
> at com.inductiveautomation.ignition.client.gateway_interface.GatewayInterface.newGatewayException(GatewayInterface.java:351)
> at com.inductiveautomation.ignition.client.gateway_interface.GatewayInterface.sendMessage(GatewayInterface.java:325)
> at com.inductiveautomation.ignition.client.gateway_interface.GatewayInterface.sendMessage(GatewayInterface.java:278)
> at com.inductiveautomation.ignition.client.script.ClientDBUtilities._runPrepStmt(ClientDBUtilities.java:288)
> at com.inductiveautomation.ignition.common.script.builtin.AbstractDBUtilities.runPrepUpdate(AbstractDBUtilities.java:261)
> ... 24 more
> Caused by: java.io.InvalidClassException: failed to read class descriptor
> at java.io.ObjectInputStream.readNonProxyDesc(null)
> at java.io.ObjectInputStream.readClassDesc(null)
> at java.io.ObjectInputStream.readOrdinaryObject(null)
> at java.io.ObjectInputStream.readObject0(null)
> at java.io.ObjectInputStream.readArray(null)
> at java.io.ObjectInputStream.readObject0(null)
> at java.io.ObjectInputStream.readObject(null)
> at java.io.ObjectInputStream.readObject(null)
> at com.inductiveautomation.ignition.common.Base64.decodeToObjectFragile(Base64.java:985)
> at com.inductiveautomation.ignition.gateway.servlets.gateway.functions.RunPrepStmt.runUpdateQuery(RunPrepStmt.java:43)
> at com.inductiveautomation.ignition.gateway.servlets.gateway.functions.AbstractUpdateQuery.run(AbstractUpdateQuery.java:25)
> at com.inductiveautomation.ignition.gateway.servlets.gateway.functions.AbstractDBAction.invoke(AbstractDBAction.java:66)
> at com.inductiveautomation.ignition.gateway.servlets.Gateway.doPost(Gateway.java:434)
> at javax.servlet.http.HttpServlet.service(HttpServlet.java:523)
> at javax.servlet.http.HttpServlet.service(HttpServlet.java:590)
> at com.inductiveautomation.ignition.gateway.bootstrap.MapServlet.service(MapServlet.java:86)
> at org.eclipse.jetty.servlet.ServletHolder$NotAsync.service(ServletHolder.java:1410)
> at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:764)
> at org.eclipse.jetty.servlet.ServletHandler$ChainEnd.doFilter(ServletHandler.java:1665)
> at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:527)
> at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:131)
> at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:578)
> at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:122)
> at org.eclipse.jetty.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:223)
> at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:1570)
> at org.eclipse.jetty.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:221)
> at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1383)
> at org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:176)
> at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:484)
> at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:1543)
> at org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:174)
> at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1305)
> at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:129)
> at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:122)
> at com.inductiveautomation.catapult.handlers.RemoteHostNameLookupHandler.handle(RemoteHostNameLookupHandler.java:121)
> at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:122)
> at org.eclipse.jetty.rewrite.handler.RewriteHandler.handle(RewriteHandler.java:301)
> at org.eclipse.jetty.server.handler.HandlerList.handle(HandlerList.java:51)
> at org.eclipse.jetty.server.handler.HandlerCollection.handle(HandlerCollection.java:141)
> at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:122)
> at org.eclipse.jetty.server.Server.handle(Server.java:563)
> at org.eclipse.jetty.server.HttpChannel.lambda$handle$0(HttpChannel.java:505)
> at org.eclipse.jetty.server.HttpChannel.dispatch(HttpChannel.java:762)
> at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:497)
> at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:282)
> at org.eclipse.jetty.io.AbstractConnection$ReadCallback.succeeded(AbstractConnection.java:314)
> at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:100)
> at org.eclipse.jetty.io.SelectableChannelEndPoint$1.run(SelectableChannelEndPoint.java:53)
> at org.eclipse.jetty.util.thread.strategy.AdaptiveExecutionStrategy.runTask(AdaptiveExecutionStrategy.java:416)
> at org.eclipse.jetty.util.thread.strategy.AdaptiveExecutionStrategy.consumeTask(AdaptiveExecutionStrategy.java:385)
> at org.eclipse.jetty.util.thread.strategy.AdaptiveExecutionStrategy.tryProduce(AdaptiveExecutionStrategy.java:272)
> at org.eclipse.jetty.util.thread.strategy.AdaptiveExecutionStrategy.lambda$new$0(AdaptiveExecutionStrategy.java:140)
> at org.eclipse.jetty.util.thread.ReservedThreadExecutor$ReservedThread.run(ReservedThreadExecutor.java:411)
> at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:934)
> at org.eclipse.jetty.util.thread.QueuedThreadPool$Runner.run(QueuedThreadPool.java:1078)
> at java.lang.Thread.run(null)
> Traceback (most recent call last):
> File "<input>", line 5, in <module>
> at com.inductiveautomation.ignition.common.script.builtin.AbstractDBUtilities.error(AbstractDBUtilities.java:392)
> at com.inductiveautomation.ignition.common.script.builtin.AbstractDBUtilities.runPrepUpdate(AbstractDBUtilities.java:268)
> at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
> at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
> at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
> at java.base/java.lang.reflect.Method.invoke(Unknown Source)
> java.lang.Exception: java.lang.Exception: Error executing system.db.runPrepUpdate(UPDATE config SET configvalue = '?' WHERE id = ?, [{'One': 3, 'Two': 4}, 2], , , false, false)
> 
> ```

Any ideas on the error?  
Any comments on the whole approach of saving configuration as JSON?

---

<div class="post-metadata">

**Author:** ![Kevin.Herron](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/kevin.herron/32/7259_2.png) [@Kevin.Herron](https://forum.inductiveautomation.com/u/Kevin.Herron)\
**Post date:** [May 20, 2023, 6:27pm UTC](https://forum.inductiveautomation.com/t/error-saving-json-to-database/73988/2 "2023-05-20T18:27:47Z")

</div>

Try using `system.util.jsonEncode` and passing the result of that to `runPrepUpdate`.

---

<div class="post-metadata">

**Author:** ![Transistor](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/transistor/32/3380_2.png) [@Transistor](https://forum.inductiveautomation.com/u/Transistor)\
**Post date:** [May 20, 2023, 6:57pm UTC](https://forum.inductiveautomation.com/t/error-saving-json-to-database/73988/3 "2023-05-20T18:57:10Z")

</div>

Thank you for the quick out-of-hours reply!

This seems to work.

```auto
jsonDict = {"One": 5, "Two": 6}
jsonEncoded = system.util.jsonEncode(jsonDict)
x = system.db.runPrepUpdate("UPDATE config SET configvalue = ? WHERE id = ?", [jsonEncoded, 2])

```

Now to see if I can get it back out!

---

<div class="post-metadata">

**Author:** ![pturmel](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/pturmel/32/3295_2.png) [@pturmel](https://forum.inductiveautomation.com/u/pturmel)\
**Post date:** [May 20, 2023, 7:28pm UTC](https://forum.inductiveautomation.com/t/error-saving-json-to-database/73988/4 "2023-05-20T19:28:51Z")

</div>

> [@Transistor](#):
>
> This seems to work.

I'm surprised. Question-mark placeholders (and colon-delimited placeholders in named queries) should never be quoted.

---

<div class="post-metadata">

**Author:** ![Transistor](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/transistor/32/3380_2.png) [@Transistor](https://forum.inductiveautomation.com/u/Transistor)\
**Post date:** [May 20, 2023, 7:46pm UTC](https://forum.inductiveautomation.com/t/error-saving-json-to-database/73988/5 "2023-05-20T19:46:57Z")

</div>

You are correct. I pasted it in before I finished the debug. I fixed the earlier post.  
Thanks again, Phil.
