问题:我无法将反序列化的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的建议。