无法将反序列化的JObject转换为SQLiteCommand数据类型

时间:2019-08-29 09:46:11

标签: c# json deserialization

问题:我无法将反序列化的JObject转换或转换为数据类型为SQLiteCommand的变量。


我正在做的是:我想为我的应用程序进行两步更新。我的数据库是SQLite,所以没有存储过程。

  • 第一步是当前用户计算机/ PC上的本地版本(只能在此计算机上查看,尚未保存在主数据库中)。为了实现这一目标,程序将在不同的json文件中序列化用户要执行的所有待处理的sql查询(我已经成功完成了该查询)。

  • 当管理员批准这些更改时,查询将被反序列化,然后将被执行。现在数据库中已有更新,其他计算机也可以读取这些更改。 (这部分我没有成功)


代码:

// Serialize the query into a .json file
var jsonString = JsonConvert.SerializeObject(command);
...
// Get the SQLCommand to execute with a connection
var myObject = JsonConvert.DeserializeObject(jsonString);

// Exception occures in the next line
SQLiteCommand commandAgain = (SQLiteCommand)myObject;

jsonString

  • 文字字符串:

"{\"CommandText\":\"Update Tool Set WerkzeugName = $werkzeugname where Id = 2 \",\"CommandTimeout\":30,\"CommandType\":1,\"Connection\":null,\"Parameters\":[{\"Command\":null,\"IsNullable\":true,\"DbType\":16,\"Direction\":1,\"ParameterName\":\"$werkzeugname\",\"Size\":0,\"SourceColumn\":null,\"SourceColumnNullMapping\":false,\"SourceVersion\":512,\"Value\":\"qwe\",\"TypeName\":null,\"Precision\":0,\"Scale\":0}],\"Transaction\":null,\"UpdatedRowSource\":0,\"DesignTimeVisible\":true,\"Site\":null,\"Container\":null}"

  • 可读版本:
{
  "CommandText": "Update Tool Set WerkzeugName = $werkzeugname where Id = 2 ",
  "CommandTimeout": 30,
  "CommandType": 1,
  "Connection": null,
  "Parameters": [
    {
      "Command": null,
      "IsNullable": true,
      "DbType": 16,
      "Direction": 1,
      "ParameterName": "$werkzeugname",
      "Size": 0,
      "SourceColumn": null,
      "SourceColumnNullMapping": false,
      "SourceVersion": 512,
      "Value": "qwe",
      "TypeName": null,
      "Precision": 0,
      "Scale": 0
    }
  ],
  "Transaction": null,
  "UpdatedRowSource": 0,
  "DesignTimeVisible": true,
  "Site": null,
  "Container": null
}

myObject不为null。它的数据类型为System.Object。根据我在调试器中看到的数据,它具有正确的数据。


例外:System.InvalidCastException: The object of type" Newtonsoft.Json.Linq.JObject "can not be converted to type" System.Data.SQLite.SQLiteCommand ".


到目前为止我尝试过的事情:

using (StreamReader file = File.OpenText(PendingQueryFilePath))
{
    JsonSerializer serializer = new JsonSerializer();
    return (SQLiteCommand)serializer.Deserialize(file, typeof(SQLiteCommand));
}
// Not working because SQLiteCommand did not inherit needed Interface
var convert = Convert.ChangeType(myObject, typeof(SQLiteCommand));
// Return null
var convert = myObject as SQLiteCommand;

修改:

// Deliever same exception
var otherObject= (SQLiteCommand) JsonConvert.DeserializeObject(jsonString);
var otherObject= JsonConvert.DeserializeObject<SQLiteCommand>(jsonString);
var otherObject= (SQLiteCommand) JsonConvert.DeserializeObject<SQLiteCommand>(jsonString);

其他说明:

我成功地反序列化了我自己编写的其他类,但是没有使用SQLiteCommand。

using (StreamReader file = File.OpenText(ModifiedContentFilePath))
{
   JsonSerializer serializer = new JsonSerializer();
   return (MyClass)serializer.Deserialize(file, typeof(MyClass));
}

编辑2:

var test = (myObject as Newtonsoft.Json.Linq.JObject).ToObject<SQLiteCommand>();

This triggers following exception: 
System.InvalidCastException: The object of type" Newtonsoft.Json.Linq.JObject 
"can not be converted to type" System.Data.SQLite.SQLiteParameter".

最后编辑 要重现此错误,请复制此代码并在Visual Studio中运行。 Nuget中需要框架JSon.net和SQlite。 https://rextester.com/OBMA43154

解决方案:遵循@Chetan Ranpariya的建议。

0 个答案:

没有答案